E-Mail senden: Unterschied zwischen den Versionen

Aus FHEMWiki
(FHEM auf Fritzbox ist nicht mehr aktuell und deswegen sind die E-Mail Hinweise dazu obsolet. sendemail ist nur noch mit erhötem Supportaufwand zu betreiben und sollte deswegen aus dem Wiki entfernt werden. Technisch aktuell wäre curl, das wird hier noch ergänzt.)
(CURL Option hinzugefügt)
Zeile 1: Zeile 1:
Um aus FHEM heraus <nowiki>'''</nowiki>E-Mails senden<nowiki>'''</nowiki> zu können, gibt es unterschiedliche Methoden, abhängig von der verwendeten Plattform.
Um aus FHEM heraus <nowiki>'''</nowiki>E-Mails senden<nowiki>'''</nowiki> zu können, gibt es unterschiedliche Methoden, abhängig von der verwendeten Plattform.
{{Randnotiz|RNTyp=y|RNText=Anleitung zur Einrichtung von Exim4 auf Debian mit GMX als Smarthost:[[Media:Anleitung_Exim4_Debian_GMX.pdf|PDF]]}}




Zeile 6: Zeile 7:


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
{{Randnotiz|RNTyp=y|RNText=Anleitung zur Einrichtung von Exim4 auf Debian mit GMX als Smarthost:[[Media:Anleitung_Exim4_Debian_GMX.pdf|PDF]]}}
== Linux ==


==== SSMTP (OpenWRT, embedded Distros) ====
=== 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 an:<syntaxhighlight lang="perl">
defmod sendMail dummy
attr sendMail readingList message
attr sendMail setList message
attr sendMail userReadings result:message:.* {\
        my $message = ReadingsVal($name, 'message', '???');;\
        my $subject = "$name: FHEM Nachricht";;\
        \
        # Betreff extrahieren und aus der Nachricht entfernen\
        if ($message =~ s/(?:Subject|Betreff)="(.*?)"//) {\
            $subject = $1;;\
        }\
        \
        my $emailTo  = 'you@example.com';;\
        my $emailFrom = 'fhem@domain.com';;\
        my $emailPass = 'geheimesPasswort';;\
        my $emailServer = 'mail.smtpserver.de';;\
        \
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 --noproxy '*' --no-progress-meter --ssl-reqd smtps://$emailServer:465 ";;\
        $cmd .= "--user '$emailFrom:$emailPass' --mail-from '$emailFrom' --mail-rcpt '$emailTo' ";;\
        $cmd .= "--write-out 'Email sent successfully with status %{http_code}\n' ";;\
        $cmd .= "--upload-file - 2>&1";;\
        \
        return qx/$cmd/;;\
    }
 
</syntaxhighlight>E-Mails kann man dann senden mit:
 
* set sendMail message Mein Text
* set sendMail message Betreff="Mein Betreff" Mein Text
* set sendMail message Subject="Dies ist ein Test" Mein Text
* set sendMail message Subject="✅ Dies ist ein Test" Meldung mit Emoji ⚽ geht auch
 
=== SSMTP (OpenWRT, embedded Distros) ===


===== Installation =====
==== Installation ====
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
opkg update
opkg update
Zeile 54: Zeile 96:
Ab hier den entsprechenden Abschnitt unter "Raspberry Pi" lesen.
Ab hier den entsprechenden Abschnitt unter "Raspberry Pi" lesen.


==== PHP Mail Funktion (Synology DiskStation) ====
=== PHP Mail Funktion (Synology DiskStation) ===
Beim DSM 3.2 funktioniert der <code>php-mail</code>-Befehl, so dass man mittels folgendem Modul E-Mails versenden kann:
Beim DSM 3.2 funktioniert der <code>php-mail</code>-Befehl, so dass man mittels folgendem Modul E-Mails versenden kann:
<syntaxhighlight lang="perl">
<syntaxhighlight lang="perl">
Zeile 64: Zeile 106:
</syntaxhighlight>
</syntaxhighlight>


