Ergänzung zum Thema E-Mail auf dem Raspbery Pi senden

Begonnen von Schnup, 13 November 2013, 19:16:29

Vorheriges Thema - Nächstes Thema

Schnup

Als Einsteiger in die Welt von Fhem und dem Raspbery Pi fehlten mir im WIKI-Beitrag "E-Mail senden" noch ein paar Erklärungen.
Inzwischen läuft die Funktion bei mir und ich möchte meine Erkenntnisse auch anderen Neueinsteigern zur Verfügung stellen.
Es wäre schön wenn ein erfahrener Nutzer einen prüfenden Blick darauf wirft.


Ergänzende Beschreibung zum Einrichten einer Mail-Funktion auf einem Raspberry Pi

Voraussetzung
Bei der Debian Version 7.x (Codename Wheezy) ist das Skript "sendEmail" nicht standardmäßig installiert.

1. Über das Konsolentool "which" lässt sich herausfinden, ob das Skript bereits installiert ist
      sudo which sendEmail
   Ist das Skript vorhanden, wird "/usr/bin/sendEmail" zurückgegeben und die beiden nächsten Punkte können übersprungen werden.

2. Vor einer Installation eines Pakets empfiehlt es sich zuerst die lokale Paketdatenbank zu aktualisieren:
     sudo apt-get update
   Es kann schon einen Moment dauern bis alle Pakete geprüft und ggf. aktualisiert sind!   
   
3. Das Skript "sendEmail" über die Paketverwaltung "apt-get" installieren:
     sudo apt-get install sendEmail
   Hier müssen ggf. noch Optionen bestätigt werden, danach steht das Skript zur Verfügung.


Verwendung
Zum Versenden einer E-Mail erfordert das Debian-Skript die Übergabe aller notwendigen Zugangsdaten.
Dabei können die Angaben zu Absender, Server/Provider, User, Passwort und Optionen in der Regel als konstant angesehen werden und müssen deshalb auch nur einmal definiert werden.
Veränderbare Parameter sind üblicherweise nur Empfänger-Adresse, Betreffzeile und der Inhalt der Nachricht.

Um unter Fhem nicht immer alle acht Parameter übergeben zu müssen, wird eine zusätzliche Funktion in der Datei "99_myUtils" angelegt. Als Vorlage dient, die im FHEMWikki beschriebene Unterroutine "DebianMail".
siehe auch  http://www.fhemwiki.de/wiki/E-Mail_senden

In der Funktion "DebianMail" werden die konstanten Zugangsdaten in Variablen ("my") gespeichert und zusammen mit den veränderbaren Parametern an das Debian-Skript übergeben.
HINWEIS: Dadurch wird "99_myUtils.pm" zu einer individuellen Datei, nur für die hier eingetragene Mail-Umgebung!

Zuordnung Parameter und "my" Variablen:
Die Funktion wird aus FHEM mit drei Parametern (Ziel-Adresse, Betreff, Text der Nachricht) aufgerufen.
Über "shift" werden die Werte in die ersten drei Variablen übernommen.   
   
   Debian-Sript Parameter  | my Variable  | Beschreibung 
    -t  ADDRESS [ADDR ...] | $rcpt        | E-Mail Adresse des Empfängers
    -u  SUBJECT            | $subject     | Text der Betreffzeile   
    -m  MESSAGE            | $text        | Text der Nachricht

An vierter Stelle steht die Variable "$ret", die intern für die Rückgabemeldung benötigt wird.   
   
In den folgenden Variablen werden die individuellen Zugangsdaten eingetragen.
WICHTIG: vor dem "@" Zeichen wird immer ein zusätzlicher Backslash "\" eingetragen!

    -f  ADDRESS            | $sender      | Alias-Adresse des Absenders mit "\@" anstatt "@"
   -xu USERNAME            | $konto       | Konto-Adresse bzw. SMTP Username mit "\@" anstatt "@"
   -xp PASSWORD            | $passwrd     | Passwort (Verschlüsselung?)
    -s  SERVER[:PORT]      | $provider    | E-Mail-Anbieter bzw. SMTP Serveradresse:Port

   
Der achte Parameter "-o tls=no" wird direkt übergeben und schaltet Transport Layer Security bzw. (SSL für SMTP) aus.


Besonderheit beim Aufruf der Funktion
Einige Fhem Funktionen z.B. "notyfy" und "ECMD" verwenden im Moment noch das "@" als Transferzeichen für die Rückgabe des Gerätenamens. Aus diesem Grund muss bei diesen Funktionen das "@" Zeichen in der Ziel-Adresse oder evt. auch im Text durch ein Doppelzeichen "@@" ersetzt bzw. maskiert werden.
Bei den anderen Fhem-Funktionen ist eine solche Maskierung nicht erforderlich.
 
