E-Mail senden: Unterschied zwischen den Versionen

Aus FHEMWiki
K (→‎Raspberry Pi: Interne verlinkung nach 99_myUtils_anlegen erzeugt)
(→‎Raspberry Pi: sendEmail Aufruf für attachments korrigiert)
 
(50 dazwischenliegende Versionen von 19 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
= Linux =
Um aus FHEM heraus '''E-Mail senden''' zu können, sind abhängig von der verwendeten Platform unterschiedliche Vorgehensweisen erforderlich.
== FB 7170 (non-chroot) ==
{{Randnotiz|RNTyp=y|RNText=Anleitung zur Einrichtung von Exim4 auf Debian mit GMX als Smarthost:[[Media:Anleitung_Exim4_Debian_GMX.pdf|PDF]]}}
== 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):
Datei 99_email.pm im Modul-Verzeichnis mit folgender Funktion anlegen (oder in bestehende 99_irgendwas.pm kopieren):
 
<syntaxhighlight lang="perl">
<nowiki>sub fb_mail {
sub fb_mail {
  my $rcpt = $_[0];
  my $rcpt = $_[0];
  my $subject = $_[1];
  my $subject = $_[1];
  my $text = $_[2];
  my $text = $_[2];
  system(&quot;/bin/echo \&quot;$text\&quot; | /usr/bin/mail send -i - -s \&quot;$subject\&quot; -t \&quot;$rcpt\&quot;&quot;);
  system(&quot;/bin/echo \&quot;$text\&quot; | /usr/bin/mail send -i - -s \&quot;$subject\&quot; -t \&quot;$rcpt\&quot;&quot;);
}</nowiki>
}
Aufruf dann mittels <code>{ fb_mail('empfaenger@@mail.de','Subject','text 123') }</code>
</syntaxhighlight>
Aufruf dann mittels  
:<code>{ fb_mail('empfaenger@mail.de','Subject','text 123') }</code>
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 [[AVM Fritz!Box|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.&nbsp;B. in 99_myUtils.pm) die Zeile ''use FritzBoxUtils;'' einfügen.


== FB 7390 ([[AVM Fritz!Box]]) ==
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 [http://fhem.de/fhem.html#Download 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.
'''Seit 10/2012 ist diese Funktion 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 (zB 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 [http://fhem.de/fhem.html#Download 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.


<nowiki>sub fb_mail {
<syntaxhighlight lang="perl">
sub fb_mail {
  my $rcpt = $_[0];
  my $rcpt = $_[0];
  my $subject = $_[1];
  my $subject = $_[1];
Zeile 23: Zeile 31:
  system(&quot;/sbin/mailer send -i '/var/tmp/fhem_nachricht.txt' -s \&quot;$subject\&quot; -t \&quot;$rcpt\&quot;&quot;);
  system(&quot;/sbin/mailer send -i '/var/tmp/fhem_nachricht.txt' -s \&quot;$subject\&quot; -t \&quot;$rcpt\&quot;&quot;);
  system(&quot;rm /var/tmp/fhem_nachricht.txt&quot;);
  system(&quot;rm /var/tmp/fhem_nachricht.txt&quot;);
}</nowiki>
}
Aufruf dann mittels <code>{ fb_mail('empfaenger@mail.de','Subject','text 123') }</code>
</syntaxhighlight>
bzw. <code>{ FB_mail('empfaenger@mail.de','Subject','text 123') }</code>
'''Hinweis:'''Wenn der Aufruf der Mailfunktion aus einem notify oder at erfolgt, muss das @@ in der Adresse des mailempfängers gedoppelt werden, da ein einfaches @ sonst durch den getriggerten device-namen ersetzt würde. Bei Verwendung in der fhem-Kommandozeile oder einem eigenen *Utils.pm ist diese Doppelung nicht erforderlich. Bitte bei den ersten Mails ins Log schauen, ob die Mailadresse wie gewünscht verwendet wird.


Aufruf dann mittels
:<code>{ fb_mail('empfaenger@mail.de','Subject','text 123') }</code>
bzw.
:<code>{ FB_mail('empfaenger@mail.de','Subject','text 123') }</code>


Dem Mailer können noch weitere Parameter hinzugefügt werden. Mehr dazu siehe: [http://www.wehavemorefun.de/fritzbox/Mailer Mailer]
Dem Mailer können noch weitere Parameter hinzugefügt werden. Mehr dazu siehe: [http://www.wehavemorefun.de/fritzbox/Mailer Mailer]


== Synology DiskStation ==
=== OpenWRT  ===
Beim DSM 3.2 gab es keinen <code>sendmail</code>-Befehl, sondern nur eine Funktion für den Versand der System-Benachrichtigungen.
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.
Interessanterweise funktionierte aber der <code>php-mail</code>-Befehl, so dass man mittels folgendem Modul Mails frei versenden kann:
Die Installation erfolgt mittels:
 
<syntaxhighlight lang="bash">
opkg update
opkg install ssmtp_2.64-4_mpc85xx.ipk 
</syntaxhighlight>
 
Hierbei werden die Pakete 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
<syntaxhighlight lang="text">
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
</syntaxhighlight>
 
/etc/ssmtp/revaliases
<syntaxhighlight lang="text">
root:arnold@gmx.net:mail.gmx.net:465
</syntaxhighlight>


  <nowiki>sub sendmail($$$) {
In der [[99_myUtils_anlegen|99_myUtils]] folgende Unterroutine einfügen (von der RPi-Anleitung übernommen):
 
<syntaxhighlight lang="perl">
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";
}
</syntaxhighlight>
 
Ab hier den entsprechenden Abschnitt unter "Raspberry Pi" lesen.
 
=== Synology DiskStation ===
Beim DSM 3.2 gab es keinen <code>sendmail</code>-Befehl, sondern nur eine Funktion für den Versand der System-Benachrichtigungen. Interessanterweise funktionierte aber der <code>php-mail</code>-Befehl, so dass man mittels folgendem Modul Mails frei versenden kann:
<syntaxhighlight lang="perl">
sub sendmail($$$) {
  my($empf, $subj, $nachricht) = @_;
  my($empf, $subj, $nachricht) = @_;
  system(&quot;php -r 'mail(\&quot;$empf\&quot;,\&quot;$subj\&quot;,\&quot;$nachricht\&quot;);'&quot;);
  system(&quot;php -r 'mail(\&quot;$empf\&quot;,\&quot;$subj\&quot;,\&quot;$nachricht\&quot;);'&quot;);
  undef;
  undef;
}</nowiki>
}
== Raspberry Pi ==
</syntaxhighlight>
In der weezy-Version, wie sie von busware zur Verfügung gestellt wird, muss noch sendEmail nachinstalliert werden:


<pre>
=== Raspberry Pi ===
{{Randnotiz|RNTyp=o|RNText=In früheren Distributionen wurde das Paket sowie der Aufruf uU. mit großem "E" geschrieben: ''sendEmail''.}}Auf einem [[Raspberry Pi]] muß noch sendemail nachinstalliert werden. Diese Anleitung funktioniert ab der Stretch-Version von Raspbian bzw. '''Debian''' sowie unter '''Ubuntu''' seit ca. Version 16.04.
<syntaxhighlight lang="bash">
sudo apt-get update
sudo apt-get update
sudo apt-get install sendEmail
sudo apt-get install sendemail libio-socket-ssl-perl libnet-ssleay-perl perl
</pre>
</syntaxhighlight>
 
Man kann die korrekte Funktion im Terminal (ohne <code>{qx()}</code> ) oder auch in der FHEM Kommandozeile testen (Hinweis: manche Provider (z.B. gmail) lassen diesen Zugang erst nach Freischaltung zu!).
<syntaxhighlight lang="perl">
{qx(sendemail -f 'Ab\@send.er' -t 'Emp\@faeng.er' -u 'subject' -m 'text' -a 'DateinameOderLeer' -s 'smtpFQDN:port' -xu 'MailUser' -xp 'PasswortOhneKlammeraffen')}
</syntaxhighlight>


in der [[99_myUtils_anlegen|99_myUtils]] folgende sub einfügen:
{{Hinweis|Bei Gmail muss seit dem 30.6.2022 ein separates Passwort erzeugt werden, die alte Einstellung über "Zugriff durch weniger sichere Apps" funktioniert nicht mehr. Siehe Support Seite Google: https://support.google.com/accounts/answer/185833}}


<nowiki>######## DebianMail  Mail auf dem RPi versenden ############  
Beispiel mit Gmail über Linux Terminalfenster:
sub  
<syntaxhighlight lang="perl">
DebianMail  
sendemail -f 'Der.Absender@gmail.com' -t 'Der.Empfaenger@gmail.com' -u 'subject' -m 'text' -a '' -s 'smtp.gmail.com:587' -xu 'Der.Absender' -xp DASSUPERGEHEIMEPASSW0RT
</syntaxhighlight>
 
In der [[99_myUtils_anlegen|99_myUtils]] folgende Unterroutine einfügen:
<syntaxhighlight lang="perl">
######## DebianMail  Mail auf dem RPi versenden ############  
# $provider für SMTP Server anpassen.
# Einmal in der FHEM Kommandozeile, user und password anpassen:
# {setKeyValue("myEmailKonto",'user@domain');;setKeyValue("myEmailPasswrd",'password')}
sub DebianMail  
{  
{  
  my $rcpt = shift;
  my $rcpt = shift;
  my $subject = shift;  
  my $subject = shift;  
  my $text = shift;  
  my $text = shift;  
  my $ret = &quot;&quot;;
  my $attach = shift;  
  my $sender = &quot;absender\@account.de&quot;;  
  my $ret = "";
  my $konto = &quot;kontoname\@account.de&quot;;
my $error;
  my $passwrd = &quot;passwrd&quot;;
  my $konto = getKeyValue("myEmailKonto");  
  my $provider = &quot;smtp.provider.de&quot;;
  my $passwrd = getKeyValue("myEmailPasswrd");  
  Log 1, &quot;sendEmail RCP: $rcpt&quot;;
my $from = $konto; # or use different KeyValue if konto is not the from email address
  Log 1, &quot;sendEmail Subject: $subject&quot;;
  my $provider = "smtp.1und1.de"; # smtp.domain.tld:port see provider documentation
  Log 1, &quot;sendEmail Text: $text&quot;;
  #Log 1, "sendEmail RCP: $rcpt";
   
  #Log 1, "sendEmail Subject: $subject";
  $ret .= qx(sendEmail -f '$sender' -t '$rcpt' -u '$subject' -m '$text' -s '$provider' -xu '$konto' -xp '$passwrd' -o tls=no);
  #Log 1, "sendEmail Text: $text";
#Log 1, "sendEmail Anhang: $attach";
  if (not defined($attach)){$attach=''}
  $ret .= qx(sendemail -f '$from' -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  
  $ret =~ s,[\r\n]*,,g;    # remove CR from return-string  
  Log 1, &quot;sendEmail returned: $ret&quot;;  
  Log 1, "sendemail returned: $ret";  
}</nowiki>
}
Beim Aufruf der Funktion gibt es zwei unterschiedliche Verhaltensweisen zu beachten. Wird DebianMail durch ein Fhem-Ereignis als Makro mit "Transferzeichen", wie @ oder&#160;% aufgerufen, so sind diese innerhalb des Aufrufs von DebianMail zu maskieren.
###############################################################################
</syntaxhighlight>


Siehe auch commandref:
Die Zugangsdaten für den Email-Account müssen dabei FHEM-intern gespeichert werden. Dazu gibt man einmalig über die Kommandozeile folgendes ein (user@domain und password müssen auf den Email Account geändert werden):
◾The character @ will be replaced with the device name. To use @ in the text itself, use the double mode (@@).
:<code><nowiki>  {setKeyValue("myEmailKonto",'user@domain');;setKeyValue("myEmailPasswrd",'password')}</nowiki></code>
◾The macro&#160;%&lt;parameter&gt; will expand to the current value of the named parameter. This can be either a parameter from the device definition or a parameter from the set or get command.


Beispiel:
Um die TLS Verschlüsselung (ehem. SSL) nicht zu nutzen, muss in der viertletzten Zeile tls=no verwendet und der Port des Mailproviders auf 25 eigetragen werden. Sollte anschließend keine Mail verschickt werden, siehe Probleme.


<nowiki>define Sonstiges notify Fenster:Window:.*,.*Low.Batt*. {\
Falls der Body-Text in einem (Android-)Mailer auf dem Handy nicht gezeigt wird, kann der Parameter '''-o message-content-type=html''' helfen.
DebianMail('email@@email.domain','Subject','Text');;\
}</nowiki>
in allen anderen Fällen muss die Maskierung entfallen:


Beispiel:
Die Funktion kann beispielsweise folgendermaßen aufgerufen werden:
{{Randnotiz|RNTyp=g|RNText=Bei allen Feldern können generell doppelte " oder einfache ' Anführungszeichen verwendet werden. Innerhalb von "" müssen Sonderzeichen wie @ aber maskiert werden, da sie sonst als Steuerzeichen interpretiert werden:
:<code><nowiki>"email\@email.domain" oder 'email@email.domain'</nowiki></code>
}}
Direkt in der FHEM Kommandozeile (ohne Anhang)
:<code><nowiki>{DebianMail("email\@email.domain","Subject","Text")}</nowiki></code>
Die ordnungsgemäße Ausführung wird mit 71 quittiert.
Beispiele mehrere Anhänge (Es ist wichtig Dateinamen mit Leerzeichen in separate Anführungszeichen zu setzen)<syntaxhighlight lang="perl">
{DebianMail("email\@email.domain","Subject","Text","Anhang1 Anhang2 Anhang3")}
{DebianMail('email@email.domain','Subject','Text',"'with spaces Anhang1' 'with spaces Anhang2'")}
</syntaxhighlight>oder (mehr als einen Empfänger, diese können durch Leerzeichen, Semikolon oder Komma getrennt sein)


<nowiki>define Sonstiges at *01:00:00 {\
<syntaxhighlight lang="text">
DebianMail('email@email.domain','Subject','Text');;\
define Sonstiges at *01:00:00 {\
}</nowiki>
DebianMail('email@email.domain,email2@email.domain',"Subject","Text","'Anhang1' 'Anhang2' ...");;\
}
</syntaxhighlight>
{{Randnotiz|RNTyp=y|RNText=Eine erweiterte - nicht blockierende - Version des Scripts ist [[SSCAM_-_Steuerung_von_Kameras_in_Synology_Surveillance_Station#Mail mit Snapshot im Anhang und Aufnahmelink versenden (sendEmail)|hier]] zu finden}}


== BeagleBoard-xM ==
=== BeagleBoard-xM ===
Auf einem [[:Kategorie:BeagleBoard-xM|BeagleBoard-xM]] mit einem [http://en.opensuse.org/HCL:BeagleBoard-xM OpenSUSE 12.2] kann man ebenfalls das Perl-Programm ''sendEmail''wie beim RPi nutzen. Dies gibt es aber nicht in den Repositorys 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)
Auf einem [[:Kategorie:BeagleBoard-xM|BeagleBoard-xM]] mit einem [http://en.opensuse.org/HCL:BeagleBoard-xM 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).
 
<syntaxhighlight lang="bash">
<nowiki>$ zypper in wget
$ zypper in wget
$ cd /opt
$ cd /opt
$ wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz
$ wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz
$ tar xvfz sendEmail-v1.56.tar.gz
$ tar xvfz sendEmail-v1.56.tar.gz
$ cd sendEmail-v1.56
$ cd sendEmail-v1.56
$ cp sendMail /usr/local/bin</nowiki>
$ cp sendMail /usr/local/bin
</syntaxhighlight>
Dann geht man weiter vor wie unter RPi beschrieben (anlegen der SUB-Routine in 99_myUtils usw.).
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. Vlt. schauen Sie trotzdem vorher auf der [http://caspian.dotconf.net/menu/Software/SendEmail/ Homepage von sendEmail] nach.
'''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 [http://caspian.dotconf.net/menu/Software/SendEmail/ Homepage von sendEmail] nach.


= Windows =
== Windows ==
1. Kopiere die Datei sendEmail.exe* in Dein FHEM Verzeichnis.
# Kopiere die Datei sendEmail.exe* in Dein FHEM Verzeichnis (hier c:\fhem-5.0\); Quelle: [http://caspian.dotconf.net/menu/Software/SendEmail/ Homepage von sendEmail]
(Hier c:\fhem-5.0\)
# Erstelle im FHEM Verzeichnis die Datei wmail.bat mit folgendem Inhalt (eine Zeile):
:<code>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"</code>
# Beispiel fhem.cfg
## Mail wenn sich der Status von Heizung.* oder Hzg.* ändert <br><code>define Mail_Heizung notify Heizung.*|Hzg.* { system("wmail $NAME:$EVENT")}</code>
## Mail bei Signal Aussentemperatur (für dieses Beispiel wird [http://fhem.de/commandref.html#getstate http://fhem.de/commandref.html#getstate getstate] benötigt) <br><code>define Mail_Aussentemperatur notify Aussentemperatur {\</code><br><code>my ($val);;\</code><br><code>$val = fhem "getstate $NAME";;\</code><br><code>system("wmail \"$NAME: $val\"");;\</code><br><code>}</code>


Quelle: [http://caspian.dotconf.net/menu/Software/SendEmail/ http://caspian.dotconf.net/menu/Software/SendEmail/]
== Probleme ==
=== sendEmail / sendemail (Schreibweise alt / neu )  ===
Erhält man Fehler bez. TLS (''ERROR => TLS setup failed: SSL connect attempt failed error: ...'' ), sind eventuell die ca-certificates veraltet oder nicht installiert. Prüfung:
:<code>apt-cache policy ca-certificates</code>
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.


2. Erstelle im FHEM Verzeichnis die Datei wmail.bat mit folgendem
Hierzu setzt man in der FHEM-Befehlszeile die folgende Anweisung ab:
Inhalt (eine Zeile):
:<code>{ SUB-Routinen-Name('EMailAdresse@Mail.Domain','Test','Test-Text');; }</code>
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 &lt;Enter&gt; (nicht "save"). Empfangen Sie nicht kurzfristig eine entsprechende E-Mail, ist sehr wahrscheinlich an den Zugangsdaten etwas verkehrt.


<nowiki>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"</nowiki>
Vor dem testen der Routine oben kann sendEmail auch über die Konsole (z.&nbsp;B. via ssh) getestet werden:
:<code>sendEmail -vv -f 'Absender@AbsDomain.de' -t 'Empfänger@EmpfDomain.de' -u 'subject' -m 'body' -s 'smtp.AbsDomain.de' -xu 'AbsenderBenutzername' -xp 'AbsenderPasswort' -o tls=yes</code>


3. Beispiele fhem.cfg
=== Keine Mail mit TLS Verschlüsselung ===
{{Randnotiz|RNTyp=y|RNText=Diese Information trifft nur auf alte Systeme zu, aktuell (2021) befindet sich in Zeile 1933 der korrekte Code}}
Prüfung mit <code>grep -n SSLv /usr/bin/sendEmail</code>


3.a Mail wenn sich der Status von Heizung.* oder Hzg.* ändert
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')) {


<nowiki>define Mail_Heizung notify Heizung.*|Hzg.* { system("wmail @:%")}</nowiki>
in folgendes geändert werden
 
  if (! IO::Socket::SSL->start_SSL($SERVER, SSL_version => 'SSLv23:!SSLv2')) {
3.b Mail bei Signal Aussentemperatur (Für diese Beispiel wird getstate
benötigt [http://fhem.de/commandref.html#getstate http://fhem.de/commandref.html#getstate])
 
<nowiki>define Mail_Aussentemperatur notify Aussentemperatur {\
my ($val);;\
$val = fhem "getstate @";;\
system("wmail \"@: $val\"");;\
}</nowiki>
= Probleme =
== sendEmail ==
Falls man keine E-Mails verschicken kann, kann man als 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:


<nowiki>{ SUB-Routinen-Name('EMailAdresse@Mail.Domain','Test','Test-Text');; }</nowiki>
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.
und ersetzt ''SUB-Routinen-Name''mit dem 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 &lt;Enter&gt; (nicht "save"). Empfangen Sie nicht kurzfristig eine entsprechende E-Mail, ist sehr wahrscheinlich an den Zugangsdaten etwas verkehrt.


== Email laut log gesendet aber nicht ist angekommen? ==
=== 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.  
Dann bitte in der Fritzbox Oberfläche überpüfen, ob unter "System" -> "Push Service" selbiger eingerichtet und aktiviert wurde.  


[[Kategorie:HOWTOS]]
[[Kategorie:HOWTOS]]
[[Kategorie:FritzBox]]
[[Kategorie:BeagleBoard-xM]]
[[Kategorie:Raspberry Pi]]
[[Kategorie:E-Mail]]

Aktuelle Version vom 12. August 2022, 08:51 Uhr

Um aus FHEM heraus E-Mail senden zu können, sind abhängig von der verwendeten Platform unterschiedliche Vorgehensweisen erforderlich.

Emblem-question-yellow.svgAnleitung zur Einrichtung von Exim4 auf Debian mit GMX als Smarthost:PDF

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(&quot;/bin/echo \&quot;$text\&quot; | /usr/bin/mail send -i - -s \&quot;$subject\&quot; -t \&quot;$rcpt\&quot;&quot;);
}

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(&quot;/bin/echo \&quot;$text\&quot; &gt; /var/tmp/fhem_nachricht.txt&quot;);
 system(&quot;/sbin/mailer send -i '/var/tmp/fhem_nachricht.txt' -s \&quot;$subject\&quot; -t \&quot;$rcpt\&quot;&quot;);
 system(&quot;rm /var/tmp/fhem_nachricht.txt&quot;);
}

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 Pakete 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(&quot;php -r 'mail(\&quot;$empf\&quot;,\&quot;$subj\&quot;,\&quot;$nachricht\&quot;);'&quot;);
 undef;
}

Raspberry Pi

Info green.pngIn früheren Distributionen wurde das Paket sowie der Aufruf uU. mit großem "E" geschrieben: sendEmail.

Auf einem Raspberry Pi muß noch sendemail nachinstalliert werden. Diese Anleitung funktioniert ab der Stretch-Version von Raspbian bzw. Debian sowie unter Ubuntu seit ca. Version 16.04.

sudo apt-get update
sudo apt-get install sendemail libio-socket-ssl-perl libnet-ssleay-perl perl

Man kann die korrekte Funktion im Terminal (ohne {qx()} ) oder auch in der FHEM Kommandozeile testen (Hinweis: manche Provider (z.B. gmail) lassen diesen Zugang erst nach Freischaltung zu!).

{qx(sendemail -f 'Ab\@send.er' -t 'Emp\@faeng.er' -u 'subject' -m 'text' -a 'DateinameOderLeer' -s 'smtpFQDN:port' -xu 'MailUser' -xp 'PasswortOhneKlammeraffen')}


Info blue.png
Bei Gmail muss seit dem 30.6.2022 ein separates Passwort erzeugt werden, die alte Einstellung über "Zugriff durch weniger sichere Apps" funktioniert nicht mehr. Siehe Support Seite Google: https://support.google.com/accounts/answer/185833


Beispiel mit Gmail über Linux Terminalfenster:

sendemail -f 'Der.Absender@gmail.com' -t 'Der.Empfaenger@gmail.com' -u 'subject' -m 'text' -a '' -s 'smtp.gmail.com:587' -xu 'Der.Absender' -xp DASSUPERGEHEIMEPASSW0RT

In der 99_myUtils folgende Unterroutine einfügen:

######## DebianMail  Mail auf dem RPi versenden ############ 
# $provider für SMTP Server anpassen. 
# Einmal in der FHEM Kommandozeile, user und password anpassen:
# {setKeyValue("myEmailKonto",'user@domain');;setKeyValue("myEmailPasswrd",'password')}
sub DebianMail 
{ 
 my $rcpt = shift;
 my $subject = shift; 
 my $text = shift; 
 my $attach = shift; 
 my $ret = "";
 my $error;
 my $konto = getKeyValue("myEmailKonto"); 
 my $passwrd = getKeyValue("myEmailPasswrd"); 
 my $from = $konto; # or use different KeyValue if konto is not the from email address
 my $provider = "smtp.1und1.de"; # smtp.domain.tld:port see provider documentation
 #Log 1, "sendEmail RCP: $rcpt";
 #Log 1, "sendEmail Subject: $subject";
 #Log 1, "sendEmail Text: $text";
 #Log 1, "sendEmail Anhang: $attach";
 if (not defined($attach)){$attach=''}
 $ret .= qx(sendemail -f '$from' -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"; 
}
###############################################################################

Die Zugangsdaten für den Email-Account müssen dabei FHEM-intern gespeichert werden. Dazu gibt man einmalig über die Kommandozeile folgendes ein (user@domain und password müssen auf den Email Account geändert werden):

{setKeyValue("myEmailKonto",'user@domain');;setKeyValue("myEmailPasswrd",'password')}

Um die TLS Verschlüsselung (ehem. SSL) nicht zu nutzen, muss in der viertletzten 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:

Info green.pngBei allen Feldern können generell doppelte " oder einfache ' Anführungszeichen verwendet werden. Innerhalb von "" müssen Sonderzeichen wie @ aber maskiert werden, da sie sonst als Steuerzeichen interpretiert werden:
"email\@email.domain" oder 'email@email.domain'

Direkt in der FHEM Kommandozeile (ohne Anhang)

{DebianMail("email\@email.domain","Subject","Text")}

Die ordnungsgemäße Ausführung wird mit 71 quittiert.

Beispiele mehrere Anhänge (Es ist wichtig Dateinamen mit Leerzeichen in separate Anführungszeichen zu setzen)

{DebianMail("email\@email.domain","Subject","Text","Anhang1 Anhang2 Anhang3")}
{DebianMail('email@email.domain','Subject','Text',"'with spaces Anhang1' 'with spaces Anhang2'")}

oder (mehr als einen Empfänger, diese können durch Leerzeichen, Semikolon oder Komma getrennt sein)

define Sonstiges at *01:00:00 {\
DebianMail('email@email.domain,email2@email.domain',"Subject","Text","'Anhang1' 'Anhang2' ...");;\
}
Emblem-question-yellow.svgEine erweiterte - nicht blockierende - Version des Scripts ist hier zu finden


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

  1. Kopiere die Datei sendEmail.exe* in Dein FHEM Verzeichnis (hier c:\fhem-5.0\); Quelle: Homepage von sendEmail
  2. 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"
  1. Beispiel fhem.cfg
    1. Mail wenn sich der Status von Heizung.* oder Hzg.* ändert
      define Mail_Heizung notify Heizung.*|Hzg.* { system("wmail $NAME:$EVENT")}
    2. 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\"");;\
      }

Probleme

sendEmail / sendemail (Schreibweise alt / neu )

Erhält man Fehler bez. TLS (ERROR => TLS setup failed: SSL connect attempt failed error: ... ), sind eventuell die ca-certificates veraltet oder nicht installiert. Prüfung:

apt-cache policy ca-certificates

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 ssh) getestet werden:

sendEmail -vv -f 'Absender@AbsDomain.de' -t 'Empfänger@EmpfDomain.de' -u 'subject' -m 'body' -s 'smtp.AbsDomain.de' -xu 'AbsenderBenutzername' -xp 'AbsenderPasswort' -o tls=yes

Keine Mail mit TLS Verschlüsselung

Emblem-question-yellow.svgDiese Information trifft nur auf alte Systeme zu, aktuell (2021) befindet sich in Zeile 1933 der korrekte Code

Prüfung mit grep -n SSLv /usr/bin/sendEmail

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.