Ein E-Mail-Bot auf dem Raspberry Pi

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.

Auf dem Raspberry installieren wir noch die mailutils, um grundlegende Befehle für die Verarbeitung von E-Mails auf unserem System zur Verfügung zu haben:
> 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.

Weiter mit dem E-Mail-Bot geht es in Teil 2…

Mein Kommentar...