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!

Android: Sehr gutes Tutorial für Tasker

Seit einiger Zeit gibt es einen sehr
guten Blog, welcher sich rund um das Thema „Automatisierung mit Tasker“ beschäftigt.

Egal ob Tutorials, Profile oder Erklärungen. Im Blog gibt es einige nützliche Informationen.

Der Grund warum ich nun doch einmal explizit auf den Blog hinweisen möchte, ist der Beginn einer Tutorial Reihe, welche sich auch insbesondere an Tasker Einsteiger richtet.

Hier geht es zum Blog: http://tasker-skripte.blogspot.com/

Schaut mal vorbei, es lohnt sich.

 

 

Flattr this!

Android: Neue Version von Tasker mit überarbeitetem UI und Variablen Anzeige

Seit Anfang der Woche gibt es seit längerer Zeit endlich mal wieder ein Update zur Automatisierungs-App Tasker. Wie ich schon öfter geschrieben habe, kann ich mir ein Android Smartphone ohne Tasker nicht vorstellen. :-)

Ich habe mir das Update zwar noch nicht bis ins Detail angeschaut, aber was auf jeden Fall ins Auge sticht ist ein überarbeitetes UI. Sieht deutlich schicker aus als vorher.

Absolut genial ist allerdings, dass man sich nun zur Laufzeit den Status bzw. die Werte von Variablen anschauen kann. Gerade der Umgang mit Variablen ist in Tasker nicht unbedingt trivial. Nun kann man sich aber per Knopfdruck alle selbst definierten Variablen anschauen und erkennt direkt welche Werte zur Zeit gesetzt sind. Genauso kann man die Werte direkt überschreiben umso wesentlich einfacher einzelne Tasks zu testen. Klasse!!!

Seit heute gibt es noch ein weiteres Update mit ein paar Bugfixes.
n
Hier geht es zu den Release Notes der beiden Updates: Release Notes Tasker

 

Hatte ich schon erwähnt, dass Tasker DIE MustHave App überhaupt ist? 😉

Flattr this!

Eigenes GPS Tracking mit Tasker und Taggen von Bildern

Für unseren Urlaub nach Sardinien habe ich mir bewusst keine italienische
SIM Karte gekauft und mich auch nicht über offene WLAN Netze vor Ort informiert. Der Urlaub sollte komplett unplugged ablaufen. :-)

Allerdings zwei Vorraussetzungen mussten dennoch erfüllt sein:

1. Ich wollte nach dem Urlaub genau wissen wo wir überall waren

2. Sämtliche Urlaubsbilder sollten mit GPS Koordinaten versehen werden

Für den ersten Punkt gibt es genug Software im Android Market wie zum Beispiel MyTracks. MyTracks ist eine sehr gute Software zum Tracken von Spaziergängen, Fahrradtouren, etc… Allerdings habe ich mich nicht für das Tool entschieden, da es den Akku sehr schnell leer saugt und ich mir auch nicht ganz sicher war, dass es ohne Mobilfunknetz richtig funktioniert (Anbindung Google Maps).

Es musste also eine automatisierte Lösung her, welche kein Netz benötigt und den Akku nicht so schnell leert. Fragen
nach Automatisierung im Bezug auf Android haben fast immer die gleiche Antwort: Tasker 

Also habe ich mir ein kleines Profil inkl. Task gebastelt, welches meine Tracking Anforderungen für den Urlaub komplett erfüllt hat und auch sehr schonend mit dem Akku umgegangen ist.

Zuerst erstellt man ein neues Zeitprofil.

 

In diesem Beispiel habe ich mich dafür entschieden alle zwei Minuten meine Position wegzuschreiben. Wenn das zu sehr auf den Akku geht, kann man
hier ruhig alle 5 Minuten einstellen. Genauso für Tage am Strand habe ich das Intervall erhöht, da die Bewegungsfreudigkeit am Strand eh sehr gering ist.  :-)

 

 

 

 

 

 

 

 

 

 

 

Als nächstes erstellt man einen Task, welcher das eigentliche Tracking übernimmt.

Hierfür baucht man im Prinzip nur zwei Funktionen. Ich habe aber noch eine dritte eingebaut (Eintrag in einen Kalendar)

 

 

 

 

 

 

 

 

 

 

 

 

Get Location (misc->get location)

 

