Android: Automatisierter Mailversand mit Tasker

Tasker ist für mich von je her die Android App schlecht hin! Es gibt so gut wie nichts, was man nicht mit Tasker automatisieren kann.

Eine Kleinigkeit störte mich bisher aber schon:

Aufgrund der Android Sicherheitsrichtlinien kann man über Tasker selber keine automatisierten Mails verschicken. Man kann sie zwar erstellen („Compose“), aber abschicken muss man sie noch selber.

Aber auch hierfür gibt es Möglichkeiten. :-)

Hier gibt es ein sehr gutes Tutorial (nicht für Tasker Einsteiger geeignet):

http://tasker.wikidot.com/sendemail

Das Tutorial habe ich mal durchgearbeitet und das Resultat funktioniert einwandfrei.

Was mich allerdings an der Vorgehensweise störte war, dass ich danach ein python Skript auf der SD Karte liegen hatte, welches meine Zugangsdaten zu meinem Mailaccount beinhaltete. Nicht unbedingt schön…

Da ich mich aber sowieso mal mit python auseinander setzen wollte, habe ich das bestehende Skript genommen und ein wenig umgeschrieben.

In meiner Version sind nun keine persönlichen Daten mehr im Skript enthalten, sondern werden komplett alle Variablen von „aussen“ über die Konfigurationsdatei gesetzt. Das Vorgehen ist das gleiche wie im o.g. Tutorial, also:

  • Task erstellen welche die Konfigdatei anlegt.
  • Task erstellen welche die Konfigdatei einliest, die Mail verschickt und die Konfigdatei wieder löscht.

Nochmal kurz zusammengefasst was ihr alles braucht:

  • Android Scripting Environment: Gibt es nicht im Market sondern hier
  • Den dazugehörigen Python Interpreter: Ebenfalls nicht im Market sondern hier
  • Und natürlich Tasker und root Rechte auf eurem Gerät :-)

Wie gesagt, das eigentliche Tutorial könnt ihr so durchgehen wie hier beschrieben.

Nur eure Konfigdatei müsste so aussehen:

smtp_server: URL_VON_EUREM_SMTP_SERVER
smtp_port: PORT_VON_EUREM_SMTP_SERVER
mailfrom: ABSENDER_MAIL_ADRESSE
username: BENUTZERNAME_FUER_EUREN_SMTP_SERVER
password: PASSWORT_FUER_EUREN_SMTP_SERVER
friendlyname: ABSENDER_NAME
mailto: EMPFAENGER_MAIL_ADRESSE
subject: TITEL
body:
EUER_MAIL_TEXT

Und hier die geänderte Version des python Skriptes:

#!/usr/bin/python
# sendemail.pl - Sends email based on a conf file or arguments

# Sends the actual email!
def sendemail(smtp_server,smtp_port,mailfrom,username,password,friendlyname,mailto,subject,body):
    import smtplib
    # Build an SMTP compatible message from arguments
    msg = "From: " + friendlyname + " <" + mailfrom + ">\n"
    msg += "To: " + mailto + "\n"
    msg += "Subject: " + subject + "\n"
    msg += body
    
    # Attempt to connect and send the email!
    try:
        smtpObj = '' # Declare within this block.
        # Check for SMTP over SSL by port number and connect accordingly
        if( smtp_port == 465):
            smtpObj = smtplib.SMTP_SSL(smtp_server,smtp_port)
        else:
            smtpObj = smtplib.SMTP(smtp_server,smtp_port)
            smtpObj.ehlo()
        # StartTLS if using the default TLS port number
        if(smtp_port == 587):
            smtpObj.starttls()
            smtpObj.ehlo
        # Login, send and close the connection.
        smtpObj.login(username,password)
        smtpObj.sendmail(mailfrom,mailto,msg)
        smtpObj.close()
        return 1  # Return 1 to denote success!
    except Exception, err:
        # Print error and return 0 on failure.
        print err
        return 0

import re,sys,os.path

# Declare variables...
conf_file='/mnt/emmc/Tasker/taskermail.conf'
smtp_server = ''
smtp_port = ''
mailfrom = ''
username = ''
password = ''
friendlyname = ''
mailto = ''
subject = ''
body = ''

if (len(sys.argv) == 2):
    
    conf_file = sys.argv[1]


