Sonntag, 1. Februar 2015

Email senden von FHEM und RaspberryPi

Da dieser Artikel oft gelesen wird, mache ich mal einen aktuellen Nachtrag:
Aktuell (Ende 2017): In debian stretch hat sich der Name geändert, das Programm heißt jetzt sendemail - früher waren beide Schreibweisen möglich! Bitte bei der Umsetzung des nachfolgenden Codes beachten: aus sendEmail wird sendemail!!!
Aktuell (Dezember 2015) läuft sendEmail ohne jede Korrektur in den Dateien sendEmail oder SSL.pm. Meine Informationen dazu in diesem Artikel scheinen derzeit obsolet. Der erwähnte Wiki Artikel ist auch überarbeitet und von einer Änderung in der Datei SSL.pm wird dort sowieso abgeraten. Das aktuelle debian Paket trägt die Nummer (1.56-5) hat 2262 anstatt 2236 Zeilen und die fragliche Zeile ist 1933 und nicht 1907. Der geforderte Inhalt (laut Wiki) ist dort schon vorhanden. Die Datei trägt keine neue Versionsnummer. Ich bitte das zu beachten und meine ehemals unten vorgeschlagenen Änderungen nicht vor zunehmen!
Falls doch der Fehler "SSL.pm ... Zeile 332" kommt (kann bei wheezy der Fall sein) dann bitte nur die Änderung in der sendEmail entsprechend Wiki vornehmen! 
_____________________________________________________________________
Manche scheinbare einfachen Dinge gestalten sich dann doch als Puzzle im Internet...
Ich wollte Emails versenden von FHEM, es gibt dazu einen Wiki Eintrag da klingt alles ganz einfach. Ist es aber nicht: im vorigen Jahr wurde ja eine gravierende SSL Sicherheitslücke bekannt. Daraufhin wurden natürlich viele der möglichen Angriffspunkte im Web geschlossen. Unter anderem wurden die Email Server umgestellt, auf TLS Protokoll. Das SSL v3 Protokoll wird von den meistens Servern im Web nicht mehr akzeptiert. Es wird verschiedentlich empfohlen anstatt sendEmail Exim4 zu verwenden. Ich halte das für übertrieben, Exim ist ein kompletter Emailserver, der wird eine zusätzliche Last auf dem System erzeugen. Ich glaube viele der Leistungsprobleme mit dem RaspberryPi basieren auf unnötigen Modulen und zu viele Aufgaben parallel. Der Raspberry ist keine eierlegende Wollmichsau, aber als FHEM Server läuft er bei  mir ziemlich flott.

Wenn man alles nach Wiki einrichtet, bekommt man den eindeutigen Fehler:
sendEmail returned: Feb 01 18:51:02 raspifhem sendEmail[3620]: ERROR => TLS setup failed: SSL connect attempt failed with unknown error error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number
Eigentlich kein Wunder, das in Perl geschrieben sendEmail stammt in der aktuellen Version 1.56-2 aus dem Jahr 2009.
Im Wiki steht auch noch was, dass man die Datei /usr/bin/sendEmail korregieren muss.
Im FHEM Forum findet man dann noch einen anderen Eintrag zum gleichen Thema.
Und hier findet man auch noch einen entscheidenden Hinweis.

