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 ---");
- 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: - 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: - 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" );