Als Quelle (Source) stellt man hier GPS ein. Net geht natürlich auch, aber nicht im Ausland (Roaming) und es ist bei weitem nicht so genau wie GPS.

Den Timeout habe ich auf 240 Sekunden gesetzt. Allerdings habe ich nie solange für einen GPS Fix gebraucht.

So, hierdurch haben wir nun schon einmal alle notwendigen Variablen gefüllt.

 

 

 

 

 

 

 

 

 

 

Calendar Insert (optional | App->Calendar
Insert)

Dieser Punkt ist nicht zwingend notwendig. Ich fand es nur ganz witzig auch per Klick in einen Kalendar sehen zu können wann ich wo war. :-)

Dafür habe ich mir einen neuen Google Kalendar angelegt mit dem Namen Location-Diary. Diesen wählt man dann auch als Ziel aus. Als Termindauer habe ich fünf Minuten gewählt. Titel: Location GPS

Die Description habe ich leer gelassen. Hier kann man aber auch andere interessante Daten eintragen, welche durch get Location geholt wurden.

In das Feld Location schreibt man nun den Wert der Variable %LOC. Diese wurde vorher über get Location gesetzt.

Das war es zum Thema
Kalendar. Nun bekommt man alle zwei Minuten einen neuen Eintrag, welchen man über die Web Oberfläche vom Google Kalendar aufrufen kann. Klickt man dort auf den Ort, öffnet sich Google Maps mit der entsprechenden Position.

 

 

 

 

write File (File -> Write File)

Diese Funktion ist die eigentlich wichtigere. Über Write File, werden die GPS Koordination in eine Datei geschrieben. Die Datei trägt man in das Feld File ein.
In meinem File habe ich mir einen Ordner LocationDiary angelegt. Die Datei bekommt den Titel gps_diary.txt

Als Text mache ich pro Eintrag die Kombination aus
Datum, Zeit und Koordinaten. Die Variablen dazu sind %DATE, %TIME und %LOC. Wichtig hierbei ist, dass die Variablen jeweils durch ein Komma getrennt werden. Ein Semikolon würde ebenfalls gehen.
Das hat den Vorteil, dass diese Datei später als CSV Datei über diverse Tools geöffnet werden kann. z.B LibreOffice. Das Häkchen bei Append muss aktiviert sein, sodass für jeden neuen Eintrag die Zeile hinzugefügt wird und nicht überschrieben.

 

 

 
Das war im Prinzip schon alles. Wenn man das GPS Tracking benötigt, kann man das Zeitprofil aktivieren, ansonsten lässt man es deaktivert. Zum einfachen ein und ausschalten habe ich mir noch ein Widget gebastelt, welches das GPS Modul aktiviert und das auch das Profil.

Die generierten Einträge sehen dann folgendermaßen aus:
05.07.11,10.39,40.9019708633411,9.517765045165739

Datum, Uhrzeit, Breitengrad, Längengrad.

Um dann meine Urlaubsbilder mit den entsprechenden Koordinaten zu taggen nutze ich GPSPrune.
Es gibt auch diverse andere Programme, aber dieses finde ich recht intuitiv zu bedienen und es ist in den offiziellen Paketquellen von Ubuntu vorhanden.

Wer Prune verwendet muss in der gps_diary.txt leider vor dem Taggen noch einmal Hand anlegen. Längen.- und Breitengrad werden von Pune automatisch erkannt. Für das Attribut Zeitstempel muss die Textdatei leider angepasst werden. Zeitstempel werden in Prune in diesem Format erwartet:

2011-07-03T05:05:00

Jahr-Monat-TagTStunden:Minuten:Sekunden

Öffnet man die Datei vorher mit LibreOffice Calc kann man dieses Format sehr schnell ändern. Oder man schreibt sich halt ein kleines Skript dafür.

Wurde die Datei entsprechend erstellt, kann man diese nun mit Prune importieren. Damit hat man dann schon einmal den kompletten Weg und die Aufenthaltsorte auf dem Schirm. Über Prune
lassen sich auch sämtliche GPS Export Formate erstellen, sodass man seinen Urlaub bei Google Maps hochladen kann oder sonst wo.

Als nächstes lädt man über Prune seine Urlaubsfotos.
Im letzten Schritt wählt man den Punkt Fotos korrelieren aus und erfasst einen entsprechenden Offset. Einen genauen Zeitpunkt für die Fotoerstellung und Koordinaten wird man kaum treffen, sodass man hier plus oder minus 2 Minuten angibt.

