E-Mail senden
Um aus FHEM heraus E-Mail senden zu können, sind abhängig von der verwendeten Platform unterschiedliche Vorgehensweisen erforderlich.
Linux
FritzBox 7170 (non-chroot) oder "reine" Linuxe
Datei 99_email.pm im Modul-Verzeichnis mit folgender Funktion anlegen (oder in bestehende 99_irgendwas.pm kopieren):
sub fb_mail { my $rcpt = $_[0]; my $subject = $_[1]; my $text = $_[2]; system("/bin/echo \"$text\" | /usr/bin/mail send -i - -s \"$subject\" -t \"$rcpt\""); }
Aufruf dann mittels
{ fb_mail('empfaenger@mail.de','Subject','text 123') }
Darauf achten, dass der fhem-User Mails senden darf (in richtige Gruppe eintragen. Ggf. vorher einmal su fhem und probieren).
Fritz!Box 7390
Auf der FritzBox 7390 ist diese Funktion seit 10/2012 Bestandteil der Fhem Standardauslieferung. Sie ist untergebracht in FritzBoxUtils.pm und heisst dort FB_mail($$$) (Groß-Kleinschreibung beachten).
Da der Dateiname von FritzBoxUtils.pm nicht mit 99_ beginnt, wird diese Programmdatei nicht automatisch beim Start von Fhem geladen. Fhem muss zum Laden dieser Programmdatei aufgefordert werden. Dazu (z. B. in 99_myUtils.pm) die Zeile use FritzBoxUtils; einfügen.
Mit dem Install von AVM.de wird fhem in einer chroot-Umgebung ausgeführt, die den Zugriff auf die Mailfunktion der Fritzbox nicht zulässt. Daher muss Fhem in der Version von fhem.de installiert sein. Sollte Ihre Fritzbox bisher mit dem install von AVM laufen, kann (nach einem backup!) das image von fhem.de einfach drüberinstalliert werden. Es sollten dabei alle Einstellungen erhalten bleiben.
sub fb_mail { my $rcpt = $_[0]; my $subject = $_[1]; my $text = $_[2]; system("/bin/echo \"$text\" > /var/tmp/fhem_nachricht.txt"); system("/sbin/mailer send -i '/var/tmp/fhem_nachricht.txt' -s \"$subject\" -t \"$rcpt\""); system("rm /var/tmp/fhem_nachricht.txt"); }
Aufruf dann mittels
{ fb_mail('empfaenger@mail.de','Subject','text 123') }
bzw.
{ FB_mail('empfaenger@mail.de','Subject','text 123') }
Dem Mailer können noch weitere Parameter hinzugefügt werden. Mehr dazu siehe: Mailer
OpenWRT
Die Anleitung wurde mit einer frühen Beta von Barrier Breaker (r391xx) mit einem TP_Lind WDR 4900 getestet. Da "sendEmail" nicht als Package vorliegt wird in dieser Anleitung "ssmtp" verwendet. Die Installation erfolgt mittels:
opkg update opkg install ssmtp_2.64-4_mpc85xx.ipk
Hierbei werden die Packete libopenssl und zlib mit installiert. Damit ssmtp funktioniert müssen die Dateien /etc/ssmtp/ssmtp.conf und /etc/ssmtp/revaliases angepasst werden.
/etc/ssmtp/ssmtp.conf
root=arnold@gmx.net mailhub=mail.gmx.net:465 rewriteDomain=gmx.net hostname=gmx.net FromLineOverride=YES UseTLS=YES #UseSTARTTLS=YES AuthUser=arnold@gmx.net AuthPass=Passwort_von_arnold@gmx.net
/etc/ssmtp/revaliases
root:arnold@gmx.net:mail.gmx.net:465
In der 99_myUtils folgende Unterroutine einfügen (von der RPi-Anleitung übernommen):
sub OpenWRTMail { my $rcpt = shift; my $subject = shift; my $text = shift; my $ret = ""; my $sender = "dockstar\@heye-tammo.de"; Log 1, "sendEmail RCP: $rcpt, Subject: $subject, Text: $text"; $ret .= qx(echo -e 'to:$rcpt\n from:$sender\nsubject:$subject\n$text\n' | ssmtp $rcpt); $ret =~ s,[\r\n]*,,g; # remove CR from return-string Log 1, "sendEmail returned: $ret"; }
Ab hier den entsprechenden Abschnitt unter "Raspberry Pi" lesen.
Synology DiskStation
Beim DSM 3.2 gab es keinen sendmail
-Befehl, sondern nur eine Funktion für den Versand der System-Benachrichtigungen. Interessanterweise funktionierte aber der php-mail
-Befehl, so dass man mittels folgendem Modul Mails frei versenden kann:
sub sendmail($$$) { my($empf, $subj, $nachricht) = @_; system("php -r 'mail(\"$empf\",\"$subj\",\"$nachricht\");'"); undef; }
Raspberry Pi
In der weezy-Version, wie sie von busware zur Verfügung gestellt wird, muss auf einem Raspberry Pi noch sendEmail nachinstalliert werden. Diese Anleitung funktioniert auch unter Ubuntu.
sudo apt-get update sudo apt-get install sendEmail libio-socket-ssl-perl libnet-ssleay-perl perl
in der 99_myUtils folgende Unterroutine einfügen:
######## DebianMail Mail auf dem RPi versenden ############ sub DebianMail { my $rcpt = shift; my $subject = shift; my $text = shift; my $attach = shift; my $ret = ""; my $sender = "absender\@account.de"; my $konto = "kontoname\@account.de"; my $passwrd = "passwrd"; my $provider = "smtp.provider.de:587"; Log 1, "sendEmail RCP: $rcpt"; Log 1, "sendEmail Subject: $subject"; Log 1, "sendEmail Text: $text"; Log 1, "sendEmail Anhang: $attach";; $ret .= qx(sendEmail -f '$sender' -t '$rcpt' -u '$subject' -m '$text' -a $attach -s '$provider' -xu '$konto' -xp '$passwrd' -o tls=auto -o message-charset=utf-8); $ret =~ s,[\r\n]*,,g; # remove CR from return-string Log 1, "sendEmail returned: $ret"; }
Um die TLS Verschlüsselung (ehem. SSL) nicht zu nutzen, muss in der 4. letzten Zeile tls=no verwendet und der Port des Mailproviders auf 25 eigetragen werden. Sollte anschließend keine Mail verschickt werden, siehe Probleme.
Falls der Body-Text in einem (Android-)Mailer auf dem Handy nicht gezeigt wird, kann der Parameter -o message-content-type=html helfen.
Die Funktion kann beispielsweise folgendermaßen aufgerufen werden:
define Sonstiges notify Fenster:Window:.*,.*Low.Batt*. {\ DebianMail('email@email.domain','Subject','Text','Anhang1 Anhang2 ...');;\ }
oder
define Sonstiges at *01:00:00 {\ DebianMail('email@email.domain','Subject','Text','Anhang1 Anhang2 ...');;\ }
BeagleBoard-xM
Auf einem BeagleBoard-xM mit einem OpenSUSE 12.2 kann man ebenfalls das Perl-Programm sendEmail wie beim RPi nutzen. Dies gibt es aber nicht in den Repositories von openSUSE, sondern man muss sich sendEmail als Source herunterladen. Das geht am einfachsten per wget, welches man ebenfalls erst installieren muss (aber aus einem Repository).
$ zypper in wget $ cd /opt $ wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz $ tar xvfz sendEmail-v1.56.tar.gz $ cd sendEmail-v1.56 $ cp sendMail /usr/local/bin
Dann geht man weiter vor wie unter RPi beschrieben (anlegen der SUB-Routine in 99_myUtils usw.).
Hinweis: Die Version 1.56 von sendEmail ist Stand Januar 2013 die aktuelle. Da diese Programmversion von 2009 stammt, ist mit neuen Versionen selten zu rechnen. Vielleicht schauen Sie trotzdem vorher auf der Homepage von sendEmail nach.
Windows
- Kopiere die Datei sendEmail.exe* in Dein FHEM Verzeichnis (hier c:\fhem-5.0\); Quelle: http://caspian.dotconf.net/menu/Software/SendEmail/
- Erstelle im FHEM Verzeichnis die Datei wmail.bat mit folgendem Inhalt (eine Zeile):
sendEmail -f absender@domain.de -u "%1" -m " " -s SMTP-SERVERAdresse -xu SMTP_USERNAME -xp SMTP_PASSWORT -t empfänger@domain.de -o message-header="X-Message-Flag: FHEM"
- Beispiel fhem.cfg
- Mail wenn sich der Status von Heizung.* oder Hzg.* ändert
define Mail_Heizung notify Heizung.*|Hzg.* { system("wmail $NAME:$EVENT")}
- Mail bei Signal Aussentemperatur (für dieses Beispiel wird http://fhem.de/commandref.html#getstate getstate benötigt)
define Mail_Aussentemperatur notify Aussentemperatur {\
my ($val);;\
$val = fhem "getstate $NAME";;\
system("wmail \"$NAME: $val\"");;\
}
- Mail wenn sich der Status von Heizung.* oder Hzg.* ändert
Probleme
sendEmail
Falls man keine E-Mails verschicken kann, kann man in einem ersten Test prüfen, ob sendEmail als solches funktioniert und die Konfiguration (Benutzer, Passwort, Server-Name usw.) des Mail-Kontos, über das die Mails abgesetzt werden sollen, richtig ist.
Hierzu setzt man in der FHEM-Befehlszeile die folgende Anweisung ab:
{ SUB-Routinen-Name('EMailAdresse@Mail.Domain','Test','Test-Text');; }
und ersetzt SUB-Routinen-Name durch den Namen der in 99_myUtils erzeugten Prozedur. Statt EMailAdresse@Mail.Domain trägt man noch eine gültige E-Mail-Adresse ein und bestätigt den Befehl dann mittels <Enter> (nicht "save"). Empfangen Sie nicht kurzfristig eine entsprechende E-Mail, ist sehr wahrscheinlich an den Zugangsdaten etwas verkehrt.
Vor dem testen der Routine oben kann sendEmail auch über die Konsole (z. B. via Putty) getestet werden:
sendEmail -f 'fhemsystem@meinedomain.tld' -t 'ich@meinedomain.tld' -u 'subject' -m 'body' -s 'meinmailserver.meinedomain.de' -xu 'fhemmailer' -xp 'geheimespassword' -o tls=no
Keine Mail mit TLS Verschlüsselung
Den Test über die Konsole durchführen. Erhält man folgende Fehlermeldung: invalid SSL_version specified at /usr/share/perl5/IO/Socket/SSL.pm line 332 muss auf dem Raspberry folgende Datei angepasst werden: /usr/bin/sendEmail. In Zeile 1907 muss
if (! IO::Socket::SSL->start_SSL($SERVER, SSL_version => 'SSLv3 TLSv1')) {
in folgendes geändert werden
if (! IO::Socket::SSL->start_SSL($SERVER, SSL_version => 'SSLv23:!SSLv2')) {
Der frühere Tipp direkt in der SSL.pm Datei zu editieren führt zu Problemen wenn man auf FHEM per HTTPS zugreifen will und ist daher nicht zu empfehlen.
Email laut Log gesendet aber nicht angekommen?
Dann bitte in der Fritzbox Oberfläche überpüfen, ob unter "System" -> "Push Service" selbiger eingerichtet und aktiviert wurde.