Ich habe insgesamt folgendes gemacht, zunächst auf der Kommandozeile:
sudo apt-get update
sudo apt-get install sendemail libio-socket-ssl-perl libnet-ssleay-perl perl
Jetzt könnte man die Funktion schon auf Kommandozeile testen. Aber man bekommt die Fehlermeldung die im Wiki erwähnt wird: Fehler in SSL.pm in Zeile 332...
Es liegt einfach an einem $ welches in Zeile 1490 der Datei entfernt werden muss:
sudo nano /usr/share/perl5/IO/Socket/SSL.pm
Wir suchen die erste Textkette in der nächsten Box und löschen das $ am Ende (siehe 2. Zeile):
m{^(!?)(?:(SSL(?:v2|v3|v23|v2/3))|(TLSv1[12]?))$}i
m{^(!?)(?:(SSL(?:v2|v3|v23|v2/3))|(TLSv1[12]?))}i
Dann noch die Datei /usr/bin/sendEmail die Zeile 1907 editieren:
sudo nano /usr/bin/sendEmail
Einfach die obere Zeile in der folgenden Box suchen und durch die zweite Zeile ersetzen
SSLv3 TLSv1
TLSv1_0:TLSv1_1:TLSv1_2
Wer noch ein schnelles Erfolgserlebnis möchte gibt einfach die folgende Zeile ein:
sendEmail -f '<von@domain.tld>' -t '<an@domain.tld>' -u 'Hallo Welt' -m 'Das ist ein Test' -s '<smtp.domain.tld>' -xu '<konto@domain.tld>' -xp '<Passwort>' -o tls=auto

Jetzt noch die notwendigen Schritte in FHEM:
Die Datei 99_myUtils "leer" angelegt, dass klappte wie im Wiki ganz gut.
Anschließend die Subroutine "Debianmail" angelegt und der eigentlichen Befehlszeile tls=auto eingesetzt. 
Dann kann man das Versenden einer Email testen, diese Zeile definiert ein temporären Emailversand in einer Minute. 
define Testmail at +00:01:00 { DebianMail('<name@domain.tld>','Info vom FHEM System','Das EMail Modul funktioniert');;}
Wenns nicht ankommt, kann man das Logfile anschauen, wenn dort "Email was sent successfully!" steht sollte man noch in den Spamordner schauen.

