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.
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
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
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
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.!!
Hey,
du kannst ja z.B. damit anfangen einen GPIO auszulesen und den Status in der Konsole auszugeben :)
Gruß
Daniel
Hallo!
Ist es auch möglich, Dateien an die Mail anzuhängen? Und wenn ja, wie?
Liebe Grüße,
Peter
Hey,
eventuell geht auch dies.
Ich habe es leider nur noch nicht ausprobiert und kann dir leider nicht sagen wie es geht.
Gruß
Daniel
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?
Hey Oliver,
schau mal, vielleicht hilft dir das hier weiter:
http://stackoverflow.com/questions/3362600/how-to-send-email-attachments-with-python
Ich selber habe leider noch keine Anhänge an die E-Mails angehängt.
Aber ich glaube das probiere ich mal aus und schreibe da drüber :)
Danke für den Hinweis ;)
Gruß
Daniel
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
Hey Oliver,
mmh das sieht doch ganz gut und recht einfach aus.
Wie hast du dir das mit der Parametrierung vorgestellt?
Gruß
Daniel
Hallo Kampi,
im Prinzip sieht meine Conf Datei ähnlich zu dieser aus: http://www.kammerath.net/asterisk-voicemail.html
Nur wird hier eben Sendmail benutzt.
Mir fehlt da einfach das Wissen wie ich jetzt diese Textbausteine und Anhänge als Argumente übergeben kann.
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
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?
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
Was bedeuten diese Parameter eigentlich?
Hallo Daniel,
diese Parameter sind beliebige Werte, die dann mit der E-Mail versendet werden.
Gruß
Daniel
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
Hallo Henry,
im Grunde kannst du das Skript ablegen wo du willst. Was hast du den zum Programmaufruf eingegeben?
Gruß
Daniel
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 ^^
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
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
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
}
}
}
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
Hallo Thomas,
danke für das Kompliment und den Tipp. Ich denke der ein oder andere wird dies auch eventuell benötigen.
Gruß
Daniel
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
Hallo Markus,
du könntest an der Stelle z.B. den os.system() Befehl nutzen:
http://www.python-kurs.eu/os_modul_shell.php
Damit kannst du dann ganz normal das E-Mail Programm aufrufen.
Gruß
Daniel
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
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
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)
Hallo Gerd,
in welcher Sprache willst du das den machen?
Gruß
Daniel
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.
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
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
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
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
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
Hallo Peter,
freut mich das du es alleine geschafft hast :)
Falls du weitere Fragen hast, schreib mir ruhig direkt eine E-Mail.
Gruß
Daniel
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 ;)
Hallo Peter,
dann ist irgendwo in deinem Programm die Variable „datum“ nicht gesetzt worden :)
Gruß
Daniel
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
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
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 ?
Hallo Gunnar,
hast du mal ein \n\r im Text probiert?
Gruß
Daniel
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
oh….. Kommando zurück !!
da war ich jetzt etwas voreilig, mit nur einem \r im dem Text klappt es !!
Vielen Dank Daniel !!!
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
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
Hallo ich möchte euch einen wichtigen Hinweis geben. Ihr dürft auf keinen Fall euer Python Skript Programm in email.py benennen. Ansonsten bringt man das Skript unter python3 und 2 zum Absturz da anscheinend die libaries falsche geladen werden.
https://www.raspberrypi.org/forums/viewtopic.php?f=32&t=23857
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
Hallo,
du kannst in Python per os.system() andere Programme starten:
http://www.python-kurs.eu/os_modul_shell.php
Als Programm gibst du dann einfach das E-Mailskript an, welches deinen Text als Argument annimmt:
os.system(Mail.py Es gab eine Bewegung)
Das sollte schon alles gewesen sein.
Gruß
Daniel
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!
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
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
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
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
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).
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
“/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
Lustig,
nach dem Abschicken sieht es wieder so aus.
dann bitte manuell ändern.
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
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!
Hallo Markus,
einfach einen String mit den Empfängern anlegen und die Empfänger über ein Komma trennen :)
msg[„To“] = „A@somewhere.com, B@somewhere.com“
Gruß
Daniel
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()
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!
Hi Johannes,
ich habe es selber noch nicht getestet, aber ggf. hilft dir diese Frage weiter:
https://stackoverflow.com/questions/22600446/trigger-script-upon-email-receipt
Gruß
Daniel