➿ E-Mail senden mit CURL

Begonnen von Torxgewinde, 17 Februar 2025, 20:31:24

Vorheriges Thema - Nächstes Thema

Torxgewinde

Hi,
Ich nutze gerne CURL zum Senden von E-Mails, da es eigentlich in jeder Distro verfügbar ist und sehr viele moderne Optionen beherrscht. Hier ein FHEM-Device, dass man einfach nur anlegt und dann kann man seine E-Mails so versenden:

  • 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

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/;;\
    }

Im Wiki sind weitere Methoden, die mir allerdings nicht so zusagten: https://wiki.fhem.de/wiki/E-Mail_senden

Beta-User

Anmerkungen:
- qx blockiert afaik FHEM für die Ausführungsszeit, was ein Problem sein könnte, falls der Server nicht erreichbar ist.
- für sowas würde ich setKeyValue() und getKeyValue() verwenden, dann kann man die ganzen Zugangsdaten einmalig wegspeichern und sie sind nicht über FHEMWEB ohne nähere Kenntnisse des Mechanismus auslesbar; weiter könnte man so auch mehrere unterschiedliche Empfänger möglich machen...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Torxgewinde

Konsequenterweise sollte man auch den Empfänger mit angeben können, dies habe ich noch ergänzt und die Wiki Seite aktualisiert:

defmod sendMail dummy
attr sendMail readingList message
attr sendMail setList message
attr sendMail userReadings result:message:.* {\
    my $emailTo   = 'you@example.com';;\
    my $emailFrom = 'fhem@domain.com';;\
    my $emailPass = 'geheimesPasswort';;\
    my $emailServer = 'mail.smtpserver.de';;\
    \
    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\\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/;;\
}

Torxgewinde

Zitat von: Beta-User am 18 Februar 2025, 08:23:42Anmerkungen:
- qx blockiert afaik FHEM für die Ausführungsszeit, was ein Problem sein könnte, falls der Server nicht erreichbar ist.
- für sowas würde ich setKeyValue() und getKeyValue() verwenden, dann kann man die ganzen Zugangsdaten einmalig wegspeichern und sie sind nicht über FHEMWEB ohne nähere Kenntnisse des Mechanismus auslesbar; weiter könnte man so auch mehrere unterschiedliche Empfänger möglich machen...

Bezüglich des Blockieren bietet cURL die Option --max-time an: https://curl.se/docs/manpage.html#-m
Ich denke eine kurze maximale Zeit von zwei Sekunden sollte FHEM nicht umbringen und solch eine Textemail sollte in der Zeit eigentlich immer gesendet worden sein.

Bezüglich setKeyValue() und getKeyValue() verstehe ich die Absicht, bin aber vom Sicherheitsgewinn nicht so überzeugt. Ich guck' mal...

Beta-User

Zitat von: Torxgewinde am 18 Februar 2025, 08:52:31eine kurze maximale Zeit von zwei Sekunden sollte FHEM nicht umbringen und solch eine Textemail sollte in der Zeit eigentlich immer gesendet worden sein.
Wenn andere Personen wie Administratoren 2 Sekunden warten müssen, bis das Licht angeht, ist das nach meoner persönlichen Erfahrung ein nogo ;) .

Und es geht auch nicht primär nur um die Datenmenge, sondern - wie bereits geschrieben - um die Erreichbarkeit des (E-Mail-) Servers...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Torxgewinde

Zitat von: Beta-User am 18 Februar 2025, 08:58:19
Zitat von: Torxgewinde am 18 Februar 2025, 08:52:31eine kurze maximale Zeit von zwei Sekunden sollte FHEM nicht umbringen und solch eine Textemail sollte in der Zeit eigentlich immer gesendet worden sein.
Wenn andere Personen wie Administratoren 2 Sekunden warten müssen, bis das Licht angeht, ist das nach meoner persönlichen Erfahrung ein nogo ;) .

Und es geht auch nicht primär nur um die Datenmenge, sondern - wie bereits geschrieben - um die Erreichbarkeit des (E-Mail-) Servers...

Mit "-m" sagt man CURL ja nicht "blockiere bitte für mindestens N Sekunden" und qx() verbessert hier die Lesbarkeit. Ich habe mir den Punkt überlegt und baue "-m" mal ein, das macht Sinn, das qx() zu entfernen überzeugt mich jetzt aber erstmal nicht.

Das Passwort per get/setKeyValue() macht Sinn, das kann da auch noch rein.

Torxgewinde

#6
Hier wäre es nun mit den angeregten Änderungen:

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 dann mit:
  • set sendMail password geheimesPasswort
  • Alternativ, damit das Passwort nicht im Log auftaucht: { setKeyValue("sendMail_password", "geheimesPasswort") }

mumpitzstuff

#7
Ich habe nicht alles genau verfolgt, aber Shell Befehle kann man in Fhem mit
"echo nonblocking" nicht blockierend ausführen. Innerhalb von Perl Code ist es etwas komplizierter, geht aber auch:

