Email-Versand (mit Boardmitteln, ohne Addon)

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

Antworten
mademyday
Beiträge: 272
Registriert: 03.10.2014, 12:46
System: CCU
Wohnort: Enzkreis
Hat sich bedankt: 3 Mal
Danksagung erhalten: 43 Mal

Email-Versand (mit Boardmitteln, ohne Addon)

Beitrag von mademyday » 11.02.2022, 10:42

Email-Versand mit cURL via Skript (everything.curl)

Ich wollte eine (für mich einfache) Möglichkeit erschaffen, aus beliebigen WebGUI-Programmen/Skripten unkompliziert eine Email zu versenden,
- ohne dass ich dazu ein Email-Addon und/oder irgend etwas anderes installieren muss (auf CCU2)
- ohne irgendwelche cfg-Dateien im Filesystem anzulegen oder zu bearbeiten
- nur mit HomeMatic-WebGUI-Mittel (ein Programm (mit einem Skript) und eine -oder mehrere- Systemvariable(n) reichen aus)

Dafür habe ich ein Skript erstellt, welches den Inhalt einer Systemvariable (als Programmtrigger "bei Aktualisierung") in Email-Betreff und -Body auftrennt - Trennzeichen ist der senkrechte Strich |, der dann selbst nicht im Betreff vorkommen kann (im Mailbody schon) - und dann via system.Exec und curl per Email versendet.

Das Skript:
- Edit/220218: mit optionaler SMS (je nach triggernder SV) und Debug-Funktion im "Skript testen"-Fenster

Code: Alles auswählen

! --- Prog: pSende_Email_SMS_curl
! --- Quelle: https://everything.curl.dev/usingcurl/smtp

