Schon seit einigen Jahren schwirrt mir immer mal wieder diese Idee durch den Kopf: Ein E-Mail-“Bot”, der Anfragen beispielsweise nach dem “Wetter Hamburg” oder dem “Kinoprogramm Berlin”, selbständig und automatisch verarbeiten und beantworten kann. Wenn nun auch noch ein Temperatursensor am Raspberry angeschlossenen ist, dann könnte dieser Bot auch lokale Informationen, etwa eine Anfrage nach der “Temperatur Zimmer”, beantworten. Hier ergeben sich, je länger ich darüber nachdenke, nach und nach noch zahlreiche weitere Anwendungsbeispiele. Um mich zu Beginn aber zu fokussieren, stelle ich mir für heute zunächst nur folgendes
Projektziel:
Der Raspberry PI soll – über ein Python-Programm – regelmäßig eingehende E-Mails von einem Mailaccount abrufen können und – abhängig vom Betreff der E-Mail – mit einer passenden Antwort reagieren.
Vorbereitungen
Zunächst richten wir eine E-Mail-Adresse für den Raspi ein, die den Abruf eingehender E-Mails über POP3 erlaubt. Falls wir keinen eigenen Mailserver in Betrieb haben genügt dazu auch eine Adresse eines der zahlreichen Freemail-Anbieters (Google, GMX, Web.de, …). Die für den POP3-Abruf notwendigen Zugangsdaten erhalten wir vom Anbieter und notieren uns diese für später. An die neu eingerichtete Mailadresse senden wir von unserem eigenen Mailaccount eine erste Test-E-Mail und prüfen, ob sie im Posteingang sichtbar ist.
> sudo apt-get install mailutils
Der grundlegende Abruf der E-Mails wäre mit den mailutils auch schon über die Kommandozeile möglich, da das Programm später jedoch noch um weitere Funktionen ergänzt werden soll, entscheide ich mich zur direkten Umsetzung in Python. Dazu legen wir mit einem Texteditor eine ausführbare Python-Datei, beispielsweise mailabruf.py, auf unserem Rechner an.
Python ist standardmäßig auf den Linux-Raspberry-Systemen vorinstalliert, falls nicht installieren wir per
> sudo apt-get install python
Die erste Version unseres Python-Programms – bei einem Zugriff über POP3 und SSL auf Port 995 – schaut in etwa folgendermaßen aus:
mailabruf.py – Erste Version
import poplib import email Mailbox = poplib.POP3_SSL('mail.anbieter.de', '995') Mailbox.user("rasperry@cathyproductions.de") Mailbox.pass_('supergeheimespasswort') EmailInformation = Mailbox.stat() numberofmails = EmailInformation[0] print "Anzahl E-Mails: " + str(numberofmails) if(numberofmails > 0): print 'E-Mails im Posteingang vorhanden!'
Hier werden zunächst die nötigen Libraries poplib und email geladen, in den folgenden drei Zeilen geschieht der E-Mail-Login über das Mailbox-Objekt. Über Mailbox.stat() wird dann die Anzahl neuer E-Mails im Posteingang abgefragt und entsprechend per if-Statement ausgegeben.
Nun soll, als zweiter Schritt, der E-Mail-Abruf regelmäßig in einer Schleife geschehen. Falls eine E-Mail gefunden wird, soll von dieser nun auch der Betreff ausgelesen und ausgegeben werden.
mailabruf.py – Zweite Version mit Schleife
import poplib import email import time while True: print "naechster Schleifenlauf..." [... Mailbox.login, numberofemails etc. wie oben] if(numberofmails > 0): print 'E-Mails gefunden' print 'Lade erste Mail...' for zeile in Mailbox.retr(1)[1]: if zeile.startswith('Subject: '): betreff = zeile[9:] print "Betreff: " + betreff time.sleep(60)
Reaktion auf den Betreff
Je nachdem, welchen Text wir dann im Betreff vorfinden, können wir im Programm mit einem entsprechenden if-Statement unterschiedlich reagieren, beispielsweise
> > if (betreff.lower().startswith("wetter berlin")): > # rufe subroutine auf: sende E-Mail-Antwort "Re. Wetter Berlin") > > else if (betreff.lower().startswith("temepratur zimmer")): > # rufe subroutine auf: sende E-Mail-Antwort "Re: Temperatur Zimmer") > > else: > # rufe subroutine auf: sende E-Mail-Antwort "Ich habe nicht verstanden") >
Löschen der Emails nach Verarbeitung
Nachdem eine Email verarbeitet worden ist, soll sie nun auch vom POP3-Server gelöscht werden. Python und das POP3-Protokoll stellen dazu den Befehl
> Mailbox.dele(messagenumber)
zur Verfügung
Zu beachten ist, dass die meisten POP3-Server ein DELETE erst nach einem QUIT tatsächlich durchführen, bis zum Logout ist die Nachricht nur zum Löschen vorgemerkt – Stichwort purgen. Die obige Schleife muss also zusätzlich, wenn eine Nachricht gefunden wurde und diese auch direkt gelöscht werden soll, entsprechend noch um ein delete(), quit(), und dann einen erneuten Login-Aufruf erweitert werden.
Spannender erster Teil, leider fehlt der Link zu Teil 2…