Kampis Elektroecke

Automatisch E-Mails senden

Raspberry Pi

Nun möchte ich zeigen, wie mit dem Raspberry Pi automatisch E-Mails verschickt werden können. Damit kann der Raspberry Pi z. B. automatisch eine Nachricht absetzen, wenn sich der Zustand eines I/O geändert hat.

Das Pythonskript:

Daten, die verschickt werden sollen, übergebe ich als Kommandozeilenparameter in ein Python-Skript, welches  unter /home/pi/Desktop/Autostart mit dem Namen Mail.py gespeichert ist.

Der erste Schritt ist das Einfügen der Accountdaten:

Empfaenger = "Daniel.Kampert@gmx.net"
Absender = "raspberrypi@kampis-elektroecke.de"
Passwort = "" ""
smtpserver = smtplib.SMTP("smtp.1und1.de", 587)

Für Empfaenger wird die E-Mailadresse des Empfängers und für Absender die Adresse des Absenders eingetragen.
Ich habe mir extra für das Raspberry Pi einen neuen E-Mailaccount angelegt, von dem aus das Raspberry Pi die E-Mails abschickt. Bei Passwort müsst wird das Passwort des Absenders eintragen. Die Adresse smtp.1und1.de muss in die Adresse des SMTP-Servers des E-Mailanbieters umgeändert werden. Den Port kann in den meisten Fällen so bleiben, da dieser für alle Anbieter gleich bleiben sollte. 

Über die Zeile

msg["Subject"] = "Nachricht vom Raspberry Pi - %s" % Datum.strftime("%b %d %Y")

wird der Betreff der E-Mail eingetragen. Wie ich eben schon erwähnt habe, werden die zu versendenden Daten als Kommandozeilenparameter in das Python-Skript übergeben. In dem Python-Skript werden die übergebenen Argumente zu einem String zusammengebaut

Wert = str(sys.argv[1])
Wert += " "
Wert += str(sys.argv[2])

und durch

msg = MIMEText(Wert)

in das Nachrichtenfeld der E-Mail kopiert. Natürlich kann die Zeile noch erweitert werden, sodass drei oder vier Argumente übergeben werden, indem die Zeile dafür entsprechend geändert wird:

Wert += str(sys.argv[x])

Wichtig ist, dass argv[0] (wie bei C) immer der Programmaufruf selber ist, sprich die eigentlich übergebenen Argumente fangen bei argv[1] an.

Versenden einer E-Mail via Konsole:

Nachdem das Python-Skript nun einsatzbereit ist, kann die erste E-Mail versendet werden, um zu prüfen ob die Konfiguration korrekt war. Dies kann per Konsole gemacht werden:

$ python /home/pi/Desktop/Autostart/Mail.py 5 10

Es muss nur darauf geachtet werden, dass immer genau so viele Argumente beim Programmaufruf übergeben werden, wie das Pythonskript verarbeiten kann, da ansonsten Fehler entstehen und dieser Fehler nicht abgefangen wird.

Wenn alles geklappt hat, sollte ein paar Sekunden später eine E-Mail eintreffen, die in etwa so aussieht:

Versenden einer E-Mail via C-Programm:

Da das Versenden einer E-Mail via Konsole nun funktioniert, wird nun eine Integration in ein C-Programm beschrieben. So wird es möglich, z. B. den Status von GPIOs oder Sensoren via E-Mail mitgeteilt zu bekommen. Für meinen ersten Test verwende ich ein Programm, welches den GPIO 17 abfragt und mir den Status per E-Mail zukommen lässt.

Was genau macht dieses Programm nun genau?
Das Programm besteht aus drei Teilen. Der erste Teil deklariert den GPIO als Eingang, der zweite Teil ließt den Pegel von dem GPIO aus und der dritte Teil versendet alles via Mail.

Der erste Teil sieht folgendermaßen aus:

fd = open(Device_Direction, O_RDWR);
write(fd, "in", 2);
close(fd);

Dort wird ein Device mit einem Namen, der unter der Variable Device_Direction gespeichert ist, geöffnet. Die direction-Datei eines GPIOs legt fest ob der Pin als Ausgang (dann steht in der Datei out) oder als Eingang (dann steht in der Datei  in) geschaltet ist. Das O_RDWR gibt an, dass es sich sowohl um einen lesenden, wie auch um einen schreibenden Zugriff handelt. Der Index der geöffneten Datei wird unter fd gespeichert und in der zweiten Zeile wird das Wort in in die durch fd indexierte Datei geschrieben. Die 2 gibt an, dass zwei Bytes geschrieben werden. Als letztes wird die, durch fd indexierte Datei, wieder geschlossen.