{fhem("\"echo nonblocking\"")}
Wenn du natürlich die Rückgabe wirklich brauchst, dann wirds komplizierter, geht aber meines Wissens auch, wenn du quasi von außen den Rückgabewert wieder an Fhem übergibst:

perl fhem.pl 7073 "set sendMail result $myRueckgabe"
Irgendwie so in der Art glaube ich mich zu erinnern...

Torxgewinde

#8
tl;dr: Klar, kannst du einfach machen wenn du den Rückgabewert nicht im Reading haben willst. Der Output ist ja immerhin im Log.

Otto hat das in seinem Blog schön zusammengefasst: https://heinz-otto.blogspot.com/2018/02/in-fhem-externe-programme-aufrufen.html

Ich habe ein simples Beispiel für BlockingCall() erstellt, das kann man hierauf adaptieren: https://forum.fhem.de/index.php?topic=140846.0, aber so richtig nötig ist es hier nicht.

Torxgewinde

#9
Moin,
Ich hab' es nun doch einfach mal mit BlockingCall() zusammengebaut:

defmod sendMail dummy
attr sendMail readingList message password
attr sendMail setList message password
attr sendMail userReadings state:message:.* {\
    my $emailTo   = 'you@example.com';;\
    my $emailFrom = 'fhem@example.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\\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 4.8 --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";;\
    \
    no warnings 'redefine';;\
    sub sendMailfunc1($) {\
        my ($param) = @_;;\
        my $result;;\
        \
        $result = qx/$param/;;\
        \
        $result = MIME::Base64::encode_base64($result);;\
        $result =~ s/\n//g;;\
        return $result;;\
    };;\
    \
    sub sendMailfunc2($) {\
        my ($result) = @_;;\
        my $hash = $defs{$name};;\
        $result = MIME::Base64::decode_base64($result);;\
        readingsSingleUpdate($hash, $reading, $result, 1);;\
    };;\
    use warnings 'redefine';;\
    \
    BlockingCall("sendMailfunc1", $cmd,"sendMailfunc2", 5);;\
    \
    return "started Job...";;\
},\
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";;\
}

Torxgewinde

#10
Hallo,
Damit auch der letzte Vorteil von dem veraltetem sendemail bzw. DebianMail Aufruf gleichzieht, habe ich den Versand von Dateianhängen noch ergänzt:

  • 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
  • Ein Anhang: set sendMail message Subject="Dies ist ein Test" Mein Text Anhang="/opt/fhem/www/images/fhemSVG/bag.svg"
  • Mehrere Anhänge geht auch: Anhang="www/images/fhemSVG/bag.svg" Anhang="www/images/fhemSVG/batterie.svg" To="me@example.com" Subject="✅ Dies ist ein Test" Meldung mit Emoji ⚽ geht auch

defmod sendMail dummy
attr sendMail readingList message password
attr sendMail setList message password
attr sendMail userReadings state:message:.* {\
    my $emailTo   = 'you@example.com';;\
    my $emailFrom = 'fhem@example.org';;\
    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;;\
    }\
    \
    #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, $1);;\
    }\
    \
    #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}\n' ";;\
    $cmd .= "-H 'Subject: $subject' ";;\
    $cmd .= "-H 'From: $emailFrom' ";;\
    \
    #multipart/alternative für Text und HTML EMail Body\
    $cmd .= "-F '=(;;type=multipart/alternative' ";;\
    $cmd .= "-F '=$message;;type=text/plain;; charset=UTF-8' ";;\
    $cmd .= "-F '= <body>$message</body>;;type=text/html;; charset=UTF-8' ";;\
    $cmd .= "-F '=)' ";;\
    \
    #jetzt alle Attachments anhängen:\
    foreach my $file (@attachments) {\
        $cmd .= "-F '=@".$file.";;encoder=base64' ";;\
    }\
    \
    #stderr auch mit in den output sammeln:\
    $cmd .= " 2>&1";;\
    \
    #blocking function that is called from a forked process\
    if (!defined &sendMailfunc1) {\
        *sendMailfunc1 = sub ($) {\
            my ($param) = @_;;\
            my $result;;\
            $result = qx/$param/;;\
            $result = MIME::Base64::encode_base64($result);;\
            $result =~ s/\n//g;;\
            return $result;;\
        }\
    }\
    \
    #finish function that is called when blocking function is done\
    if (!defined &sendMailfunc2) {\
        *sendMailfunc2 = sub ($) {\
            my ($result) = @_;;\
            my $hash = $defs{$name};;\
            $result = MIME::Base64::decode_base64($result);;\
            readingsSingleUpdate($hash, $reading, $result, 1);;\
        }\
    }\
    \
    BlockingCall("sendMailfunc1", $cmd, "sendMailfunc2", 20);;\
    \
    return "started Job...";;\
},\
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";;\
}


bertl

Hallo Torxgewinde,

tolle Alternative zum DebianMail Aufruf - danke!