boolean MAIL_TO_FLEX = false;
WriteLine( "--- MAIL_TO_FLEX: " # MAIL_TO_FLEX # " ---\n" );

boolean SMS    = false;
string  SMS_TO = "01234567890@vodafone-sms.de";

! ---> TO: Komma-separierte Liste <---
string MAIL_TO   = "xxx.yyy@web.de";
       MAIL_TO   = "xxx.yyy@zzz.de" # ", " # MAIL_TO;
     ! MAIL_TO   = "01234567890@vodafone-sms.de"       # ", " # MAIL_TO;

! ---

if( 1 ) {
  ! --- gmail (ggf. "Weniger sichere Apps zulassen: AN"): ---
  string MAIL_URL  = "smtps://smtp.gmail.com:465";
  string MAIL_FROM = "xxx.yyy@gmail.com";
  string MAIL_USER = "xxx.yyy@gmail.com: X X X ";

} elseif( 0 ) {
  ! --- web.de (POP3/IMAP in den WEB.DE Einstellungen einschalten!) ---
  string MAIL_URL  = "smtps://smtp.web.de:465";
  string MAIL_FROM = "xxx.yyy@web.de";
  string MAIL_USER = "xxx.yyy: X X X ";

} else {
  ! --- gmx.net (POP3 und IMAP Zugriff erlauben!): ---
  string MAIL_URL  = "smtps://mail.gmx.net:465";
  string MAIL_FROM = "xxx.yyy@gmx.net";
  string MAIL_USER = "xxx.yyy@gmx.net: X X X ";
}

! ---------------------------------------------------------------------
! ---------------------------------------------------------------------
! ---------------------------------------------------------------------

if( dom.GetObject("$this$") ){ string PROG = dom.GetObject("$this$").Name();
                      } else { string PROG = "-not defined-"; }

! ---

if( (dom.GetObject("$src$")) && (dom.GetObject("$src$").IsTypeOf(OT_VARDP)) ) {
  string message = (dom.GetObject(ID_SYSTEM_VARIABLES)).Get( (dom.GetObject("$src$").Name()) ).Value();
  if( dom.GetObject("$src$").Name().ToUpper().Contains("SMS") ) { SMS = true; }

} else {
  ! --- Demo-Betreff: ---
  string message = "Demo Betreff";

  ! --- ggf. MAIL_TO voranstellen: ---
  if( MAIL_TO_FLEX ) { message = MAIL_TO # "|(MAIL_TO_FLEX/DEMO) " # message; }

  ! --- Demo: Body: ---
  message = message # "|" # "Demo Body";
  ! --- "nacktes" ´ kommt nicht korrekt an (zB als é schon)! ---
}

! ---

if( MAIL_TO_FLEX ) {
  string MAIL_TO = message.StrValueByIndex( "|", 0 );
         message = message.Substr( (MAIL_TO.Length()+1), (message.Length()-MAIL_TO.Length()-1) );
}

if( SMS ) { MAIL_TO = MAIL_TO # ", " # SMS_TO; }
WriteLine( "--- SMS: " # SMS # " ---\n" );

string MAIL_SUBJECT = message.StrValueByIndex( "|", 0 );
string MAIL_BODY    = message.Substr( (MAIL_SUBJECT.Length()+1), (message.Length()-MAIL_SUBJECT.Length()-1) );

! ---

string MAIL = "From: " # MAIL_FROM # "
To: " # MAIL_TO # "
Subject: " # MAIL_SUBJECT # "
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
Content-Type: text/plain;charset=utf-8
X-CCU2-program: " # PROG # "
X-CCU2-localtime: " # system.Date("%Y-%m-%d %H:%M:%S") # "

" # MAIL_BODY;

! --- MAIL = MAIL.Trim() # "\n[-->" # system.Date("%H:%M") # "]";

MAIL = MAIL.ToUTF8();

string BS = "\\ ".Substr(0,1); ! --- backslash als string/char
! MAIL = MAIL # "\n1x Backslash: " # BS # " - 2x BS: " # BS # BS;
MAIL = MAIL.Replace( BS, BS#BS );

MAIL = MAIL.Replace( '"', '\\"'  );
MAIL = MAIL.Replace( "'", "'\"'\"'"  );
MAIL = MAIL.Replace( "$", "\$" );
MAIL = MAIL.Replace( "`", "\`" );

WriteLine( "--- MAIL: ---\n" # MAIL # ";\n" );

! ---

string RCPT = ""; string TO;
foreach( TO, MAIL_TO.Split(",") ) {
 RCPT = RCPT + "--mail-rcpt \"" # TO.Trim() # "\" \\\n";
}
WriteLine( "--- RCPT: ---\n" # RCPT # ";\n" );

! ---

if( MAIL_USER.Contains( "XXX"   ) || MAIL_USER.Contains( "X X X" ) ) {
  WriteLine( "MAIL_USER: user/pw failed! --- quit!" );
  quit;
}

! --- if( ! dom.GetObject("$this$") ) { WriteLine( "DEBUG --> QUIT!" ); quit; }

string log = 'Prog: ' # PROG # ' --- system.Exec() fuer Email-Versand mittels curl';
WriteLine( log ); ! --- dom.GetObject(ID_SYSTEM_VARIABLES).Get('log').State( log );

if(  0||  dom.GetObject("$this$")  ) {
  ! WriteLine / system.Exec
  system.Exec ( "sh -c '
echo \"" # MAIL # "\" |\
curl    --ssl-reqd --max-time 60 \
--url \"" # MAIL_URL # "\" \
--user \"" # MAIL_USER # "\" \
--mail-from \"" # MAIL_FROM # "\" \
" # RCPT
# "--upload-file - \
1>/dev/null 2>&1 &'
" );

} else {
  var stdout; var stderr;

  ! WriteLine / system.Exec
  system.Exec ( "
echo \"" # MAIL # "
__DEBUG__(stdout/stderr)__\" |\
curl -v --ssl-reqd --max-time 60 \
--url \"" # MAIL_URL # "\" \
--user \"" # MAIL_USER # "\" \
--mail-from \"" # MAIL_FROM # "\" \
" # RCPT
# "--upload-file -", &stdout, &stderr );

  WriteLine( "\n--- stdout: ---\n" # stdout # ";" );
  WriteLine( "\n--- stderr: ---\n" # stderr # ";" );
}

! ---

WriteLine("--- Ende ---");
- getestet mit gmail, web.de und gmx.net
- sh -c '... &' um keinen Zombie-Prozess durch Hintergrund-Ausführung zu hinterlassen (kA ob das immer noch ein Thema bei der CCU2 ist)
- je nach persönlicher Vorliebe kann auch eine variable Adressierung realisiert werden ("to|subj|body", s. MAIL_TO_FLEX)

Das Programm dazu zB so:
pSende_Email_curl.jpg
- der Name der triggernden SV ist frei wählbar, hier vSende_Email_curl
- es können auch mehrere SV triggern (mit "oder" verknüpft)
- wenn die triggende SV "SMS" im Namen hat (zb vSende_SMS_curl), hängt das Skript die vorbelegte "SMS_TO"-Adresse an die To:-Liste an
- ausgelöst wird mit "beliebiger Text + bei Aktualisierung" - da diese Bedingung nie "wahr" ist, braucht es noch eine oder-Verknüpfung mit einer "immer wahr"-Bedingung, dafür eignet sich zb die umbenannte Anwesentheits-SV (hier: "Reboot_aktiv")

Genutzt/getriggert kann das zB via Programm:
pSende_Email_curl-_test_.jpg
- Trennzeichen zwischen den Feldern ist der senkrechte Strich "|", zb "Betreff|Body" bzw "MailTo|Betreff|Body"

oder eben in einem Skript

Code: Alles auswählen

dom.GetObject(ID_SYSTEM_VARIABLES).Get('vSende_Email_curl').State( "demo subj|demo body" );
! --- bei MAIL_TO_FLEX: ...State( "xxx@yyy.de, zzz@xyz.de|demo subj|demo body" );
Zuletzt geändert von mademyday am 20.02.2022, 14:07, insgesamt 4-mal geändert.

Benutzeravatar
blackhole
Beiträge: 3730
Registriert: 21.07.2015, 14:03
System: CCU
Hat sich bedankt: 184 Mal
Danksagung erhalten: 587 Mal

Re: Email-Versand mit curl via Skript (everything.curl)

Beitrag von blackhole » 11.02.2022, 11:04

mademyday hat geschrieben:
11.02.2022, 10:42
everything.curl (...)

Hervorragende Idee, sehr cool! 8)

Ich habe mir selbst das Leben etwas einfacher gemacht und den "Backup-Kommunikationskanal" (bei mir E-Mail, primär verwende ich Telegram), ebenfalls ohne Verwendung von Addons, mit zwei Einzeilern und einer .conf realisiert:

sendemail.sh:

Code: Alles auswählen

#!/bin/sh
echo -e "Subject: $1\r\n\r\n$2" |msmtp --file=/usr/local/addons/email/msmtp.conf -t $3
HM-Script (Beispiel):

Code: Alles auswählen

 ! Sende E-Mail
 ! -----------------------------------------------------------------------------------------------------------------------
 system.Exec("/usr/local/addons/email/sendemail.sh 'Das ist der Betreff' 'Das ist die Nachricht' 'max@mustermann.de' &");

Das via cURL zu realisieren ist aber um ein Vielfaches cooler. Super Idee!

mademyday
Beiträge: 272
Registriert: 03.10.2014, 12:46
System: CCU
Wohnort: Enzkreis
Hat sich bedankt: 3 Mal
Danksagung erhalten: 43 Mal

Re: Email-Versand mit curl via Skript (everything.curl)

Beitrag von mademyday » 12.02.2022, 11:14

blackhole hat geschrieben:
11.02.2022, 11:04
Hervorragende Idee, sehr cool! 8)
Danke :)

blackhole hat geschrieben:
11.02.2022, 11:04
Ich habe mir selbst das Leben etwas einfacher gemacht und den "Backup-Kommunikationskanal" (bei mir E-Mail, primär verwende ich Telegram), ebenfalls ohne Verwendung von Addons, mit zwei Einzeilern und einer .conf realisiert:
ja, in einer ersten Version habe ich auch auf addons/email/msmtp zurückgegriffen :

Code: Alles auswählen

system.Exec( "sh -c \"echo -e From: '"    # from # "'" # BS3n
                           # "To: '"      # to   # "'" # BS3n
                           # "CC: '"      # cc   # "'" # BS3n
                           # "Subject: '" # subj # "'" # BS3n # BS3n
                           # "'" # body # "'"
                           # " | /etc/config/addons/email/msmtp"
                           # "     -t -C /etc/config/addons/email/msmtp-web_de.conf"
                           # " 1>/dev/null 2>&1 &\"" );
ich wollte dann aber eine Lösung die echt ohne AddOn und ohne weitere Files auf auskommt

Benutzeravatar
blackhole
Beiträge: 3730
Registriert: 21.07.2015, 14:03
System: CCU
Hat sich bedankt: 184 Mal
Danksagung erhalten: 587 Mal

Re: Email-Versand mit curl via Skript (everything.curl)

Beitrag von blackhole » 12.02.2022, 11:20

mademyday hat geschrieben:
12.02.2022, 11:14
ja, in einer ersten Version habe ich auch auf addons/email/msmtp zurückgegriffen

Genau das mache ich nicht.
Ich greife auf /usr/bin/msmtp zurück, welches Bestandteil der Original-Firmware ist und eben nicht Bestandteil irgendeines Addons ist.

Benutzeravatar
EiGude
Beiträge: 28
Registriert: 29.12.2021, 21:22
System: CCU und Access Point
Wohnort: Idstein
Hat sich bedankt: 2 Mal
Danksagung erhalten: 3 Mal

Re: Email-Versand mit curl via Skript (everything.curl)

Beitrag von EiGude » 15.02.2022, 10:09

Gude zusammen,

wirklich eine Prima Idee auch ich versuche ohne Addon's auszukommen und da kam mir diese Lösung gerade recht.
Nur leider will das bei mir nicht Funktionieren und eine Email verschicken ;(

Ich habe alles wie im ersten Post eingerichtet. Das Programm wird auch bei Aktualisierung der SV getriggert. Meine Email Zugangsdaten usw. stimmen soweit auch. Ich habe dann mal den curl command manuell auf der CCU ausgeführt und das hat soweit geklappt und die Email kam an.
Nur will es über das Programm/Skript leider nicht. Fehler sehe in den Logs soweit auch keine. Wenn ich über Skript Testen gehe (Ausgabe unten) scheint soweit alles durch zu laufen, aber leider kein Email versandt?!
Auch Mail_To_Fex false macht keinen Unterschied.

Code: Alles auswählen

--- MAIL_TO_FLEX: true ---

--- MAIL: ---
From: w****@gmail.com
To: w****@gmail.com
Subject: (MAIL_TO_FLEX/DEMO) Demo Betreff
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
Content-Type: text/plain;charset=utf-8
X-CCU2-program: -not defined-
X-CCU2-localtime: 2022-02-15 10:03:54

Demo Body;

--- RCPT: ---
--mail-rcpt "w****@gmail.com" \
;

Prog: -not defined- --- system.Exec() fuer Email-Versand mittels curl
--- Ende ---
Irgendeine Idee wo ich noch nachschauen kann um eventuelle Fehler zu finden?

Vielen Dank im voraus,
Gude
Heiko
----------------------------------------------------------------------------------------------------------
Zentrale CCU3 mit HmIP-HAP; HmipW - 28 Devices; HmIP - 52 Devices .. and growing

mademyday
Beiträge: 272
Registriert: 03.10.2014, 12:46
System: CCU
Wohnort: Enzkreis
Hat sich bedankt: 3 Mal
Danksagung erhalten: 43 Mal

Re: Email-Versand mit curl via Skript (everything.curl)

Beitrag von mademyday » 15.02.2022, 11:18

hi!

mein "Debug" im "Skript testen"-Fenster lief so:
1) beim curl ein -v (für "verbose" hinzufügen)
2) im Skript das system.Exec gegen ein WriteLine austauschen
3) die Ausgabe zwischen den Einzel-Hochkommas in die Zwischenablage kopieren
4) die Zwischenablage am ssh-shell-prompt einfügen
pSende_Email_curl-_debug_.jpg
klingt leicht bescheuert, ist wohl auch so :)
hoffe trotzdem, dass das hablbwegs verständlich ist?

Tante Edit sagt: das "gleiche" in kurz: das system.Exec abändern:

Code: Alles auswählen

var stdout; var stderr;

! WriteLine / system.Exec
system.Exec ( "echo \"" # MAIL # "\" |\
curl -v --ssl-reqd --max-time 60 \
--url \"" # MAIL_URL # "\" \
--user \"" # MAIL_USER # "\" \
--mail-from \"" # MAIL_FROM # "\" \
" # RCPT
# "--upload-file -", &stdout, &stderr );

WriteLine( "\n--- stdout: ---\n" # stdout # ";" );
WriteLine( "\n--- stderr: ---\n" # stderr # ";" );
--> liefert bei mir, zb via web.de:

Code: Alles auswählen

--- stdout: ---
null;

--- stderr: ---
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello (2):
{ [122 bytes data]
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
{ [6 bytes data]
* TLSv1.3 (IN), TLS handshake, Certificate (11):
{ [3952 bytes data]
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
{ [264 bytes data]
* TLSv1.3 (IN), TLS handshake, Finished (20):
{ [52 bytes data]
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
} [1 bytes data]
* TLSv1.3 (OUT), TLS handshake, Finished (20):
} [52 bytes data]
< 220 web.de (mrweb105) Nemesis ESMTP Service ready
} [5 bytes data]
> EHLO homematic-ccu2
{ [5 bytes data]
...
Zuletzt geändert von mademyday am 15.02.2022, 15:03, insgesamt 1-mal geändert.

Benutzeravatar
EiGude
Beiträge: 28
Registriert: 29.12.2021, 21:22
System: CCU und Access Point
Wohnort: Idstein
Hat sich bedankt: 2 Mal
Danksagung erhalten: 3 Mal

Re: Email-Versand mit curl via Skript (everything.curl)

Beitrag von EiGude » 15.02.2022, 13:25

Gude mademyday,

vielen Dank für deine Hilfe. Das Problem saß wie so oft nen Meter vor dem Bildschirm :oops:
"curl -v" und Ausgabe von stderr hat mir meinen Fehler gezeigt, beim Anpassen vom Mail User hatte ich nen Fehler mit den "" reingemogelt und übersehen..
Funzt jetzt prima!!

nochmal Danke für deine Mühe
Gude
Heiko
----------------------------------------------------------------------------------------------------------
Zentrale CCU3 mit HmIP-HAP; HmipW - 28 Devices; HmIP - 52 Devices .. and growing

mademyday
Beiträge: 272
Registriert: 03.10.2014, 12:46
System: CCU
Wohnort: Enzkreis
Hat sich bedankt: 3 Mal
Danksagung erhalten: 43 Mal

Re: Email-Versand mit curl via Skript (everything.curl)

Beitrag von mademyday » 16.02.2022, 09:14

schön wenn es klappt - und danke für das Feedback 8)

wenn es funktioniert und kein Debugging mehr nötig ist, würde ich empfehlen, das system.Exec wieder auf die Hintergrund-Ausführung (wie im Original-Post) zurückzustellen, damit die Homematic-Prozesse nicht blockiert werden, falls der Versand mal länger dauert

Edit: das Debugging mit der "curl -v"-Ausgabe mittels stdout/stderr habe ich in das Skript im ersten Post eingebaut (für den Einsatz im "Skript testen"-Fenster)

Benutzeravatar
EiGude
Beiträge: 28
Registriert: 29.12.2021, 21:22
System: CCU und Access Point
Wohnort: Idstein
Hat sich bedankt: 2 Mal
Danksagung erhalten: 3 Mal

Re: Email-Versand (mit Boardmitteln, ohne Addon)

Beitrag von EiGude » 08.04.2022, 15:47

Gude Gemeinde,

Nachdem mir Gmail sehr nachdrücklich erklärt hat das der Zugriff für "Weniger sichere Apps" zu Ende Mai eingestellt wird, habe ich es mal über mein T-Online Konto probiert. Und siehe da, funktioniert Tadellos.

Für den Fall das dies auch für andere Interessant ist, hier die Einstellungen:

Code: Alles auswählen

  string MAIL_URL  = "smtps://securesmtp.t-online.de:465";
  string MAIL_FROM = "xxx.yyy@t-online.de";
  string MAIL_USER = "xxx.yyy@t-online.de:your-password";
Gude
Heiko
----------------------------------------------------------------------------------------------------------
Zentrale CCU3 mit HmIP-HAP; HmipW - 28 Devices; HmIP - 52 Devices .. and growing

sct
Beiträge: 139
Registriert: 02.03.2016, 15:12
Hat sich bedankt: 1 Mal

Re: Email-Versand (mit Boardmitteln, ohne Addon)

Beitrag von sct » 06.01.2023, 15:24

Wirklich super Idee!! Ich nutze das jetzt auch und lasse mir bei Problemen eine EMail senden. Leider habe ich keinen WEB.de oder Telekom Zugang sondern einen Duocircle Zugang. Die Zugangsdaten müssen für die Nutzung von Duocircle daher wie folgt angepasst werden:

Code: Alles auswählen

string MAIL_URL  = "smtps://outbound.mailhop.org:465";
string MAIL_FROM = "CCU2@<serverdomain>";
string MAIL_USER = "<login_bei_Duocircle>:<passwort_bei_Duocircle>";
Ciao
sct

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“