Ein Beispiel, wo DebianMail() zusammen mit "notify" eingesetzt wird:       
    define n_batt_chk notify .*:[Bb]attery.* { if("%" !~ m/ok/) { \
      { DebianMail('Ziel@@Adresse.de', 'FHEM-Meldung', 'BatterieWechsel erforderlich bei @ -> Status: %')};; \   
      } \
    }
Die Funktion "n_batt_chk" prüft alle Geräte mit Hilfe von "notify" auf den Zustand von "Battery" bzw. "battery"  und ersetzt dabei die Zeichen wie folgt:
     "@@" -> durch "@"
     "@"    -> durch den Gerätenamen(device name)                 z.B.: "HT_BuTur"
     "%"    -> durch den gefundenen Zustand (received event) z.B.: "battery:low"
   
Sobald ein Zustand nicht "ok" ist, erfolgt eine E-Mail mit folgenden Angaben:
     an         : Ziel@Adresse.de
      Betreff : FHEM-Meldung
     Inhalt   : BatterieWechsel erforderlich bei HT_BuTur -> Status: battery:low
   
 
Wenn's mit Fhem nicht klappt
Sollte es beim Aufruf der Funktion in Fhem ein Problem geben, empfiehlt es sich zuerst eine E-Mail direkt von der Raspberry Konsole zu senden. Im folgenden Beispiel werden dazu die Zugangsdaten durch die eigenen Angaben ersetzt und als "EINE" Zeile an der Konsole eingegeben:
     sendEmail -f 'Ziel@Adresse.de' -t 'absender@account.de' -u 'Betreffzeile' -m 'Test-Nachricht'
               -s 'E-Mail-Anbieter' -xu 'kontoname@account.de' -xp 'passwort' -o tls=no

 

Noch viel Spaß mit Fhem auf dem Beerchen!
 
Schnup

ThomasD

#1
Hallo Schnupp,

vielen Dank fuer Deine Muehe. Ich bin blutiger Anfänger und stolpere immer noch :-)

Anbei der Code in der 99_myUtils.pm:

######### DebianMail  Mail auf dem RPi versenden ############
sub DebianMail
{
my $rcpt = shift;
my $subject = shift;
my $text = shift;
my $ret = "";
my $sender = "name\@eclipso.de";
my $konto = "name\@eclipso.de";
my $passwrd = "pass!word666";
my $provider = "mail.eclipso.de:25";
Log 1, "sendEmail RCP: $rcpt";
Log 1, "sendEmail Subject: $subject";
Log 1, "sendEmail Text: $text";

$ret .= qx(sendEmail -f '$sender' -t '$rcpt' -u '$subject' -m '$text' -s '$provider' -xu '$konto' -xp '$passwrd' -o tls=no);
$ret =~ s,[\r\n]*,,g;    # remove CR from return-string
Log 1, "sendEmail returned: $ret";
}


fhem.cfg:

define Mail_Alarm notify Alarm{ {DebianMail('name@@web.de','Alarm2','AlarmGetriggert')};;}
attr Mail_Alarm icon message_mail
attr Mail_Alarm room Unsorted


rufe ich in dem FHEM Fenster:
{DebianMail('name@web.de','Alarm2','AlarmGetriggert')}
auf, so bekomme ich eine Email

schreibe ich:
trigger Mail_Alarm
bekomme ich keine :-(

Ich sehe folgendes im Log:
2013.11.24 16:00:17 5: Cmd: >trigger Mail_Alarm<
2013.11.24 16:00:17 5: Triggering Mail_Alarm (1 changes)
2013.11.24 16:00:17 5: Notify loop for Mail_Alarm
2013.11.24 16:00:17 4: eventTypes: notify Mail_Alarm  ->
2013.11.24 16:00:17 4: HTTP FHEMWEB:192.168.1.1:1670 GET /fhem

Hat jemand eine Idee?

Gruesse,
ThomasD


ThomasD

define Mail_Alarm notify Mail_Alarm {DebianMail('name@@web.de','Alarm','AlarmGetriggert')}

So tut es jetzt  :)

MiWe58

Hallo,

ich bereite derzeit den Umzug meiner FHEM - Installation von der Fritz-Box auf den RASPI vor.
Der E-Mail-Versand, wie hier beschrieben, funktioniert.

Nun haben verschiedene Provider angekündigt, den unverschlüsselten Versand von Emails zukünftig nicht mehr zu unterstützen. Unabhängig davon habe ich auch sonst Interesse, alle Mails zu verschlüsseln.

Für T-Online habe ich versucht, diese hier gezeigte Konfiguration auf den "securesmtp" mit "TLS" zu adaptieren, was mir leider nicht gelungen ist.

Möglicherweise hat das hier schon jemand probiert und kann einen ergänzenden Hinweis zu der erforderlichen Konfiguration geben

