Impressum Startseite Grund Installation Grundlagen Hilfreiches Projekte Querschläger Meckerecke

Codesnipsel: Überprüfung des Email Konto auf eingehende Mails/Betreffs und Alarmierung per SMS (o.ä.)

Nachdem hier "Gammu" die SMS Benachrichtigung recht Problemlos und sorgenfrei lief, fand ich die Idee prickelnd doch mal meine eigene SMS Alarmierung für mein Email Konto zu schreiben, so das bei bestimmten Absendern und/oder Betreffzeilen eine SMS Verschickt wird. Bei GMX sind ja 15 SMS pro Monat "inkl." aber wer mehr möchte muss zahlen...

Installation:

Damit "gammu" auch eine SMS von PHP aus verschicken kann, benötigt es Root rechte für den SMS Versand, bei aufruf von PHP sehr unwahrscheinlich das man dort Root Rechte so einfach bekommt. Also macht man etwas was man nicht tun sollte, man gibt dem "Gammu" Programm alle Rechte der Welt, und schon kann jeder der Zugriff auf den RPi hat auch mit Gammu was anfangen..., wen interessierts, der RPI ist nur hier Zuhause und da hat niemand Zugriff drauf. Internet Zugang von Außen bekommt der RPi hier auch nicht, also ist alles im grünen Bereich!

sudo chmod 0777 /usr/bin/gammu-smsd-inject

Möchte man keinen SMS Versand als Alarmierung kann man das obige komplett ignorieren.

Hier geht es erst mal direkt zu meinem PHP Script:

Was tut es ?

Es überprüft per IMAP das Email Konto (readonly!) und schaut welche Mails in den letzten 5 Minuten (Einstellbar) gekommen sind. Diese Mails werden auf die Suchmuster geprüft (Beliebig anlegbar) - sollte ein Muster gefunden werden (Email Adresse und/oder Betreff) kann man entweder eine SMS Versenden lassen (Gammu nötig) oder sonst wie irgendwas reagieren lassen (LED Anzeige geht an, Sirene heult los, etc pp...).

Eintragen müsst ihr eure Zugangsdaten für euer Mailkonto (ich habe es mit GMX erfolgreich getestet), und bei bedarf die SMS Nummer.

Hier nun das PHP Script: /var/www/index.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>email 2 sms</title>
</head>

<body>
<?php
//Für SMS Versand: sudo chmod 0777 /usr/bin/gammu-smsd-inject

//Angaben für das Email Postfach
$server='{imap.gmx.de:993/imap/notls/ssl/novalidate-cert}INBOX';
$adresse='A.Teichmann@NOSPAMgmx.net'; //Email Adresse
$password='EmailPasswort'; //Email Passwort

$suchmuster="email_suchmusterliste.txt";

$Nummer="004917012345678"; //SMS Benachrichtigungs Nummer
//Groß und Kleinschreibung bei Betreff und Email beachten ? "Ja" oder "Nein"
//Bei "Ja", muss die Email Adresse und der Betreff exakt dem Suchmuster entsprechen.
$casesensitiv="Nein";

//Zeitraum der Mailabfrage in Sekunden
$zeitraum="300"; //entspricht 300 Sekunden, also 5 Minuten

//Aktuelles Datum
$ay = date("Y");
$am = date("m");
$ad = date("d");
//Aktuelle Uhrzeit
$ahour = date("H");
$amin = date("i");
$asec = date("s");
$atimestamp = mktime($ahour,$amin,$asec,$am,$ad,$ay)-$zeitraum;

//Postfach nur zum Lesen öffnen
$imap = imap_open($server, $adresse, $password, OP_READONLY);

//iMap Headers holen und die Anzahl der vorhandenen Mails ermitteln
$headers = imap_headers($imap); $i=count($headers); $anzahl=1;