Das wars! Nun hat man alle seine Urlaubserinnerungen direkt mit den entsprechenden Koordinaten getaggt.

Ich finde es persönlich unheimlich nett, wenn man sich eine Landkarte anschauen kann und dort über Selektion einzelner Punkte die dazugehörigen Bilder sieht.

Zwei Hinweise noch:

– Kamera und Handy müssen natürlich die gleiche Zeit eingestellt haben

– Akkuverbrauch: Ich habe mein Handy teilweise morgens von der Ladestation genommen und hatte abends gegen 22:00 Uhr immer noch 30% Akkustand.

Ich habe mir übrigens noch einen Task erstellt für
Backupzwecke. Jede Nacht um 23:59 Uhr verschiebe ich die Datei gps_diary.txt in ein anderes Verzeichnis und benenne diese um in gps_diary_[Datum].txt

Dadurch hat man pro Datei die Koordinaten für 24 Stunden.

 

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!

Android: Automatisierung mit Tasker

Tasker ist für mich eine der besten und sinnvollsten Android Apps überhaupt. Mit dieser App kann man sein Smartphone weitestgehend komplett automatisieren. Egal ob nach Uhrzeit, Datum, Location (GSM Zelle oder GPS) oder nach Events/Status des Gerätes.

Hier mal ein paar Beispiele:

Der Klassiker ist wohl: Schalte WLAN an wenn man Zuhause ist, bzw. schalte es wieder aus, wenn du
unterwegs bist.

Tasker kann auch auf Kalendareinträge reagieren. Beispiel: Schalte auf Vibration wenn man gerade ein Meeting hat.

Ebenfalls sinnvoll ist das Reagieren auf Events. Ich habe mir ein Profil angelegt, welches den Lockscreen deaktiviert, wenn ich die Tastatur des Milestones ausfahre.

Viele Smartphone Besitzer nutzen ihre Geräte auch als Navi, oder als Wecker (beides über jeweilige Halterungen und Dockingstations). Auch hier kann Tasker die Handhabung sehr schön unterstützen. Hat man im Schlafzimmer eine Dockingstation, möchte man vielleicht, dass das Gerät über Nacht in den Flugzeugmodus wechselt, bzw. lautlos ist und WLAN ausschaltet. Einfach ein Profil anlegen, welches darauf reagiert wenn das Gerät in die Dockingstation gepackt wird und schon braucht man nichts mehr zu verstellen, wenn man einen ruhigen Schlaf haben möchte. Zusätzlich kann man sich auch einen kleinen Wecker mit Tasker basteln (Sehr einfach: Spiele Lied zu bestimmten Uhrzeiten).

Viele Autohalterungen
haben einen kleinen Magneten verbaut. Damit bekommt das Gerät übermittelt, dass es gerade in ein Halterung gesteckt wurde. Hier würde sich für das Auto ein Profil anbieten, dass in der Halterung automatisch GPS aktiviert und die bevorzugte Navi Software startet. Zusätzlich vielleicht noch Bluetooth aktiviert wenn man eine Freisprecheinrichtung hat.

Die von mir beschriebenen kleinen Einsatzgebiete stellen nur einen Burchteil von dem dar, was man mit Tasker realisieren kann.

Für ausführlich beschriebene Tutorials sollte man sich die Homepage von Tasker mal anschauen. Neben den Tutorials sind dort auch fertige Profile zum Download verfügbar. Profile können ganz einfach über XML Ex.-bzw Importe gesichert werden.

Auch im Android-Hilfe Forum gibt es eine riesige Auswahl an fertigen Profilen und Tutorials.
r

Ich kann Tasker auf jeden Fall jedem empfehlen, der gewissen Dinge automatisiert haben möchte. Mit Tasker gibt es kaum Grenzen!

Noch abschliessend einen Satz zur Benutzung. Das GUI sieht vielleicht nicht ganz so hübsch aus, auch muss man sich erst einmal etwas einarbeiten, was vielleicht viele User abschreckt. Die teilweise negativen Bewertungen im Market kommen leider von Usern die dazu nicht bereit waren. Auch ist das Tasker nicht kostenlos. Es kostet stolze 4,52 Euro. Es ist aber jeden Cent wert.

Ich werde hier auch mal ein paar Profile veröffentlichen.

Flattr this!