Im Logfile erhalte ich die folgende Meldung, wenn ich "TLS = yes" setze:
2013.11.28 15:20:49 1: sendEmail returned: Nov 28 15:20:49 raspberrypi sendEmail[2178]: NOTICE => Authentication not supported by the remote SMTP server!Nov 28 15:20:49 raspberrypi sendEmail[2178]: ERROR => Received:    530 5.7.0 Must issue a STARTTLS command first.

sonst gibt es keinen Eintrag im Logfile

Gruß
Michael

Devices: RasPi V, HomeMatic, PICCU, Modbus, Heliotherm-Wärmepumpe, SMA PV-Anlage, Easee Laderoboter
Steuerung: Rollos, Beleuchtung, Heizung-Heliotherm, Heizung-Heizkreise, PV-Anlage-Eigenverbrauch, Alarm, Zugang, Wasser

hckoe

Hallo Michael,

hast Du es schon einmal mit "securesmtp.t-online.de:587" versucht, weil der securesmtp nicht auf Port 25 sondern auf 587 hört.

Gruß
Helmut
# CT mit Debian Buster / FHEM aktuell / EnOcean TCM310 / Eltako FSA12, FUD12NPN, FSB12, FRW, FSRP-230V
# Permundo PCS234, Nodon NO-SIN-2-2-00, GTAGS

MiWe58

Devices: RasPi V, HomeMatic, PICCU, Modbus, Heliotherm-Wärmepumpe, SMA PV-Anlage, Easee Laderoboter
Steuerung: Rollos, Beleuchtung, Heizung-Heliotherm, Heizung-Heizkreise, PV-Anlage-Eigenverbrauch, Alarm, Zugang, Wasser

hckoe

Könntest Du in dem "sendemail"-Kommando noch Debug-Ausgaben aktivieren mit dem Schalter "-v" bzw. "-vv".

Gruß
Helmut
# CT mit Debian Buster / FHEM aktuell / EnOcean TCM310 / Eltako FSA12, FUD12NPN, FSB12, FRW, FSRP-230V
# Permundo PCS234, Nodon NO-SIN-2-2-00, GTAGS

Rohan

Hallo Michael,

Zitat von: MiWe58 am 28 November 2013, 17:46:45
ja, Port 587 habe ich eingestellt

Ich kenne jetzt T-Online-Mail-Einstellungen nicht, aber ich habe gerade ähnliches für web.de und gmx gemacht (weil die auch spätestens Anfang 2014 komplett auf "verschlüsselt" umstellen). Die verschlüsseln aber beide nicht per TLS, sondern SSL und laufen auf Port 465 als SMTP-Postausgangsserver.

Gruß
Thomas
Fhem auf Mini-ITX mit Celeron 2-Core, HMLAN (> 55 Devices), CUL (FS20 und EM), RFXtrx 433E, Arduino (einige DS18B20), RPi mit 1-Wire (DS2423 für S0-Signale, DS18B20+), RPi/Arduino mit MQ-5 und MQ-9 (CO- und CNG/LPG-Sensor), CO-20 IAQ Sensor

cerberus

Hallo, ich hatte Probleme mit Googlemail und mußte noch folgendes ändern.

Problems
If you get the following error:
"invalid SSL_version specified at /usr/share/perl5/IO/Socket/SSL.pm line 332"

It is a known bug: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=679911

A temporary workaround is to edit the file /usr/bin/sendemail on line 1907 by changing 'SSLv3 TLSv1'in  to 'SSLv3',


Gruß
cerberus

Banana PI mit Bananian + Fhem 5.5, 2x SCC SlowRF/Homematic + RS485 LAN Gateway HMW-LGW-O-DR-GS-EU + RPI2 I2C to 1-Wire Host Adapter for Raspberry Pi

CQuadrat

#9
Ja, das ist ein leidiges Thema. Ich habe diese Problem schon von Anfang an. Alle paar Wochen recherchiere ich mal dazu und gelange immer wieder nur den folgenden Hinweis:

Zitat von: cerberus am 28 November 2013, 21:46:10
Problems
If you get the following error:
"invalid SSL_version specified at /usr/share/perl5/IO/Socket/SSL.pm line 332"

It is a known bug: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=679911

A temporary workaround is to edit the file /usr/bin/sendemail on line 1907 by changing 'SSLv3 TLSv1'in  to 'SSLv3',


Leider funktioniert das bei mir nicht (bin bei t-online). Auf meiner "normalen" Linux-Distribution (Ubuntu) funktioniert sendEmail problemlos.


Nachtrag:
Man findet auch, dass man in der Datei /usr/local/share/perl/5.14.2/IO/Socket/SSL.pm in Zeile 1490 den Inhalt von

m{^(!?)(?:(SSL(?:v2|v3|v23|v2/3))|(TLSv1[12]?))$}i

