E-Mail senden: Unterschied zwischen den Versionen
KKeine Bearbeitungszusammenfassung |
KKeine Bearbeitungszusammenfassung |
||
Zeile 4: | Zeile 4: | ||
Eine Liste mit ressourcensparenden E-Mails Clients findet man bei dem OpenWRT Projekt: https://openwrt.org/docs/guide-user/services/email/smtp.client | Eine Liste mit ressourcensparenden E-Mails Clients findet man bei dem OpenWRT Projekt: https://openwrt.org/docs/guide-user/services/email/smtp.client | ||
=== MSGMail (Linux, Windows) === | |||
FHEM bringt ein eigenes Device zum Senden von E-Mails mit, welches in Perl implementiert ist: [https://fhem.de/commandref.html#MSGMail MSGMail, https://fhem.de/commandref.html#MSGMail] | |||
=== CURL (Linux, Windows) === | === CURL (Linux, Windows) === |
Version vom 18. Februar 2025, 17:53 Uhr
Um aus FHEM heraus '''E-Mails senden''' zu können, gibt es unterschiedliche Methoden, abhängig von der verwendeten Plattform.
Lange Zeit war sendemail
sehr beliebt. Da aber die Homepage des Projekts nicht mehr online ist und Probleme nur noch via erhöhtem Supportaufwand gelöst werden, sollte diese Option als veraltet betrachtet werden.
Eine Liste mit ressourcensparenden E-Mails Clients findet man bei dem OpenWRT Projekt: https://openwrt.org/docs/guide-user/services/email/smtp.client
MSGMail (Linux, Windows)
FHEM bringt ein eigenes Device zum Senden von E-Mails mit, welches in Perl implementiert ist: MSGMail, https://fhem.de/commandref.html#MSGMail
CURL (Linux, Windows)
CURL kann auf praktisch jedem Betriebssystem genutzt werden, selbst unter Windows. Es kann direkt mit einem SMTP Server E-Mails versenden und stellt damit eine moderne, portable und sichere Option zum Versenden von E-Mails dar.
In FHEM richtet man sich ein Device ein und passt die Details ($emailTo, $emailFrom, $emailServer
) an.
defmod sendMail dummy
attr sendMail readingList message password
attr sendMail setList message password
attr sendMail userReadings result:message:.* {\
my $emailTo = 'you@example.com';;\
my $emailFrom = 'fhem@domain.com';;\
my $emailServer = 'mail.smtpserver.de';;\
\
# Passwort aus getKeyValue abrufen\
my ($err, $emailPass) = getKeyValue("${name}_password");;\
if ($err || !defined $emailPass) {\
return "Error retrieving password: $err";;\
}\
\
my $message = ReadingsVal($name, 'message', '???');;\
my $subject = "$name: FHEM Nachricht";;\
\
# Betreff extrahieren und aus der Nachricht entfernen\
if ($message =~ s/(?:Subject|Betreff)="(.*?)"//) {\
$subject = $1;;\
}\
\
# Empfänger extrahieren und aus der Nachricht entfernen\
if ($message =~ s/(?:To|An)="(.*?)"//) {\
$emailTo = $1;;\
}\
\
#my $cmd = "echo 'Subject: $subject\\nFrom: $emailFrom\\nTo: $emailTo\\n\\n$message' | ";;\
my $cmd = "echo 'Subject: $subject\\r\\n";;\
$cmd .= "From: $emailFrom\\r\\n";;\
$cmd .= "To: $emailTo\\r\\n";;\
$cmd .= "Content-Type: text/plain;; charset=UTF-8\\r\\n";;\
$cmd .= "\\r\\n";;\
$cmd .= "$message' | ";;\
\
$cmd .= "curl -m 2.0 --noproxy '*' --no-progress-meter --ssl-reqd smtps://$emailServer:465 ";;\
$cmd .= "--user '$emailFrom:$emailPass' --mail-from '$emailFrom' --mail-rcpt '$emailTo' ";;\
$cmd .= "--write-out 'Email sent with status %{http_code}\n' ";;\
$cmd .= "--upload-file - 2>&1";;\
\
return qx/$cmd/;;\
},\
result:password:.* {\
# Passwort speichern\
my $ret = setKeyValue("${name}_password", ReadingsVal($name, 'password', undef)) // "password stored";;\
\
#password wieder aus der Variablen rausnehmen, soll nicht sichtbar bleiben:\
#\
# Hinweis: das Password taucht beim Setzen hierüber im Event-Log auf!\
# Alternativ: { setKeyValue("sendMail_password", "geheimesPasswort") }\
readingsBulkUpdate($hash, "password", "****");;\
\
return "$ret";;\
}
Das Passwort setzt man mit:
set sendMail password geheimesPasswort
- Alternativ, damit das Passwort nicht im Log auftaucht:
{ setKeyValue("sendMail_password", "geheimesPasswort") }
E-Mails kann man dann Senden mit:
set sendMail message Mein Text
(es wird der Standardbetreff und Empfänger aus dem Snippet genutzt)set sendMail message Betreff="Mein Betreff" Mein Text
(es wird der Empfänger aus dem Snippet genutzt)set sendMail message Subject="Dies ist ein Test" Mein Text
set sendMail message To="jemand@example.com" Mein Text
set sendMail message An="jemand@example.com" Mein Text
set sendMail message An="jemand@example.com" Betreff="Mein Betreff" Mein Text
set sendMail message To="jemand@example.com" Subject="Mein Betreff" Mein Text
set sendMail message Subject="✅ Dies ist ein Test" Meldung mit Emoji ⚽ geht auch
Forumlink
https://forum.fhem.de/index.php?topic=140814.0
EXIM4 (Debian)
Eine Anleitung zum Versenden von E-Mails mit Exim ist als PDF verfügbar: PDF
SSMTP (OpenWRT, embedded Distros)
Installation
opkg update
opkg install ssmtp_2.64-4_mpc85xx.ipk
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:
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";
}
PHP Mail Funktion (Synology DiskStation)
Beim DSM 3.2 funktioniert der php-mail
-Befehl, so dass man mittels folgendem Modul E-Mails versenden kann:
sub sendmail($$$) {
my($empf, $subj, $nachricht) = @_;
system("php -r 'mail(\"$empf\",\"$subj\",\"$nachricht\");'");
undef;
}
Sendemail (Veraltet, Debian-basierende Distros)
Es handelt sich um ein Perl Programm, dass man aus den Paketquellen installieren kann.
Es gibt Probleme:
- mit der TLS bzw STARTTLS Verschlüsselung (https://github.com/fhem/fhem-docker/issues/254, https://www.mail-archive.com/debian-bugs-dist@lists.debian.org/msg1915977.html) ,
- Der Webseite des Projekts (https://web.archive.org/web/20190906140125/http://caspian.dotconf.net/menu/Software/SendEmail) ist nicht mehr verfügbar,
weswegen diese Lösung als technisch überholt gelten sollte.
Installation:
sudo apt-get update
sudo apt-get install sendemail libio-socket-ssl-perl libnet-ssleay-perl perl
Testaufruf:
{qx(sendemail -f 'Ab\@send.er' -t 'Emp\@faeng.er' -u 'subject' -m 'text' -a 'DateinameOderLeer' -s 'smtpFQDN:port' -xu 'MailUser' -xp 'PasswortOhneKlammeraffen')}

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:

"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' ...");;\
}