Der zweite Teil des Programmes

fd = open(Device_Value, O_RDWR);
read(fd, &Input, 1);
close (fd);

funktioniert quasi genau so, außer das hier nicht die direction-Datei beschrieben sondern die value-Datei gelesen wird. Die value-Datei beinhaltet den aktuellen Zustand des Pins, sprich eine 1 für High oder eine 0 für Low.
Der Inhalt der Datei wird unter Input gespeichert. Da die read-Funktion an der Stelle einen Zeiger besitzt, muss die Adresse der Variable, wo der Inhalt drin gespeichert werden soll, angegeben werden. Der letzte Teil des Programmes befasst sich mit dem Versenden der E-Mail. Als erstes wird von der Variable Input der Wert 48 subtrahiert:

Input = Input - 48;

Damit wandel ich den ASCII Wert der Zahl 1 und 0 in den Binärwert 1 und 0 um. Im nächsten Schritt wird das Ergebnis per Konsole ausgegeben:

printf("%d", Input);
printf("\n");

In der Konsole steht nachher entweder eine 0 oder eine 1, je nachdem welcher Zustand der GPIO angenommen hat. Die letzten beiden Zeilen sorgen dafür, das dass Python-Skript ausgeführt wird:

lenght = sprintf(Buffer, "/usr/bin/python /home/pi/Desktop/Autostart/Mail.py %s %d", "GPIO17:", Input);
                
system(Buffer);

Die erste Zeile erzeugt einen String und speichert ihn unter Buffer. Der String beinhaltet den Pfad vom Python-Interpreter (/usr/bin/python3), sowie den Pfad des Python-Skripts (/home/pi/Desktop/Autostart/Mail.py).

$ ./GPIO_read

Die Platzhalter %s und %d werden mit einem weiteren String (GPIO17) und einer Dezimalzahl (der Inhalt der Variable Input) folgen. Unter length wird die Länge des fertigen Strings gespeichert. 

Der fertige String (wie er unter Buffer gespeichert wird) sieht am Ende folgendermaßen aus:

/usr/bin/python /home/pi/Desktop/Autostart/Mail.py GPIO17 0

In der nächsten Zeile sorgt der Befehl system dafür, dass der angegebene Befehl ausgeführt wird. In diesem Fall ist es also der Befehl um das Python-Skript auszuführen. Im Grunde beinhaltet der String nichts anderes als die Konsoleneingabe von eben (nur das anstelle der Zahlen, GPIO17 und der Inhalt der Variable Input als Kommandozeilenparameter übergeben werden).

Wenn das Programm nun kompiliert und mittels $ ./GPIO_read ausführt wird, wird entweder eine 0 oder eine 1 in der Konsole ausgegeben und derselbe Status wird dann noch einmal in der versendeten E-Mail stehen.

Sämtliche Programme sind in meinem Git-Repository zu finden.