nach

m{^(!?)(?:(SSL(?:v2|v3|v23|v2/3))|(TLSv1[12]?))}i

abändern soll. Aber das hilft bei mir auch nicht.

Viele Grüße

Christoph
FHEM auf Mini-ITX-Server mit Intel Quad-Core J1900:
+ HM: HM-LAN, HM-USB, HM-MOD-UART mit div. HM-Komponenten
+ RFXtrx: Funkwetterstation Bresser mit ext. Thermometer, Regenmesser und Windmesser
+ TUL (KNX-Anbindung), MQTT, SONOS (div. Gimmicks), OneWire, Hue

brocky


Ich habe nachdem der unten angegebene Workarround bei mir mit T-Online nicht funktioniert hat den Wert nicht in SSLv3 sondern in TLSv1 geändert.
Danach hat es bei mir funktioniert.


A temporary workaround is to edit the file /usr/bin/sendemail on line 1907 by changing 'SSLv3 TLSv1'in  to 'SSLv3',

CQuadrat

Super! Es funktioniert.

Das war die Lösung.


1000 Dank!
FHEM auf Mini-ITX-Server mit Intel Quad-Core J1900:
+ HM: HM-LAN, HM-USB, HM-MOD-UART mit div. HM-Komponenten
+ RFXtrx: Funkwetterstation Bresser mit ext. Thermometer, Regenmesser und Windmesser
+ TUL (KNX-Anbindung), MQTT, SONOS (div. Gimmicks), OneWire, Hue

marc2

Moin !

Nur so als Anregung. Aus meiner Sicht ist es sinnvoller, sich auf dem Raspi Postfix zu konfigurieren, und die Mails aus FHEM
heraus direkt mit MIME::Lite (o.ä. CPAN Modulen) zu versenden. Dies hat diverse Vorteile:


  • Der Mailversand auf dem Raspi ist nicht auf FHEM beschränkt, sondern kann generisch genutzt werden
  • User und Kennwort für den SMTP-Zugang beim Provider liegen nicht im Klartext rum
  • Der Mailversand funktioniert asynchron, und FHEM wird nicht negativ beeinflußt, wenn der Provider mal tot ist

Gerade der letzte Punkt war für mich entscheidend. Von der Fritzbox (und /sbin/mailer) kommend hatte ich durchaus
schon das Problem, dass der Provider (bei mit 1&1) ein SMTP Problem hatte. Da die Mails von FHEM synchron direkt
zum Provider geschickt wurden, und dies im Fehlerfall zu extrem langen Timeouts beim Maiversand geführt hat, war
FHEM quasi tot. Um dieses Problem auf dem Raspi (bzw. bei mir einem BBB) zu umgehen, schickt FHEM die Mails daher
an die lokale Postfix Instanz, welche die Mails bei Bedarf (SMTP Problem beim Provider) queued. Auswirkungen auf
FHEM sind damit  dann ausgeschlossen.

Anbei meine recht simple Mailroutine aus  der 99_myUtils.pm:

sub pl_mail {
        my ($rcpt, $subject, $text, $attachment) = @_;
        my $msg = MIME::Lite->new (
                          From    => 'FHEM <fhem@domain.xy>',
                          To      => $rcpt,
                          Subject => $subject,
                          Type    => 'multipart/mixed'
                       );

        $MIME::Lite::AUTO_CONTENT_TYPE = 1;

        if ($attachment ne "") {
                $msg->attach(Path     => $attachment,
                             Filename => basename($attachment),
                             Disposition => 'attachment'
                );
        }

        if ($text ne "") {
                 $msg->attach(Type    =>'TEXT',
                              Data    => $text
                 );
        }

        $msg->send;
        Log 3, "Mail sent to $rcpt";
}


Howtos, wie man Postfix im Zusammenspiel mit Provider XYZ konfiguriert gibt es von jedem größeren Provider.

Gruß, Marc

netbus

#13
Ich habe eine Frage zur Variable % im Email Text.
Ich nutze die Email Funktion für Sturmwarnungen und bekomme die Daten vom Yahoo Wetter Modul.
Das funktioniert soweit ganz gut nur ich hätte gerne die Windgeschwindigkeit in der Email enthalten bekomme aber immer nur Emails mit % als Zeichen.

define sturmwarnung at +*01:00:00 { if (ReadingsVal("wetter","wind_speed",99) > 30) { DebianMail('ich@gmail.com','Sturmwarnung','Es wird stürmisch bis zu % kmh');;}}

Was mache ich falsch?

Navigator

Gibt es noch eine Möglichkeit das PW, was in den myUtils hinterlegt ist zu verschlüsseln? 
Gruß aus Sachsen. FHEM auf Cubietruck. Vormals EZControl XS1 User.