# Process conf file if specified
if conf_file:
    if not os.path.isfile(conf_file):
        # Print out error and usage if specified conf file not found
        print "Unable to find file " + conf_file + "\n"        
        sys.exit(1)
    else:
        # Otherwise, read the file in and start processing!
        filein = open(str(conf_file),'r')
        mailconf = filein.read()
        # Read the SMTP Server URL
        smtpserverre = re.compile('^smtp_server: (.+)$',re.M)
        m = smtpserverre.search(mailconf)
        if(m):
            smtp_server = m.group(1)
        else:
            print "smtp_server value is not present"
            sys.exit(1)            

        # Read the SMTP Port Number    
        smtpportre = re.compile('^smtp_port: (.+)$',re.M)
        m = smtpportre.search(mailconf)
        if(m):
            smtp_port = m.group(1)
        else:
            print "smtp_port value is not present"
            sys.exit(1)            
    
        # Read the Username    
        usernamere = re.compile('^username: (.+)$',re.M)
        m = usernamere.search(mailconf)
        if(m):
            username = m.group(1)
        else:
            print "username value is not present"
            sys.exit(1)            
    
        # Read the Password    
        passwordre = re.compile('^password: (.+)$',re.M)
        m = passwordre.search(mailconf)
        if(m):
            password = m.group(1)
        else:
            print "password value is not present"
            sys.exit(1)            

        # Read the Friendlyname
        friendlynamere = re.compile('^friendlyname: (.+)$',re.M)
        m = friendlynamere.search(mailconf)
        if(m):
            friendlyname = m.group(1)
        else:
            print "friendlyname value is not present"
            sys.exit(1)            
    
        # Check for valid email address in mailfrom field
        re1 = '^mailfrom: '
        re2 = '(.+@.+\..+)'
        re3 = '$'
        mailfromre = re.compile(re1+re2+re3,re.M)
        m = mailfromre.search(mailconf)
        if(m):
            mailfrom = m.group(1)
        else:
            print "mailfrom value is not present"
            sys.exit(1)            
    
        # Check for valid email address in mailto field
        re1 = '^mailto: '
        re2 = '(.+@.+\..+)'
        re3 = '$'
        mailre = re.compile(re1+re2+re3,re.M)
        m = mailre.search(mailconf)
        if(m):
            mailto = m.group(1)
        else:
            print "mailto value is not present"
            sys.exit(1)            
    
        # Grab subject from subject field...
        subjectre = re.compile('^subject: (.+)$',re.M)
        m = subjectre.search(mailconf)
        if(m):
            subject = m.group(1)
        else:
            print "subject value is not present"
            sys.exit(1)            
    
        # And finally process the message body.
        bodyre = re.compile("body:\n(.+)", re.S)
        m = bodyre.search(mailconf)
        if(m):
            body = m.group(1)
        else:
            print "body value is not present"
            sys.exit(1)            

        
        # Send email if all values set!
if (sendemail(smtp_server,smtp_port,mailfrom,username,password,friendlyname,mailto,subject,body)):
    print "Email sent successfully!"
    sys.exit(0)
else:
    # Exit with error if email is not sent successfully
    print "Failed to send email! Check your login details and connection!"
    sys.exit(1)

Flattr this!

Griffith Filmverwaltung unter Fedora / Sabayon

Für die Verwaltung meiner DVDs und Blurays nutze ich die Software Griffith.

Wer auf der Suche nach einer vernünftigen Verwaltungssoftware ist, sollte sich Griffith einmal anschauen, da es sehr übersichtlich ist und eine ganze Menge nette Features bietet.

Für mich persönlich ist vor allem interessant, dass die Daten optional in eine mysql Datenbank (Default ist SQLite)) geschrieben werden können. Diese läuft auf meinem NAS und somit habe ich die Datenbank direkt in meinen täglichen Backups mit drin und
kann von allen Rechnern die gleiche DB nutzen.

Unter Ubuntu lässt sich die Software einfach installieren und vor allem auch direkt nutzen.

In den Fedora Quellen gibt es Griffith auch, allerdings muss für die Nutzung einer mysql Datenbank noch etwas nachinstalliert werden. Hier werden scheinbar nicht alle Abhängigkeiten bei der Griffith Installation aufgelöst… Es war leider auch nicht ganz einfach dahinter zu kommen, da der Debug Parameter beim Start von griffith nicht mehr ausgewertet wird (früher: Konsole->griffith –debug).

Nach längerem ausprobieren bin ich nun auf die Lösung gekommen:

Griffith ist in Python geschrieben. Damit Griffith mit einer MySQL Datenbank reden kann muss folgendes Paket unter Fedora nachinstalliert werden.

yum install MySQL-python

Auf Groß.- und Kleinschreibung ist zu achten.

Danach mag Griffith auch wieder mit einer MySQL DB reden. :-)

Update:

Unter Sabayon bin ich auf das gleiche Problem
gestoßen… Das Paket heisst hier allerdings: mysql-python, also:

sudo emerge mysql-python

Flattr this!