==== Sendemail (Veraltet, Debian-basierende Distros) ====
=== Sendemail (Veraltet, Debian-basierende Distros) ===
Es handelt sich um ein Perl Programm, dass man aus den Paketquellen installieren kann.
Es handelt sich um ein Perl Programm, dass man aus den Paketquellen installieren kann.


Zeile 74: Zeile 116:
weswegen diese Lösung als technisch überholt gelten sollte.
weswegen diese Lösung als technisch überholt gelten sollte.


'''Installation:'''<syntaxhighlight lang="bash">
==== '''Installation:''' ====
<syntaxhighlight lang="bash">
sudo apt-get update
sudo apt-get update
sudo apt-get install sendemail libio-socket-ssl-perl libnet-ssleay-perl perl
sudo apt-get install sendemail libio-socket-ssl-perl libnet-ssleay-perl perl
</syntaxhighlight>'''Testaufruf:'''<syntaxhighlight lang="perl">
</syntaxhighlight>
 
==== '''Testaufruf:''' ====
<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')}
{qx(sendemail -f 'Ab\@send.er' -t 'Emp\@faeng.er' -u 'subject' -m 'text' -a 'DateinameOderLeer' -s 'smtpFQDN:port' -xu 'MailUser' -xp 'PasswortOhneKlammeraffen')}
</syntaxhighlight>{{Hinweis|Seit dem 30.6.2022 muss für Gmail ein separates Passwort erzeugt werden. Siehe [https://support.google.com/accounts/answer/185833 Google Support].}}Beispiel mit Gmail über Linux Terminalfenster:<syntaxhighlight lang="perl">
</syntaxhighlight>{{Hinweis|Seit dem 30.6.2022 muss für Gmail ein separates Passwort erzeugt werden. Siehe [https://support.google.com/accounts/answer/185833 Google Support].}}Beispiel mit Gmail über Linux Terminalfenster:<syntaxhighlight lang="perl">

Version vom 18. Februar 2025, 07:44 Uhr

Um aus FHEM heraus '''E-Mails senden''' zu können, gibt es unterschiedliche Methoden, abhängig von der verwendeten Plattform.

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


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

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 an:

defmod sendMail dummy
attr sendMail readingList message
attr sendMail setList message
attr sendMail userReadings result:message:.* {\
        my $message = ReadingsVal($name, 'message', '???');;\
        my $subject = "$name: FHEM Nachricht";;\
        \
        # Betreff extrahieren und aus der Nachricht entfernen\
        if ($message =~ s/(?:Subject|Betreff)="(.*?)"//) {\
            $subject = $1;;\
        }\
        \
        my $emailTo   = 'you@example.com';;\
        my $emailFrom = 'fhem@domain.com';;\
        my $emailPass = 'geheimesPasswort';;\
        my $emailServer = 'mail.smtpserver.de';;\
        \
	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 --noproxy '*' --no-progress-meter --ssl-reqd smtps://$emailServer:465 ";;\
        $cmd .= "--user '$emailFrom:$emailPass' --mail-from '$emailFrom' --mail-rcpt '$emailTo' ";;\
        $cmd .= "--write-out 'Email sent successfully with status %{http_code}\n' ";;\
        $cmd .= "--upload-file - 2>&1";;\
        \
        return qx/$cmd/;;\
    }

E-Mails kann man dann senden mit:

  • set sendMail message Mein Text
  • set sendMail message Betreff="Mein Betreff" Mein Text
  • set sendMail message Subject="Dies ist ein Test" Mein Text
  • set sendMail message Subject="✅ Dies ist ein Test" Meldung mit Emoji ⚽ geht auch

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"; 
}

Ab hier den entsprechenden Abschnitt unter "Raspberry Pi" lesen.

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

Sendemail (Veraltet, Debian-basierende Distros)

Es handelt sich um ein Perl Programm, dass man aus den Paketquellen installieren kann.

Es gibt Probleme:

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')}
Info blue.png
Seit dem 30.6.2022 muss für Gmail ein separates Passwort erzeugt werden. Siehe Google Support.

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