66 Kommentare

  1. Hallo,
    Bin etwas Neuling habe nun endlich meine Rasberry bekommen Super ding und das für den Preis.
    Lese schon länger bei dir . Super wie du was zeigst habe das mit dem email PY gemacht klappt super echt ! Weiter so mal schauen ob ich auch was an ein online sms anbieter senden kann.
    Aber das 1wire ist sehr intressant bin schon seit jahren da bei fing mit fli4linux an nun über Pollin AVR-NETIO und ethersex Firmware klappt super
    so das wollt ich mal sagen und DANKE
    Gruß Jürgen

  2. Ich habe ne Frage bezüglich des Mail Versands.

    Ich habe einen Kontakt der durchschaltet wenn ein Grenzwert überschritten wird.

    Ich möchte dass bei durchschaltung des Kontakts eine Mail mit Standartext versendet wird.
    Geht dass??? Wenn ja wie am besten (auch mit Anschluss am Pii => Ich bin absoluter neuling)

    Danke

    1. Hey,

      du kannst einfach eine If-Abfrage machen ob ein Pin auf High oder Low liegt (je nachdem wie du ihn schalten willst wenn dein Kontakt durchschaltet) und dann eine E-Mail schicken.
      Zum Abfragen von dem GPIO kannst du das Modul RPi.GPIO nehmen und das E-Mail Programm kannst du dann mittels „os.system()“ ausführen.
      Hilft dir das weiter :)?
      Wenn nicht, schreib mir ruhig eine E-Mail.

      Gruß
      Daniel

      1. danke für die schnelle Antwort!

        Wie schon geagt ich bin ein !!!absoluter!! neuling sprich ich starte von 0 weg, habe technische Begabung und möchte mich in diese Thema einarbeiten.
        Der schwierigste Punkt : wo fange ich an.!!

      1. Suche schon die ganze Zeit nach einer simplen Möglichkeit Mails mit dem Pi zu verschicken und dann denke ich mir, schau doch mal beim Kampi vorbei und siehe da, besser gehts doch gar nicht (Das ist ja ein Krampf mit Exim und Sendmail).
        Da ich mir einen kleinen Asterisk Server aufgesetzt habe interessiert mich natürlich auch der Dateiversand meiner Voicemails, hast Du da mittlerweile evtl. eine Idee wie man Anhänge mit Deinem Phyton Skript verschicken kann?

          1. Hallo Kampi,
            danke für Dein Feedback. was ich noch gefunden habe ist folgendes: https://code.google.com/p/python-simplemail/

            Damit habe ich es auch geschafft Anhänge zu verschicken.
            Leider fehlt mir hier das Know How das ganze jetzt mit Parametern für mein Asterisk System zu adaptieren.

            Dein Code ist mir vom lesen und vom Verständnis her weitaus lieber, vielleicht hast Du da ja bald was in petto. :)

            Gruß
            Oliver

          2. Hey Oliver,

            mmh das sieht doch ganz gut und recht einfach aus.
            Wie hast du dir das mit der Parametrierung vorgestellt?

            Gruß
            Daniel

          3. Hallo Oliver,

            mmh ich kann mich irren, aber es könnte fast sein, dass du bei dem Eintrag „mailcmd“ einfach nur das Python Programm aufrufen musst.
            Sachen die in der E-Mail verschickt werden sollen kannst du dann ja einfach als Parameter mit anhängen (Dateien z.B….einfach den Pfad angeben).

            Gruß
            Daniel

  3. hi! ,

    ich bin neuling…habe das script getestet und bekomme folgenden fehler:

    Traceback (most recent call last):
    File „/usr/local/bin/Mail.py“, line 23, in
    Wert = str(sys.argv[1])
    IndexError: list index out of range

    was mache ich falsch?

    1. Hey,

      wie hast du das Programm den aufgerufen? Hast du zwei Parameter verwendet, wie im Beispiel:

      $ python /home/pi/Desktop/Autostart/Mail.py 5 10

      ?

      Gruß
      Daniel

  4. Hallo Kampi,

    warum muss das Mail.py Skript im Pfad /home/pi/Desktop/Autostart/ abgelegt werden bzw. wieso funktioniert es nicht direkt im /home/pi/?

    Bei der Einbindung direkt in /home/pi/ bekommt man diverse Fehlermeldungen. Warum?

    File „mail.py“, line 1, in
    import smtplib
    File „/usr/lib/python2.7/smtplib.py“, line 46, in
    import email.utils
    File „/home/pi/email.py“, line 6, in
    ImportError: No module named mime.text

    Gruß Herry

      1. Ich weiß nicht ob es jmd schon geschrieben hat oder so, aber ich hatte den gleichen Fehler und es war mein Problem, das mein Script email.py hieß ^^ das war der Fehler. Nach dem umbennen hats geklappt. Vlt hilfts jmd ^^

  5. Hallo Kampi,
    Erst mal danke für die Anleitung. E-Mail über Python klappt bei mir .
    Habe nun Mono installiert um den E-Mail Versand mit C# zu testen. Das C# Programm funktioniert auf meinem Windows PC. Auf dem Raspberry bekomme ich aber Fehlermeldungen z.B. Mono.Security.Protocol.Tls.Handshake.Client.TlsServerCertificate.validateCertificates (Mono.Security.X509.X509CertificateCollection certificates) [0x00000] in :0

    sind es evtl. fehlende Zertifikate auf dem Raspberry. ?
    Warum geht es aber mit Python ?

    Danke
    Gruß
    Armin

    1. Hey Arnim,

      ich weiß nicht genau wo der Unterschied zwischen dem C# Programm und dem Python Programm ist.
      Hast du das C# Programm auf dem Pi neu kompiliert oder direkt von deinem Windowsrechner übertragen?
      Da die beiden Rechner sich in der Architektur unterscheiden, musst du das Programm auf dem Pi neu kompilieren.

      Gruß
      Daniel

      1. Hallo Daniel,
        diese Zeile ist auf dem Raspberry zusätzlich nötig damit es mit C# funktioniert. Auf meinem PC funktioniert das C# Programm auch ohne diese Zeile.
        ServicePointManager.ServerCertificateValidationCallback = delegate(object s,X509Certificate certificate,X509Chain chain, SslPolicyErrors sslPolicyErrors){ return true; };

        Anbei noch das vollständige Programm

        using System;
        using System.Text;
        using System.Net.Mail;
        using System.Net.Security;
        using System.Net;
        using System.Security.Cryptography.X509Certificates;
        namespace ConsoleApplication1
        {
        class Program
        {
        static void Main(string[] args)
        {
        MailMessage Email = new MailMessage();
        MailAddress Sender = new MailAddress(„AbsenderAdresse@xx.de“); //Absender
        Email.From = Sender;
        Email.To.Add(„xxx@yyy“); // Empfänger hinzufügen
        Email.Subject = „Mail von Raspberry Pi“; // Betreff hinzufügen
        Email.Body = „hi hi es funzt“; // Nachrichtentext hinzufügen
        string ServerName = „smtp.1und1.de“; // hier entsprechend dem Provider eintragen (Beispiel 1und1)
        string Port = „587“;
        SmtpClient MailClient = new SmtpClient(ServerName, int.Parse(Port)); // Postausgangsserver definieren
        MailClient.EnableSsl = true;
        MailClient.Credentials = new System.Net.NetworkCredential(„AbsenderAdresse@xx.de“, „MeinPasswort“) as ICredentialsByHost; ; // Anmeldeinformationen setzen*/
        ServicePointManager.ServerCertificateValidationCallback = delegate(object s,X509Certificate certificate,X509Chain chain, SslPolicyErrors sslPolicyErrors){ return true; };
        MailClient.Send(Email); // Email senden
        }
        }
        }

  6. Hallo Kampi,
    danke für deine ganzen Tipps zum Thema RaspberryPi. Habe hier einige Anregungen und Lösungen zu meinen Problemen gefunden…heute auch wegen dem neuerdings von GMX auferlegten Zwang eine TLS oder SSL-Verschlüsselung beim Postversand zu verwenden. In diesem Kapitel oben habe ich nichts darüber gefunden, zum Glück habe ich mir das von die zur Verfügung gestellte Script auch angesehen und dort die Passage
    smtpserver.starttls() gefunden … woanders hätte ich mich bestimmt dusselig gesucht.

    Mach bitte weiter…ist sehr informativ deine Elektroecke.
    Thomas

    1. Hallo Thomas,

      danke für das Kompliment und den Tipp. Ich denke der ein oder andere wird dies auch eventuell benötigen.

      Gruß
      Daniel

  7. Hallo Daniel,

    habe schon des öfteren deine super Tutorials verfolgt und eingesetzt und bin jedesmal auf die gewünschte Lösung meiner Projekte gekommen, außer bei diesem E-Mail Tutorial.

    Mein Vorhaben: Ich möchte, den E-Mail Versand nicht über die Kommandozeile starten sondern eine Email verschicken lassen, sobald sich ein GPIO Eingang auf bsplsw. HIGH ändert. Wie liese sich dies realisieren, dass dein Email Skript startet sobald der Pin HIGH ist?

    den GPIO Eingang frage ich mich folgendem Python Skript ab:

    from RPi import GPIO
    import time
    from time import sleep
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(11, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

    while True:
    try:
    pin_status11 = GPIO.input(11)
    if pin_status11 == GPIO.HIGH:
    print (time.asctime()
    >>HIER SOLLTE DIE EMAIL VERSENDET WERDEN<<

    except KeyboardInterrupt:
    GPIO.cleanup()

    GPIO.cleanup()

    Danke und schönen Gruß,

    Markus

      1. danke für den Link, habe mir den Inhalt durchgelesen und versucht zu verstehen, doch leider nicht so richtig umsetzen können.

        Könntest du mir in meinem vorhanden Skript evtl. ein Beispielbefehl mit os.system() einbauen?

        Das würde mir sicher helfen.

        Danke schonmal

        Gruß
        Markus

        1. Hallo Markus,

          das ist im Grunde ganz simpel:

          from RPi import GPIO
          import time
          from time import sleep
          GPIO.setmode(GPIO.BOARD)
          GPIO.setup(11, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

          while True:
          try:
          pin_status11 = GPIO.input(11)
          if pin_status11 == GPIO.HIGH:
          print (time.asctime()
          os.system(„python /home/pi/Desktop/Autostart/Mail.py 5 10“)

          except KeyboardInterrupt:
          GPIO.cleanup()

          GPIO.cleanup()

          Damit wird das Mailprogramm geöffnet und eine E-Mail mit dem Text „5“ und „10“ gesendet.

          Gruß
          Daniel

          1. Hallo, Ich möchte wie Markus, den E-Mail Versand nicht über die Kommandozeile starten sondern eine Email verschicken lassen, sobald sich ein GPIO Eingang auf bsplsw. HIGH ändert. Wie binde ich die Datei nun ein, damit sie automatisch mit dem Pi gestartet wird und wie müssen die root Rechte dazu aussehen? Danke im voraus! Gruß Gerd (Anfänger)

          2. Hallo Kampi
            ich würde gerne eine Email zur Überwachung eines Brutkastens haben.
            Dabei würde ich ein Signal bekommen bei Überschreitung des Grenzwertes.
            Meine Frage ist: Wie muss ich den Wert sleep-Wert setzen wenn ich nur eine Nachricht haben will und nicht jede 10 oder 15 sec.?
            Und kann ich mehrere Email-Adresssen angeben?
            Achso im Script schaltet die Heizung aufgrund der Trägheit im Heizverhalten eher aus und das Feintuning übernimmt noch eine Glühlampe.

          3. Hallo,

            bitte schick mir das Programm einmal per Mail. Da beim Einfügen die Formatierung etc. entfernt wird, ist es äußerst mühselig das wieder rückgängig zu machen.
            Mehrere Absender kannst du eintragen, indem du eine Liste mit Mailadressen übergibst:

            MyList= [„Empfaenger1“, „Empfaenger2“]
            msg[„To“] = „, „.join(MyList)

            Gruß
            Daniel

  8. Hallo Kampi,
    es ist einfach Klasse, Dein Skript in meinen Raspi kopiert, meine Daten angepasst, gestartet und funktioniert auf den ersten Klapps.
    Nun möchte ich aber von FHEM z.B. bei „Batterie leer“ eine Mail senden – wie stelle ich denn hier eine Verbindung her ?
    Bin schon etwas älter (68) und brauche etwas Hilfe.
    Freue mich auf eine Antwort.
    Gruß Peter

    1. Hallo Peter,

      mit FHEM kenne ich mich leider gar nicht aus.
      Aber die erste Frage die ich mir stelle: Wie bekommt der Raspi mit, dass die Batterie leer ist? Hast du da eine Erweiterung oder was ähnliches?

      Gruß
      Daniel

      1. Hallo Kampi,
        die Meldung „Batterie leer“ wird ind FHEM erzeugt. Mittlerweile kann ich aus FHEM mit folgendem Kommando :
        define AC_03_UPuebw DOIF ([AC_Relais_03:state] eq „on“) ({ system(„python /home/pi/Desktop/Autostart/Mail.py Umwaelzpumpe an“) } DOELSE { system(„python /home/pi/Desktop/Autostart/Mail.py Umwaelzpumpe aus“) })
        attr AC_03_UPuebw wait 3

        richtig schön eine email senden.
        Allerdings such ich noch die Möglichkeit für andere Alarmsignale eine SMS an mein Handy zu senden. Mit Mail.py hat es nicht funktioniert da ich nicht weiss wo man das „Subjekt“ (Passwort in Betreff) in dem Mail.py script einfügen soll.
        Gruß Peter

        1. Hallo Kampi,
          wollte mitteilen, dass ich nun mit sendmail alles im Griff habe, kann sowohl email wie auch sms absetzen und empfangen.
          Noch einmal danke für das Interesse und es gibt bestimmt noch weitere Möglichkeiten zur Unterstützung, denn der Raspi stachelt zu weiteren Untaten an.
          Beste Grüße aus dem Nordschwarzwald
          von Peter

          1. Hallo Peter,

            freut mich das du es alleine geschafft hast :)
            Falls du weitere Fragen hast, schreib mir ruhig direkt eine E-Mail.

            Gruß
            Daniel

  9. Hallo Kampi, bitte nicht wegen der email adresse zurückschrecken !! ;) ist zur probe vom versenden ^^
    ich sitze gerade mit einem kollegen aus der schule am versenden der emails und bekommen ständig diese fehlermeldung:

    NameError: name ‚datum‘ is not defined

    dieser Fehler tritt auch bei ‚msg‘ auf.

    lg Peter ;)

  10. Hallo Kampi,
    ich finde deine Scripte super hilfreich. Habe schon eingies von dir lernen können.
    Leider bekomme ich bei dem E-Mai script einige Fehler ausgespuckt.
    Und zwar habe ich Pythonscript für zwei Argumente übernommen und wollte mal Testen ob ich eine Email erhalte. Folgender Fehler wird mir angezeigt:

    Traceback (most recent call last):
    File „/home/pi/Desktop/mail.py“, line 11, in
    smtpserver = smtplib.SMTP(’smtp.web.de‘, 587)
    File „/usr/lib/python2.7/smtplib.py“, line 249, in _init_
    (code, msg) = self.connect(host, port)
    File „/usr/lib/python2.//smtplib.py“, line 309, in connect
    self.sock = self._get_socket(host, port, self.timeout)
    File „/usr/lib/python2.7/smtplib.py“, line 284, in _get_socket
    return socket.create_connection((port, host), timeout)
    File „/usr/lib/lib/python2.7/socket.py“, line 571, in create_connection
    raise err
    socket.error: [Errno 110] Connection timed out

    So das war die Fehlermeldung

    Wir benutzen das Raspbian Wheezy Version May 2015. Kann es sein das wir ein zu neues Python benutzen? oder Woran könnte das Problem liegen?
    Außerdem benutzen wir zwei E-Mail Adressen von web.de, diser passt auch mit dem Port 587 zusammen.
    Außerdem haben wir das ganze “/home/pi/Desktop/mail.py“ hierrüber laufen, wobei das doch keinen unterschied macht ob wir den Ordner von dir mit Autostart ansprechen oder nicht.
    Wir wollten ersteinmal Probieren ob die Mail funktioniert, sind aber an der Fehlermeldung gerade überfordert.

    Danke für deine Bemühungen

    1. Hallo Kevin,

      das sieht mir nach einem Verbindungsproblem aus. Sicher das die URL des Servers stimmt, weil die Zeile vom Interpreter als Fehlerhaft angemerkt wird.

      Gruß
      Daniel

  11. Hallo Kampi,

    Ich habe es wie von Dir beschrieben prorammiert und main Raspi sendet mir wurderbar Mails.
    Nur eine Frage: Ich bin nicht in der Lage ( ich schreibe in C ) es dem Programm beizubringen bzw. einen Text so in den Buffer zu setzten, dass die Ausgabe in meiner Mail dann auch einen gewünschten Zeilenumbruch setzt.
    ( Wie z.B:
    Hallo
    Gunnar
    )
    Kann Du mir da vielleicht einen Tipp geben ?

  12. Ja, habe ich.
    Im einem String geht das auch mit \n.
    Nur wenn das dann über die folgende Befehlkette kommt erscheint nur das Hallo !

    sprintf(Buffer, „/usr/bin/python /home/pi/Desktop/Autostart/Mail.py %s „, „Hallo \n Gunnar“);
    system(Buffer);

    -> Ergebnis in der Mail ist nur : Hallo

  13. Hallo, erstmal danke für die Top-Seiten welche mir Raspi-Einsteiger schon viel geholfen haben. Nur jetzt habe ich ein Problem. Will ich nach dieser Anleitung eine mail verschicken (per python-Script) erhalte ich folgenden Fehler:
    „socket.gaierror: [Errno -2] Name or service not known“
    Ist laut Google nicht so selten, aber dort alles in Englisch mit dem ich nicht so klar komme ;-(
    Hast du dazu ggf. einen Hinweis in welcher Richtung ich da suchen muss?
    Danke Jürgen

    1. Update! Es funktioniert wieder. Bin da tatsächlich in meine eigene Falle getappt. Habe die letzten 3 Monate ausschließlich per PuTTY und WinSCP den Raspi bearbeitet. Aber immer nur im lokalen Netz! Und so nicht bemerkt das der Raspi nicht online geht. Warum auch immer. System neu aufgesetzt und es funktioniert. Sogar ddclient geht wieder;-)
      Grüße Jürgen

  14. Hallo Leute, ich hätte eine Frage:
    Ich habe ein „C-Programm“ geschrieben, dort funktioniert das Versenden der Ausgabe ohne Probleme. Nun würde ich jedoch das „print“ eines Python-Programms versenden. Kann mir jemand helfen, wie ich ich das Programm umbauen muss,damit es eine E-Mail versendet?
    Dabei sieht das Programm so aus:
    import RPi.GPIO as GPIO
    import time

    SENSOR_PIN = 23
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(SENSOR_PIN, GPIO.IN)
    def mein_callback(channel):
    # Hier kann alternativ eine Anwendung/Befehl etc. gestartet werden.
    print(‚Es gab eine Bewegung!‘)
    try:
    GPIO.add_event_detect(SENSOR_PIN , GPIO.RISING, callback=mein_callback)
    while True:
    time.sleep(100)
    except KeyboardInterrupt:
    print „Beende…“
    GPIO.cleanup()

    „Es gab eine Bewegung“ soll dabei per E-Mail versendet werden.

    Danke und lg

      1. Hallo,

        vielen Dank für deine Hilfe, jetzt funktionierts!

        Musste einfach die Zeile „os.system(„python Mail.py Es gab eine Bewegung!“)“ hinzufügen.

        Nochmals danke!

  15. Hallo ,
    ich versuche die eMail über meine gmail.com Addresse zu schicken und habe wie folgt geschrieben…

    smtpserver = smtplib.SMTP(’smtp.gmail.com‘, 587)
    msg[‚Subject‘] = ‚Nachricht vom Raspberry Pi – Laserschranke auf dem Monitor – %s‘ % Datum.strftime(‚%b %d %Y‘)
    Wert = str(sys.argv[1])

    Leider funktioniert es nicht und ich bekomme immer folgende Fehlermeldung…

    pi@raspberrypi:~ $ python /home/pi/Desktop/Autostart/Laser_Mail.py 5 10
    Traceback (most recent call last):
    File „/home/pi/Desktop/Autostart/Laser_Mail.py“, line 4, in
    smtpserver = smtplib.SMTP(’smtp.gmail.com‘, 587)
    NameError: name ’smtplib‘ is not defined
    ….
    Könnt Ihr mir sagen was ich falsch mache?
    Vielen Dank vorab!
    Thomas

    1. Hallo Thomas,

      hast du das Modul importiert:

      import smtplib

      ?
      Sonst schau dir mal mein Beispiel an. Das habe ich gerade noch getestet und es funktioniert mit der aktuellen Raspbian Version.

      Gruß
      Daniel

      1. Super Daniel, jetzt funktioniert es.
        VIELEN DANK!

        Habe mir Dein Beispiel noch mal angesehen. Außerdem hat mit gmail bei der Anmeldung einen Strich durch die Rechnung gemacht.
        Aber jetzt funktioniert es ja :-)

        Genau wie Markus am 22. September 2014 würde ich als nächstes gerne eine Email schicken wenn sich der Zustand von GPIO Eingang ändert.

        Hast Du dazu auch ein so gutes Beispiel?

        Besten Dank vorab & einen schönen Abend
        Thomas

  16. Hi Daniel,
    ich habe es so probiert…

    from RPi import GPIO
    import time
    from time import sleep
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(16, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    while True:
    try:
    pin_status16 = GPIO.input(16)
    if pin_status16 == GPIO.HIGH:
    print (time.asctime()
    os.system(“python /home/pi/Desktop/Autostart/Laser_Mail.py 5 10”)
    except KeyboardInterrupt:
    GPIO.cleanup()
    GPIO.cleanup()

    Kriege aber leider immer diese Fehlermeldung…

    pi@raspberrypi:~ $ python /home/pi/Desktop/Autostart/GPIO_23_Abfrage.py 5 10
    File „/home/pi/Desktop/Autostart/GPIO_23_Abfrage.py“, line 8
    try:
    ^
    IndentationError: expected an indented block

    Hast Du eine Idee was ich ändern muss?

    Vielen Dank vorab
    Thomas

    1. Hallo Thomas,

      das bedeutet, dass irgendwo ein Block nicht korrekt eingerückt ist. Der Ausdruck, der mit try-catch abgesichert werden soll, muss eingerückt sein (quasi wie bei einer if-Abfrage).

  17. Hi Daniel,
    besten Dank für den Hinweis…bin ein Stückchen weiter…leider gibt es jetzt in line 12 das nächste Problem….könntest Du bitte noch mal schauen ob Du noch einen Tipp für mich hast…
    Vielen Dank vorab & Grüße
    Thomas

    pi@raspberrypi:~ $ python /home/pi/Desktop/Autostart/GPIO_23_Abfrage.py 5 10
    File „/home/pi/Desktop/Autostart/GPIO_23_Abfrage.py“, line 12
    SyntaxError: Non-ASCII character ‚\xe2‘ in file /home/pi/Desktop/Autostart/GPIO_23_Abfrage.py on line 12, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

  18. “/home/pi/Desktop/Autostart/GPIO_23_Abfrage.py”

    das sind wohl die falschen Hochkomma,

    „/home/pi/Desktop/Autostart/GPIO_23_Abfrage.py“

    allerdings kommt dann eine weitere Fehlermeldung

    1. Hallo Marcus,

      du musst etwas aufpassen, wenn du Code aus dem Internet kopierst. Je nach verwendetem Zeichensatz ergibt das ein anderes Zeichen, was der Interpreter ggf. nicht kennt (das ist übrigens auch dein Fehler).
      Du hast in deinem Code ein Hochkomma, welches für dich zwar ein Hochkomma ist, aber nicht dem „richtigen“ Zeichen für ein Hochkomma in Python entspricht :)
      Einfach das Zeichen löschen und durch eine Tastatureingabe ersetzen.

      Gruß
      Daniel

  19. Noch eine Frage,
    wie würde es im Python aussehen, wenn ich mehrere Empfänger eintragen möchte?

    Gruß
    Marcus Binz
    Sonst klappt alles perfekt!

  20. Hier mein Problem und das Problem gibt es wohl öfters. Ich bekomme immer nur an den ersten Empfänger die Mail versendet. Es kommt auch keine Fehlermeldung.
    Hast Du es mal selbst getestet? Gibt es Log Verzeichnis? Kann eigentlich nur was kleines am Syntax sein.

    Hier mal das komplette Script:
    import subprocess
    import smtplib
    import socket
    import datetime
    import sys
    from email.mime.text import MIMEText

    # Accountinformationen zum Senden der E-Mail
    Empfaenger = ‚marcus.binz@kkfbachem.de, marcus.binz@artelis.net
    Absender = ‚raspberrypi@kkfbachem.de‘
    Passwort = ‚+++++++‘
    smtpserver = smtplib.SMTP(‚hosting6.xxxxxx.net‘,587)
    smtpserver.ehlo()
    smtpserver.starttls()
    smtpserver.ehlo

    # In Account einloggen
    smtpserver.login(Absender, Passwort)

    # Aktuelles Datum holen
    Datum = datetime.date.today()

    # Text
    Wert = „“

    # Alle Argumente einlesen und in einem String speichern
    for Argument in range(1, len(sys.argv)):
    Wert += str(sys.argv[Argument])
    Wert += “ “

    msg = MIMEText(Wert)

    # Betreff + Datum
    msg[‚Subject‘] = ‚Nachricht vom Raspberry Pi – %s‘ % Datum.strftime(‚%b %d %Y‘)

    # Absender
    msg[‚From‘] = Absender

    #Empfaenger
    msg[‚To‘] = Empfaenger

    # E-Mail abschicken
    smtpserver.sendmail(Absender, [Empfaenger], msg.as_string())
    smtpserver.quit()

  21. Moin,

    Super verständlich und gut erklärt!
    Mich würde das ganze aber andersrum interessieren… ist es möglich mit dem Eingang einer Email (eventuell sogar mit einem bestimmten Betreff oder Inhalt) einen Ausgang zu schalten?
    Ich wüsste nicht wie ich einen Mail Eingang überwachen könnte…

    Liebe Grüße
    Johannes!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert