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!

WordPress Blogposts via Mail und Android Tasker

Das man seinen WordPress Blog auch von unterwegs via Mail mit Posts füttern kann ist ja soweit erstmal nichts neues.

Einfach unter Einstellungen (Schreiben) einen, eigens für Worpress eingerichteten, Mail Account eintragen. Damit kann man
dann Mails an diese Adresse schicken, welche dann in den Blog übertragen werden.

Das allerdings die Mails nicht automatisch in Blogposts überführt werden ist auch kein Geheimnis. Dies geschieht nur über den Aufruf folgender URL:

http://adresse_des_blogs/wp-mail.php

Im Netz gibt es auch einige Beispiele wie man dies mit Linux Bordmitteln automatisieren kann (Cronjob erstellen, welcher nach definierten Zeitintervallen mittels wget die URL aufruft).
Der Nachteil hierbei ist, dass halt der Rechner laufen muss um den Job zu starten.

Die zumindest für mich bessere Lösung ist dies über ein Gerät zu erledigen, welches eingentlich immer online ist… naja ausser ich schlafe und dann schreibe ich auch keine Posts per Mail. :-)

Ich meine mein Android Handy.

Was man dafür braucht ist zum einen Tasker und zum anderen das Locale Execute Plug-In. Auch wenn das Plugin zwar für Locale geschrieben wurde, funktioniert es dennoch ohne Probleme auch mit Tasker.

Über dieses Plugin hat man die Möglichkeit automatisiert Linux Befehle abzusetzen. Wenn man sein Smartphone gerootet hat sogar mit su.

In Tasker legt man sich nun ein Zeitprofil an, welches in regelmäßigen Abständen eine Task ausführt. Danach legt man eine Task an die nichts weiter macht als über das Execute Plugin folgendes Kommando auszuführen:

wget -q -O /dev/null http://adresse_des_blogs/wp-mail.php

Das wars! Somit werden je nach eingestellter Zeit im Tasker Profil die Mails in den Blog übertragen.

Für die Leute, welche noch nicht so fit in Sachen Tasker sind, habe ich das Profil als XML angehängt. Dieses kann einfach über Tasker importiert werden. Im XML muss allerdings noch die URL des eigenen Blogs eingetragen werden. Das
genannte Locale Execute PlugIn muss natürlich auch installiert sein.

Hier das XML (Bitte beim Speichern die Dateiendung von txt auf xml ändern)

WordPressUpdate

Flattr this!