//Mails nacheinander einlesen
do {
$header = imap_header($imap, $i);

//Datum der Mail feststellen
$y = date("Y", $header->udate);$m = date("m", $header->udate);$d = date("d", $header->udate);
//Uhrzeit der Mail feststellen
$hour = date("H", $header->udate);$min = date("i", $header->udate);$sec = date("s", $header->udate);
//Zeitstempel erzeugen
$timestamp = mktime($hour,$min,$sec,$m,$d,$y);
//Zeitstempel mit aktuellem Zeitstempel minus Zeitraum überprüfen
if ($timestamp>=$atimestamp) {

//Sollte die Mail in den letzten 5 Minuten angekommen sein, dann verarbeite den Inhalt
$start=0;$found="";
//Suchmuster Liste einladen
if (file_exists($suchmuster)) { $inhalt=file_get_contents($suchmuster);} else {$inhalt="";}
$e=substr_count($inhalt, '<email>'); //Anzahl der Suchmuster


//Alle Suchmuster einmal auf jede Mail anwenden
do {
//Datum und Uhrzeit extrahieren
$datum=date("d.m.Y H:i:s", $header->udate);
//Email Adresse Extrahieren
$email = $header->from[0]->mailbox."@".$header->from[0]->host;
$oemail=$email;
//Betreff Extrahieren & anpassen
$betreff = $header->subject; $betreff=decode_imap_text($betreff);
$obetreff=$betreff;
//Groß Kleinschreibung beachten ?
if ($casesensitiv=="Nein") {$betreff=strtolower($betreff);$email=strtolower($email);}

//Suchmuster Email holen
$suchwort='<email>'; $suchwort2='</email>';
$suchlaenge=strlen($suchwort);
$start=strpos($inhalt,$suchwort,$start)+$suchlaenge; if ($start==true) {$found=1;
$ende=strpos($inhalt,$suchwort2,$start);
$Searchemail=trim(substr($inhalt,$start,($ende-$start)));} else {$found=0;}
if ($casesensitiv=="Nein") {$Searchemail=strtolower($Searchemail);}

if ($Searchemail=="*") {$Searchemail=$email;} // Sollte nur * angegeben sein, ist jede Email Adresse recht.

//Suchmuster Betreff holen
$suchwort='<Betreff>'; $suchwort2='</Betreff>';
$suchlaenge=strlen($suchwort);
$start=strpos($inhalt,$suchwort,$start)+$suchlaenge; if ($start==true) {$found=1;
$ende=strpos($inhalt,$suchwort2,$start);
$Searchbetreff=trim(substr($inhalt,$start,($ende-$start)));} else {$found=0;}
if ($casesensitiv=="Nein") {$Searchbetreff=strtolower($Searchbetreff);}
if ($Searchbetreff=="*") {$Searchbetreff=$betreff;} // Sollte nur * angegeben sein, ist jeder Betreff recht.


//Prüfen ob Suchmuster im Betreff vorkommt
if($betreff!=str_replace($Searchbetreff,"",$betreff)) {$ok=1;} else {$ok=0;}


//benachrichtigung wenn Suchmuster passend ist:
if ($Searchemail==$email && $ok==1) {
$betreff=$obetreff;$email=$oemail;

//Alarmierung per SMS
$smsNachricht=substr($email."-".$betreff,0,160);

exec( 'echo "'.$smsNachricht.'" | gammu-smsd-inject TEXT "'.$Nummer.'"');

//Alternativ kann man hier auch einen GPIO Ansteuern und eine externe Lampe aufblitzen lassen. Oder man lässt seine gesammte Technik runter fahren...
}


$e=$e-1;
} while($e>0);}
$i=$i-1;
} while($i>$anzahl);

//Postfach wieder Schließen
imap_close($imap);

exit;

function decode_imap_text($var){
$text = '';
$decode_header = imap_mime_header_decode($var);
foreach ($decode_header AS $obj) {
$text .= htmlspecialchars(rtrim($obj->text, "\t"));
}
return $text;
}
?>
</body>
</html>

Weiterhin muss auch noch eine Textdatei mit dem Namen "email_suchmusterliste.txt" im gleichen Verzeichnis liegen, wo im folgenden Format die Emailadressen und Betreffs drinnen stehen auf die eine Alarmierung stattfinden soll.

Die Datei /var/www/email_suchmusterliste.txt

Jetzt würde sozusagen alle Mails von info@dhl.com mit dem Betreff "Ihr Paketstatus" alarmiert werden. Weiterhin sämtliche Mails von "Luft@Hansa.com" unabhängig vom Betreff, und sowie eine Mail mit "Sie haben Gewonnen !" eintrudelt sollte es eine Alarmierung geben.

Reaktionsliste für die Email überprüfung
Das emailfeld gibt an auf welche email Absender Adresse reagiert werden soll. Wenn man ein * macht heisst das auf jede Email Adresse.
Der Betreff kann zusätzlich mit angegeben werden, dann werden nur die Mails berücksichtigt die auch das dortige Suchmuster im Betreff haben. Auch hier kann man mit einem * das Suchmuster auf alle Betreffs ausdehnen.

<email>info@DHL.com</email> <Betreff>Ihr Paketstatus</Betreff>

<email>Luft@Hansa.com</email> <Betreff>*</Betreff>

<email>*</email> <Betreff>Sie haben Gewonnen !</Betreff>

Damit das PHP Script auch die Mails checken kann muss es auch periodisch aufgerufen werden. Voreingestellt sind im Script 300 Sekunden, also 5 Minuten. Also legen wir mit "Sudo Crontab -e" einen Cronjob an und lassen das Script alle 5 Minuten die letzten Mails der 5 Minuten prüfen. Sollte was dabei sein, erfolgt eine Alarmierung.

*/5 * * * * /usr/bin/curl 192.168.0.55/index.php >/dev/null 2>&1

Das ist schon alles...

Wer möchte kann die Überprüfungszeit auch auf 1 Minute reduzieren oder auf 10 Minuten erhöhen. 5 Minuten fand ich ganz brauchbar.

Impressum Startseite Grund Installation Grundlagen Hilfreiches Projekte Querschläger Meckerecke