Ich wollte eine mehrzeilige Eingabe für den Message-Text machen und habe daher wie folgt ergänzt:
attr sendMail setList message:textField-long
Im userReading habe ich nach dem Einlesen der message wie folgt ergänzt:
$message =~ s/\r?\n/<br>/g;
Sobald ich aber einen Pagebreak einfüge, wird das userReading nicht mehr getriggert, obwohl im Event monitor ein Event angezeigt wird.
set sendMail message An="test.tester@gmail.com" ␤Hallo Test,␤hier ein kleiner Test!␤Lg TesterEvent monitor: 2025-02-26 15:46:30 dummy sendMail message: An="test.tester@gmail.com"  Hallo Test, hier ein kleiner Test! Lg Tester
Gibt es dafür eine Erklärung?

Danke, Robert

Torxgewinde

#12
Moin!
Das hat mich gerade ziemlich stutzig gemacht, aber du hast recht. Es scheint daran zu liegen, dass der Trigger, wodurch das userReading aktiv wird, nicht mit den Umbrüchen klarkommt und nicht triggert. Es liegt meiner Meinung nach daran, dass der Regex .* nicht auf \n und so weiter anspricht, dies hier aber notwendig ist um bis zum Zeilenende zu kommen.

Ich kann dir folgendes zum Test mit der RegEx [\s\S]* anbieten, bei mir klappt es damit:
defmod sendMail dummy
attr sendMail readingList message password
attr sendMail setList message:textField-long password
attr sendMail userReadings state:message:[\s\S]* {\
    my $emailTo   = 'you@example.com';;\
    my $emailFrom = 'fhem@exmaple.org';;\
    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;;\
    }\
    \
    #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, $1);;\
    }\
    \
    #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}\n' ";;\
    $cmd .= "-H 'Subject: $subject' ";;\
    $cmd .= "-H 'From: $emailFrom' ";;\
    \
    #multipart/alternative für Text und HTML EMail Body\
    $cmd .= "-F '=(;;type=multipart/alternative' ";;\
    $cmd .= "-F '=$message;;type=text/plain;; charset=UTF-8' ";;\
    $message =~ s/\r?\n/<br \/>/g;;\
    $cmd .= "-F '= <body>$message</body>;;type=text/html;; charset=UTF-8' ";;\
    $cmd .= "-F '=)' ";;\
    \
    #jetzt alle Attachments anhängen:\
    foreach my $file (@attachments) {\
        $cmd .= "-F '=@".$file.";;encoder=base64' ";;\
    }\
    \
    #stderr auch mit in den output sammeln:\
    $cmd .= " 2>&1";;\
    \
    #blocking function that is called from a forked process\
    if (!defined &sendMailfunc1) {\
        *sendMailfunc1 = sub ($) {\
            my ($param) = @_;;\
            my $result;;\
            $result = qx/$param/;;\
            $result = MIME::Base64::encode_base64($result);;\
            $result =~ s/\n//g;;\
            return $result;;\
        }\
    }\
    \
    #finish function that is called when blocking function is done\
    if (!defined &sendMailfunc2) {\
        *sendMailfunc2 = sub ($) {\
            my ($result) = @_;;\
            my $hash = $defs{$name};;\
            $result = MIME::Base64::decode_base64($result);;\
            readingsSingleUpdate($hash, $reading, $result, 1);;\
        }\
    }\
    \
    BlockingCall("sendMailfunc1", $cmd, "sendMailfunc2", 20);;\
    \
    return "started Job...";;\
},\
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";;\
}

bertl

Perfekt, so funktioniert es!

Danke für die rasche Hilfe  :)

bertl

#14
Vielleicht magst du meine Adaptierungen in deinem Codeschnipsel aufnehmen.
Dann würde der Codeschnipsel für ein und mehrzeilige sendMail funnktionieren und
auch die Verwendung von einfachen oder doppelten Hochkomma berücksichtigen.

Mehrzeilige Eingabe und auch Triggern des Events.
attr sendMail setList message:textField-long
attr sendMail userReadings state:message:[\s\S]* {\
Zeilenumbruch mit dem html <br> ersetzen.
  my $message = ReadingsVal($name, 'message', '???');;\
  $message =~ s/\r?\n/<br>/g;;\
Egal ob jemand beim sendMail " (doppeltes Hochkomma) oder ' (einfaches Hochkomma) nimmt, beides wird richtig abgehandelt.
  if ($message =~ s/(?:Subject|Betreff)=["'](.*?)["']//) {\  if ($message =~ s/(?:To|An)=["'](.*?)["']//) {\  while ( $message =~ s/(?:Attachment|Anhang)=["'](.*?)["']// ) {\Leerzeichen und <br> am Anfang und Ende vom Messagetext entfernen.
  # Leerzeichen und <br> am Anfang entfernen\
  $message =~ s/^(\s|<br>)+//;;\
  # Leerzeichen und <br> am Ende entfernen\
  $message =~ s/(\s|<br>)+$//;;\
\
  # der curl Befehl wird hier aufgebaut:\

Gruß Robert