FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: DAU am 18 September 2026, 16:53:24

Titel: E-mail senden mit Curl plötzlich ohne Funktion
Beitrag von: DAU am 18 September 2026, 16:53:24
Hallo ins Forum,

ich mache mal wieder meinem Nutzernamen alle Ehre:
Ich bekomme es nicht hin, über Curl EMail zu versenden.

Es hat eine Weile funktioniert, aber irgendwann plötzlich nicht mehr( ich lasse mir nur bei bestimmten Zuständen, z.B. Urlaub E-Mail zu senden, daher kann ich nicht genau sagen, wann es nicht mehr funktionierte).
Ich habe curl aktualisiert und auch FHEM aktualisiert.

Zusätzlich habe ich versucht den verbose Wert im Device auf 5 zu setzen, aber auch dann bekomme ich keinerlei Eintragungen im Log.

Daher weis ich auch nicht, wo ich anfangen soll zu suchen.

Provider ist goneo (mit meiner eigenen Domain).

Hier ist der Auszug aus der FHEM.cfg (Mail-Adressen verschleiert):
Eigentlich sollte das genau dem Code aus dem Wiki sein...
define sendMail dummy
setuuid sendMail 6a96e48b-f33f-a585-29ea-dcb72ac61c39d5ec
attr sendMail readingList message password
attr sendMail verbose 5
attr sendMail setList message:textField-long password
attr sendMail userReadings state:message:[\s\S]* {\
    my $emailTo   = 'zzz@yyy.de';;\
    my $emailFrom = 'zzz@yyy.de';;\
    my $emailServer = 'smtp.goneo.de';;\
    \
    #erzeuge Datumsangabe konform zu RFC-5322:\
    my @emailDateArray = split(' ', strftime("%w %d %m %Y %H:%M:%S %z", localtime));;\
    $emailDateArray[0] = (qw[Sun Mon Tue Wed Thu Fri Sat])[$emailDateArray[0]] . ',';;\
    $emailDateArray[2] = (qw[Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec])[$emailDateArray[2]-1];;\
    my $emailDate = join(' ', @emailDateArray);;\
    \
    # 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;;\
    }\
    \
    #Dateianhänge bestimmen\
    my @attachments;;\
    while ($message =~ s/(?:Attachment|Anhang)=["'](.*?)["']//) {\
        my $file = $1;;\
        return ">>$file<< not found, not sending email" unless (-e $file);;\
        push (@attachments, $file);;\
    }\
    \
    #der curl Befehl wird hier aufgebaut:\
    my $cmd = "curl -m 19 --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}' ";;\
    $cmd .= "-H 'Subject: $subject' ";;\
    $cmd .= "-H 'From: $emailFrom' ";;\
    $cmd .= "-H 'Date: $emailDate' ";;\
    \
    #multipart/alternative für Text und HTML EMail Body\
    $cmd .= "-F '=(;;type=multipart/alternative' ";;\
    \
    # Leerzeichen und <br> bzw <br \> am Anfang entfernen:\
    $message =~ s/^(\s|<br(?:[ \/]+)>)+//;;\
    # Leerzeichen und <br> bzw <br \> am Ende entfernen:\
    $message =~ s/(\s|<br(?:[ \/]+)>)+$//;;\
    \
    #Plaintext E-Mail Inhalt an cURL:\
    $cmd .= "-F \"=$message;;type=text/plain;; charset=UTF-8\" ";;\
    #ersetze \n bzw. \r\n durch ein HTML-tag <br />:\
    $message =~ s/\r?\n/<br \/>/g;;\
    \
    #HTML E-Mail Inhalt an cURL:\
    $cmd .= "-F '= <body>$message</body>;;type=text/html;; charset=UTF-8' ";;\
    $cmd .= "-F '=)' ";;\
    \
    #jetzt alle Attachments (0..N) anhängen:\
    foreach my $file (@attachments) {\
        $cmd .= "-F '=@".$file.";;encoder=base64' ";;\
    }\
    \
    #stderr auch mit in den output sammeln:\
    $cmd .= " 2>&1";;\
    \
    #Blockierender Aufruf von cURL in dieser Funktion via BlockingCall:\
    if (!defined &sendMailfunc1) {\
        *sendMailfunc1 = sub ($) {\
            my ($param) = @_;;\
            my $result;;\
            $result = qx/$param/;;\
            $result = MIME::Base64::encode_base64($result);;\
            $result =~ s/\n//g;;\
            return $result;;\
        }\
    }\
    \
    #Rückgabe über diese Funktion,\
    #anzeigen in dem reading dieses UserReadings:\
    if (!defined &sendMailfunc2) {\
        *sendMailfunc2 = sub ($) {\
            my ($result) = @_;;\
            my $hash = $defs{$name};;\
            $result = MIME::Base64::decode_base64($result);;\
            readingsSingleUpdate($hash, $reading, $result, 1);;\
        }\
    }\
    \
    #funktion falls BlockingCall abgebrochen wird:\
    if (!defined &sendMailfunc3) {\
        *sendMailfunc3 = sub ($) {\
            my ($result) = @_;;\
            my $hash = $defs{$name};;\
            readingsSingleUpdate($hash, $reading, $result, 1);;\
        }\
    }\
    \
    BlockingCall("sendMailfunc1", $cmd, "sendMailfunc2", 20, "sendMailfunc3", "Error: timeout");;\
    \
    return "started cURL command...";;\
},\
state: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";;\
}


Gibt es hier einen Ansatz, um wieder Mail zu verschicken?

Gruss
Andreas
Titel: Aw: E-mail senden mit Curl plötzlich ohne Funktion
Beitrag von: Prof. Dr. Peter Henning am 18 September 2026, 18:02:19
Das ist, vorsichtig gesagt, schwer wartbar. Die Funktion sollte in eine Perl-Datei, z.B. 99_myUtils.pm

LG

pah
Titel: Aw: E-mail senden mit Curl plötzlich ohne Funktion
Beitrag von: DAU am 18 September 2026, 18:15:21
Hallo pah,

wenn ich den im ersten Post aufgeführten Code in die 99_myUtil.pm kopiere, dann bekomme ich (nach einem Shutdown restart) beim Versuch eine Mail zu senden die Fehlermeldung:
"Please define sendMail first "

Das scheint dann wohl auch nicht das richtige zu sein.

Wie kann ich denn zumindest bei FHEM die Ausgabe ins Log-File erzwingen, damit mal wenigstens mal einen Anhalt hat..

Gruss
Andreas
Titel: Aw: E-mail senden mit Curl plötzlich ohne Funktion
Beitrag von: JoWiemann am 18 September 2026, 18:52:19
Hallo,

ich nutze folgende sub in der 99_myUtils.pm

#---------------------------------------------------------------------------
# E-Mail mit Net::SMTP:SSL Versand vorbereiten
#---------------------------------------------------------------------------
# Source - https://stackoverflow.com/a/15762019
# Posted by mrbill
# Retrieved 2026-04-13, License - CC BY-SA 3.0

sub SMTPMail {

  use Net::SMTP;
  use Net::SMTP::SSL;
  use MIME::Base64;

  my ($receipt, $subject, $text, $attach, $attach1, $attach2) = @_;

     $receipt  = 'empfaenger\@domain.de' if ! defined($receipt);
  my $sender   = "sender\@domain.de";
  my $konto    = "konto\@domain.de";
  my $passwrd  = "Passwort";
  my $provider = "provider.de";
  my $port     = 465;
  my $debug    = 0;
  my $retMsg = "";

  Log3 "99_MyUtils", 4, "Empfänger: " . $receipt;

#            Port    => 587,

 my $smtp = Net::SMTP::SSL->new
         (
           $provider,
           Port    => $port,
           Debug   => $debug,
           Timeout => 30,
         );

  if ($smtp) {
    # Authentifizierung
    $smtp->auth($konto, $passwrd);
   
    if ($smtp->ok) {
      # E-Mail senden
      $smtp->mail($sender);
      $smtp->to($receipt);
      $smtp->data();
      $smtp->datasend("From: $sender\n");
      $smtp->datasend("To: $receipt\n");
      $smtp->datasend("Subject: $subject\n");
      $smtp->datasend("\n");
      $smtp->datasend("$text\n");
      $smtp->dataend();
      my $state = $smtp->status; # bei status != 2 liegt ein fehler vor
      my $msg   = $smtp->message();
      if (!$smtp->ok) {
        $smtp->quit;
        Log3 "99_MyUtils", 4, "Fehler: Senden gescheiter: $state\n" . $msg;
        $retMsg = "Error: Senden gescheiter: $state";
      } else {
        $smtp->quit;
        Log3 "99_MyUtils", 4, "Erfolg: E-Mail wurde gesendet: $state\n" . $msg;
        $retMsg = "Success: E-Mail wurde gesendet: $state";
      }
    } else {
      Log3 "99_MyUtils", 4, "Fehler: Anmeldung gescheiter: " . $smtp->status ."\n". $smtp->message();
      $retMsg = "Error: Anmeldung gescheiter: $smtp->status";
    }
  } else {
    Log3 "99_MyUtils", 4, "Fehler: Keine Verbindung zum Server.";
    $retMsg = "Error: Keine Verbindung zum Server.";
  }

  return $retMsg;
}

Grüße Jörg
Titel: Aw: E-mail senden mit Curl plötzlich ohne Funktion
Beitrag von: DAU am 18 September 2026, 19:23:46
Hallo Jörg,

und wie sind dann die Aufrufe über FHEM?
Bei mir derzeit z.B:
set sendMail message Subject='✅ Rolladen in Ordnung' Rolladen sind alle hochgefahren_____ ausgeloest durch Email_morgens
Die müsste ich ja auch anpassen.

Gruss
Andreas
Titel: Aw: E-mail senden mit Curl plötzlich ohne Funktion
Beitrag von: Prof. Dr. Peter Henning am 18 September 2026, 19:48:00
Natürlich.

Aber erstmal nachsehen, ob das auf der Betriebssystemebene funktioniert, d.h. ob z.B. sendEmail funktioniert.

Dann erst den Perl-Wrapper bauen.

##############################################################################
#
#  Debian Mail versenden
#
##############################################################################

sub sendMail
{
 my $rcpt = shift;
 my $subject = shift;
 my $text = shift;
 my $file = shift;
 if( $file ){
   $file = '-a \''.$file.'\' '
 }else{
   $file = '';
 }
     
 my $ret = "";
 my $sender = "...";
 my $konto = "...";
 my $passwrd = "...";
 my $provider = "...";
 
 Log 1,"===============> sendEmail -f '$sender' -t '$rcpt' -u '$subject' -m '$text' $file -s '$provider' -xu '$konto' -xp '$passwrd' -o tls=yes -o message-charset=utf-8";
 
 $ret .= qx(sendEmail -f '$sender' -t '$rcpt' -u '$subject' -m '$text' $file -s '$provider' -xu '$konto' -xp '$passwrd' -o tls=yes -o message-charset=utf-8);
 $ret =~ s,[\r\n]*,,g;    # remove CR from return-string
 Log 1, "[sendMail] system function sendEMail returned: $ret";
}

LG

pah
Titel: Aw: E-mail senden mit Curl plötzlich ohne Funktion
Beitrag von: JoWiemann am 18 September 2026, 20:01:25
Hallo pah,

mit sendMail gibt es wohl Probleme mit der TLS/SLS Verschlüsselung. Ich meine, wir hatten dazu auch eine Diskussion im Forum. Finde es aber aktuell nicht. Ich habe damals auf Grund der sendMail Probleme auf die gepostete Variante umgestellt.

Grüße Jörg
Titel: Aw: E-mail senden mit Curl plötzlich ohne Funktion
Beitrag von: DAU am 18 September 2026, 20:04:53
Es läuft wieder...


Ich habe im Log-File doch noch einen Hinweis auf fehlende Zertifikate gefunden. Daraufhin habe ich per putty alle Zertifikate auf dem Raspberry deinstalliert und nochmal installiert. Gleichzeitig auch noch den Raspberry einmal komplett upgedatet (nochmal).
Dann hatte ich plötzlich unter FHEM beim Eintrag dummy (Unterpunkt SendMail) den Hinweis auf falsche Zugangsdaten. Dann habe ich diese nochmal komplett neu gesetzt und jetzt geht es wieder.
Zwischendurch immer mal wieder Shutdown Restart..

Ich mach dann mal zu hier.

Gruss
Andreas