Kommentare:

  1. Hallo Otto!

    Ich bekomme die SSL.pm nach dem Editieren in Notepad++ nicht wieder hochgeladen. Habe die originale auf dem Pi dann gelöscht, das Hochladen funzt aber dann auch nicht (mit WinSCP).
    Wie bekomme ich das hin?

    Danke

    Uwe.

    AntwortenLöschen
    Antworten
    1. Es geht alles viel einfacher direkt unter Linux:
      sudo nano /usr/bin/sendEmail
      Damit muss man nicht mit Berechtiigungsproblemen kämpfen.
      Oder die Datei ins /home/pi hochladen und dann im Terminal (putty) mit sudo cp /home/pi/sendEmail /usr/bin kopieren

      Löschen
  2. Ergänzung...

    "SendEmail" gibt es bei mir nicht - nur "sendEmail" und in dieser ist der Suchstring " SSLv3 TLSv1" nicht zu finden auch bei Sprung in Zeile 1907.

    Uwe

    AntwortenLöschen
    Antworten
    1. sorry, habe das eine falsche SendEmail korregiert.
      Die komplette Zeile 1907 sieht in meiner Version (15.09.2010) so aus:
      if (! IO::Socket::SSL->start_SSL($SERVER, SSL_version => 'SSLv3 TLSv1')) {

      Löschen
    2. Danke - habe beides jetzt hinbekommen.

      Löschen
  3. Dieser Kommentar wurde vom Autor entfernt.

    AntwortenLöschen
    Antworten
    1. Eigentlich funktionierte das genau wie beschrieben. Ich kann nicht sagen ob es mittlerweile andere Versionen gibt? Ich müsste das erstmal mit einem frisch installiertem nachvollziehen. Im Fhemwiki gibt es noch eine andere Anleitung, die die SSL.pm nicht verändert sondern nur die SendEmail, allerdings anders wie bei mir beschrieben. Gruß Otto

      Löschen
    2. Ich habe bei mir SSLv3 und TLSv1 eingetragen und nun geht es. Hinzu kam, dass ich die ganze Zeit eine Copy&Paste Fehler mit eingefügt hatte.
      Lieben Gruß Hoffi

      Löschen
  4. Vielen Dank für das Tutorial!

    Ich bekomme leider diese Fehlermeldung:

    2015.12.16 23:29:30 1: sendEmail RCP:
    2015.12.16 23:29:30 1: sendEmail Subject: Info vom FHEM System
    2015.12.16 23:29:30 1: sendEmail Text: Das EMail Modul funktioniert
    2015.12.16 23:29:30 1: sendEmail Anhang:
    Having no space between pattern and following word is deprecated at /usr/bin/sendEmail line 2046.
    Bareword found where operator expected at /usr/bin/sendEmail line 2046, near "/usr/bin"
    (Missing operator before bin?)
    "my" variable $msg masks earlier declaration in same scope at /usr/bin/sendEmail line 2048.
    "my" variable $name masks earlier declaration in same statement at /usr/bin/sendEmail line 2048.
    "my" variable $address masks earlier declaration in same statement at /usr/bin/sendEmail line 2048.
    "my" variable $msg masks earlier declaration in same scope at /usr/bin/sendEmail line 2055.
    syntax error at /usr/bin/sendEmail line 2046, near "/usr/bin"
    Execution of /usr/bin/sendEmail aborted due to compilation errors.
    2015.12.16 23:29:31 1: sendEmail returned:


    Gruß

    Michael

    AntwortenLöschen
    Antworten
    1. Klappt das Absetzen der Email von der Kommandozeile?
      Ich denke es ist ein Schreibfehler in der 99_myUtils Routine und die Übergabe der Parameter an sendEmail ist fehlerhaft.
      Wie hast Du die 99_myUtils geschrieben? Mit dem integrierten FHEM Editor?
      Gruß Otto

      Löschen
  5. Hallo Otto,

    danke für deine Beschreibung!

    Im Syntax für die Kommandozeile fehlt hinter ein " ' ".

    Vielleicht ist auch der Hinweis für Anfänger noch sinnvoll das "<" und ">" bei den Anpassungen zu entfernen.

    Gruß Jens

    AntwortenLöschen
    Antworten
    1. Hallo Jens, danke für den Hinweis. Die Kommandozeile habe ich korrigiert. Die spitzen Klammern sind für mich gängiger Syntax. Spitze Klammer bedeutet: das ist zu ersetzen und die Position ist nicht optional. Eckige Klammern stehen für optionale Angaben.
      Gruß Otto

      Löschen
  6. Hallo Otto, habe mir Jessie Lite mit sendEmail installiert (März2016). Wenn das $ in der SSL.pm entfernt wird kommt es jetzt im Gegensatz zu früheren Installationen zu einer Fehlermeldung. Bleibt dagegen alles Original kommt es nach dem versenden einer Testmail von der Kommandozeile zu dieser Info/Meldung, die E-Mail wird aber versandt.

    Cannot determine hostname of peer for verification. Disabling default hostname verification for now. Please specify hostname with SSL_verifycn_name and better set SSL_verifycn_scheme too.
    Apr 08 17:14:37 difu3 sendEmail[29236]: Email was sent successfully!

    Wer weiss wo Hostname verification und SSL_verifycn_name zu finden/ändern sind ?

    Gruß
    Dieter

    AntwortenLöschen
    Antworten
    1. Hallo Dieter, ich kann das zur Zeit nicht überprüfen. Meine letzte Installation mit jessie full vor ein paar Wochen lief aber ohne jede Änderung. Deine Fehlermeldung deutet für mich irgendwie darauf hin, dass vielleicht eine andere Bibliothek fehlt (Jessie lite)?
      Gruß Otto

      Löschen
    2. Hallo Dieter, ich kann das zur Zeit nicht überprüfen. Meine letzte Installation mit jessie full vor ein paar Wochen lief aber ohne jede Änderung. Deine Fehlermeldung deutet für mich irgendwie darauf hin, dass vielleicht eine andere Bibliothek fehlt (Jessie lite)?
      Gruß Otto

      Löschen