SKript per Mail oder SMS2Mail ausführen

Zusätzlich zum Skript werden noch weitere Einstellungen und Dateien benötigt:

In der php.ini (Root von IP-Symcon) muss folgendes ergänzt werden, falls noch nicht vorhanden:
----PHP.ini----
extension_dir=c:\Programme\IP-SYMCON
extension=php_imap.dll
----PHP.ini----

Dann braucht man noch die php_imap.dll (auch ins Root) und die class.smtp.php (in Verzeichnis Scripts) (s. Zip-Datei unten)

Wenn alle Dateien da sind, müssen folgende Variablen angepasst werden:

  • mailserver, mailserver_out, username, password
  • zugelassene_subjects und zugelassene_absender
  • sendermail, sendername, subject_out

Die Variablen sind selbstsprechend - die Doku ist im Code selbst. Falls ihr Fehler findet, immer her damit.

…und jetzt das Skript:


<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File     : MailRunScript.ips.php
Trigger : none, but timer
Interval :Timer @ 600 secs
Descr: Aufgabe:
ein anderes Skript nach Eingang von Mail ausführen

Anwendungsgebiete:
Schalten per Mail oder SMS

Ablauf:
- Checken der Mail
- Interpretation Mail (Absender, Betreff, Skriptname)
- Falls der Absender nicht bekannt ist (Definition über Variable) wird
  nichts gemacht, außer die Mail gelöscht
- ebenso bei Betreff und Skriptname
  Skriptname muss im Body der Mail in eckigen Klammern stehen !!!
  z.B: [Heizung_aus]
- falls alles in Ordnung ist, wird das Skript ausgeführt, die Mail gelöscht
  und der Absender bekommt eine Antwortmail, dass es funktioniert hat

Anmerkung:
Die POP-Mailbox muss ausschließlich dem IPS vorbehalten sein, da JEDE
Mail nach dem angucken sofort gelöscht wird. Aber so sammeln sich
auch keine SPAMS an ;-)
*/

@error_reporting(7);
$zugelassene_subjects = "IPS Mail von Vodafone-SMS"; //durch leerzeichen getrennt
$zugelassene_absender = "*.zi**e*@d***b.de j******e*@*a*l.com 0172***42*@vodafone-sms.de";  //durch leerzeichen getrennt
//Klasse für Mailversand importieren
//(c) by http://phpmailer.sourceforge.net/
include("scripts/class.smtp.php");
//Allg. Variablen
$CRLF = "
";
//Variablen für Serverzugriff
$mailserver="pop3.*****.de";
$mailserver_out = "smtp.*****.de";
$username="ips@*****.de";
$password="********";
//Absender für Bestätigungsmail
$sendermail = "ips@*****.de";
$sendername = "IP-SYMCON-Statusmail";
//Betreff  für Bestätigungsmail
$subject_out = "IPS-Statusmail";

//First: Mit Domain-Socket-Verbindung testen, ob der host überhaupt da ist
$fp = @fsockopen ($mailserver, 110, $errno, $errstr, 3);
if ($fp) {
   @fclose($fp);
   echo "MailRunScript: Host gefunden ".$mailserver." ";
} else {
   echo "Error connecting to Server ".$mailserver.":110 "
   .$errno." ".$errstr." ->Stopping MailRunScript";
   exit;
}

//Connect to mailbox

$mailbox = imap_open ("{".$mailserver.":110/pop3}INBOX", $username, $password)
         or die("MailRunScript: Keine Verbindung bzw. Login ins Postfach. ".imap_last_error());
// Mail auslesen
$nMessages = imap_num_msg($mailbox);
if($nMessages == 0) {
   echo "MailRunScript-> Keine neuen Nachrichten";
   exit;
}
//Alle Mails durchlaufen
for($i = 1; $i <= $nMessages; $i++)
{
   //Immer Nachricht Nummer 1 abarbeiten, da die vorherige Nummer 1
   //bereits expunged (gelöscht) wurde und sich die Numerierung verschoben hat
   $header = imap_header($mailbox, 1);
   $subject = $header->subject;
   $body = imap_fetchbody($mailbox,1,"1");
   $absender_email = $header->from[0]->mailbox."@".$header->from[0]->host;
       //IPS Nachricht löschen (dadurch wird die nächste wieder
       //die Nummer 1 !!
       //Auch Mails, die keine Schaltungen verursachen werden
       //gelöscht !!! (SPAM, falsche Absender......)
       imap_delete($mailbox,1);
       imap_expunge ($mailbox);
       //Falls Nachrichten nicht gelöscht werden,
       //kommt es zu Problemen, falls mehrere
       //Nachrichten auf dem Server sind !! (siehe Numerierung immer 1)
       //Betreff checken
       $pos = strpos($zugelassene_subjects, $subject);
       if ($pos === false) {     // Achtung: 3 Gleichheits-Zeichen !!!
         echo "MailRunScript-> Unzulässiger Betreff in eMail: ".$absender_email."->Stopping MailRunScript";
         exit;
       }
       //E-Mail Inhalt ausführen
       $k_auf = strpos($body,"[");
       $k_zu = strpos($body,"]");
       $script = substr($body, $k_auf + 1 , $k_zu - $k_auf - 1 );
       echo "MailRunScript->Skript das ausgeführt werden soll: ".$script;

       if (file_exists("c:/Programme/IP-SYMCON/scripts/".$script.".ips.php")) {
         $pos = strpos ($zugelassene_absender,$absender_email);
         if ($pos === false) {      // Achtung: 3 Gleichheits-Zeichen !!!
            //NICHT ZULÄSSIGER ABSENDER
            echo "MailRunScript-> Unzulässiger Absender in eMail: ".$absender_email."->Stopping MailRunScript";
            exit;
         } else {
            //Zulässiger Absender
            IPS_RunScript ($script);
            echo "MailRunScript-> E-Mail Ausgeführt: Befehl -> ".$script;
         }
         //--- Script für Mailversand ---
         //* Keine weitere Konfiguration nötig


         //Object erstellen
         $mail = new SMTP();

         //Zum SMTP Server verbinden
         if(!$mail->Connect($mailserver_out)) {
            echo "MailRunScript-> Error connecting to MAIL SERVER";
            exit;
         }
         //Handshake
         if(!$mail->Hello()) {
            echo "MailRunScript-> Error in HELLO";
            exit;
         }

         //Anmelden
         if(!$mail->Authenticate($username, $password)) {
             echo "MailRunScript-> Error in AUTH";
             exit;
         }

         //Mail generieren
         $message_out = $script." erfolgreich ausgeführt";

         $header_out ="From: \"$sendername\" <$sendermail>".$CRLF;
         $header_out.="To: $absender_email".$CRLF;
         $header_out.="Subject: $subject_out".$CRLF;
         $header_out.=$CRLF;

         //Absender angeben
         if(!$mail->Mail($sendermail)) {
             echo "MailRunScript-> Sender not Accepted";
         } else {      //empänger
             if(!$mail->Recipient($absender_email)) {
               echo "MailRunScript-> Receptor not accepted!";
             } else {
                if(!$mail->Data($header_out.$message_out)) {
                echo "MailRunScript-> Error Sending MAIL!";
                }
            }
         }
      } else {
         echo "MailRunScript-> E-Mail-Anweisung: c:/Programme/IP-SYMCON/scripts/".$script.".ips.php -> Script nicht gefunden -> Stopping MailRunScript".$CRLF;
       }
   //}
}
// Mailbox schließen
imap_close($mailbox);
?>

smtp und imap.zip (353 KB)

Hallo catmax,

Du koenntest noch etwas verbessern, nicht jeder hat genau Deine Verzeichnisstruktur, also deshalb niemals C:… angeben, sondern:

IPS_GetKernelDir() . "scripts/

Damit laufts auch auf anderen Betriebssystemen (englisch, da ist das Verzeichnis zum Beispiel C:\Program Files\IP-SYMCON\ oder anderen Laufwerken wie bei paresy…

Gruss Torro

Jau, hast du recht, werd ich zukünftig auf jeden Fall so machen. Bin ja noch Newbie und lerne täglich dazu.

Danke für den Hinweis

cAtMaX

wenn Du in der for {} Schleife exit einsetzt, wird Dein Script beendet. Evtl später auftretende Mails werden nicht mehr beachtet. Richtig wäre (wie bei Perl oder Java) break.
Für den Gültigkeitstest würde ich die wesentlich flexibleren Regular Expressions (preg_match,…) verwenden.

Tommi

Hi Tommi,

danke für deine Tips - das mit dem break werde ich auf jeden Fall kurzfristig berücksichtigen - bis jetzt wurde nach dem ersten „BAD“ Mail immer 10 Minuten Pause eingelegt (Timetrigger 600), bis dann wieder abgearbeitet wurde. Bei vielen Spams kann es also vorkommen, dass echte Befehle sehr zeitverzögert abgearbeitet werden.

zum preg_match:
Die Vergleiche mit den Zeichenketten gefallen mir sowieso nicht sonderlich gut - sind aber m.E. für ein Beispielskript besser geeignet als z.B. Arrays aus Global_defs. Ich habe auf meinem laufenden System kein Skript, was an irgendeiner Stelle Instance-IDs, eMailadressen o.ä. fest eingebrannt hat (alle in Global defs hinterlegt).
Habe aber mal irgendwo gelesen, dass strpos schneller geht als z.B. preg_match (ist das bei php5 nicht mehr der Fall ?)

Skript wird auf jeden Fall bald geupped :wink:
Gruß

cAtMaX

Wenn FS20 protokoll so schnell gehen wurde wie die zeitdifference swichen strpos & preg_match … yihaaa 1e IPS fur die ganse strasse.

Grusse,
Fredje

Hallo,

Skript überarbeitet, Voraussetzungen (dll etc.) sind wie im 1. posting

Überarbeitung:

  • entfernen der EXITs, damit auf jeden Fall alle Schaltbefehle in einem Skriptdurchlauf durchgeführt werden
  • einziger Abbruchgrund bleibt das Nichterreichen des Mailservers (dann wirds beim nächsten trigger hoffentlich klappen :wink: )

<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File     : MailRunScript.ips.php
Trigger : none, but timer
Interval :~600 secs
Decr:
Aufgabe:
ein anderes Skript nach Eingang von Mail ausführen

Anwendungsgebiete:
Schalten per Mail oder SMS

Ablauf:
- Checken der Mail
- Interpretation Mail (Absender, Betreff, Skriptname)
- Falls der Absender nicht bekannt ist (Definition über Variable) wird
  nichts gemacht, außer die Mail gelöscht
- ebenso bei Betreff und Skriptname
- falls alles in Ordnung ist, wird das Skript ausgeführt, die Mail gelöscht
  und der Absender bekommt eine Antwortmail, dass es funktioniert hat

Anmerkung:
Die POP-Mailbox muss ausschließlich dem IPS vorbehalten sein, da JEDE
Mail nach dem angucken sofort gelöscht wird. Aber so sammeln sich
auch keine SPAMS an ;-)
*/

@error_reporting(7);
$zugelassene_subjects = "IPS Mail von Vodafone-SMS";
$zugelassene_absender = "j.***@dzweb.de *******@gmail.com 0172*****@vodafone-sms.de";
//Klasse für Mailversand importieren
//(c) by http://phpmailer.sourceforge.net/
include("scripts/class.smtp.php");
//Allg. Variablen
$CRLF = "
";
//Variablen für Serverzugriff
$mailserver="pop3.****.de";
$mailserver_out = "smtp.**.de";
$username="ips@****.de";
$password="*********";
//Absender für Bestätigungsmail
$sendermail = "ips@*****.de";
$sendername = "IP-SYMCON-Statusmail";
//Betreff  für Bestätigungsmail
$subject_out = "IPS-Statusmail";

//First: Mit Domain-Socket-Verbindung testen, ob der host überhaupt da ist
$fp = @fsockopen ($mailserver, 110, $errno, $errstr, 3);
if ($fp) {
    @fclose($fp);
    echo "MailRunScript: Host gefunden ".$mailserver." ";
} else {
    echo "Error connecting to Server ".$mailserver.":110 "
    .$errno." ".$errstr." ->Stopping MailRunScript";
    exit; //Script beenden und bis zum nächsten Trigger abwarten
}

//Connect to mailbox
$mailbox = imap_open ("{".$mailserver.":110/pop3}INBOX", $username, $password)
    or die("MailRunScript: Keine Verbindung bzw. Login ins Postfach. ".imap_last_error());
// Mail auslesen
$nMessages = imap_num_msg($mailbox);
if($nMessages == 0) {
    echo "MailRunScript-> Keine neuen Nachrichten";
    exit;
}
//Alle Mails durchlaufen
for($i = 1; $i <= $nMessages; $i++)
{
    //Immer Nachricht Nummer 1 abarbeiten, da die vorherige Nummer 1
    //bereits expunged (gelöscht) wurde und sich die Numerierung verschoben hat
    $header = imap_header($mailbox, 1);
    $subject = $header->subject;
    $body = imap_fetchbody($mailbox,1,"1");
    $absender_email = $header->from[0]->mailbox."@".$header->from[0]->host;
    //IPS Nachricht löschen (dadurch wird die nächste wieder
    //die Nummer 1 !!
    //Auch Mails, die keine Schaltungen verursachen werden
    //gelöscht !!! (SPAM, falsche Absender......)
    imap_delete($mailbox,1);
    imap_expunge ($mailbox);
    //Falls Nachrichten nicht gelöscht werden,
    //kommt es zu Problemen, falls mehrere
    //Nachrichten auf dem Server sind !! (siehe Numerierung immer 1)
    //Betreff checken
    $pos = strpos($zugelassene_subjects, $subject);
    echo "pos ".$pos;
    if ($pos !== false) {
        //Betreff gefunden
       //E-Mail Inhalt ausführen
       $k_auf = strpos($body,"[");
       $k_zu = strpos($body,"]");
       $script = substr($body, $k_auf + 1 , $k_zu - $k_auf - 1 );
       echo "MailRunScript->Skript das ausgeführt werden soll: ".$script;
       if (file_exists(IPS_GetKernelDir()."scripts/".$script.".ips.php")) {
            $pos = strpos ($zugelassene_absender,$absender_email);
            if ($pos !== false) {
                //ZULÄSSIGER ABSENDER
                IPS_RunScript ($script);
                echo "MailRunScript-> E-Mail Ausgeführt: Befehl -> ".$script;
                //--- Script für Mailversand ---
                //* Keine weitere Konfiguration nötig
                //Object erstellen
                $mail = new SMTP();
                //Zum SMTP Server verbinden
                if($mail->Connect($mailserver_out)) {
                    //Handshake
                    if($mail->Hello()) {
                        //Anmelden
                        if($mail->Authenticate($username, $password)) {
                            //Mail generieren
                            $message_out = $script." erfolgreich ausgeführt";
                            $header_out ="From: \"$sendername\" <$sendermail>".$CRLF;
                            $header_out.="To: $absender_email".$CRLF;
                            $header_out.="Subject: $subject_out".$CRLF;
                            $header_out.=$CRLF;
                            //Absender angeben
                            if(!$mail->Mail($sendermail)) {
                                echo "MailRunScript-> Sender not Accepted";
                            } else {      //empänger
                                if(!$mail->Recipient($absender_email)) {
                                    echo "MailRunScript-> Receptor not accepted!";
                                } else {
                                    if(!$mail->Data($header_out.$message_out)) {
                                       echo "MailRunScript-> Error Sending MAIL!";
                                    }
                                }
                            }
                        } else {
                            echo "MailRunScript-> Error in AUTH";
                        }
                    } else {
                        echo "MailRunScript-> Error in HELLO";
                    }
                    } else {
                        echo "MailRunScript-> Error connecting to MAIL SERVER";
                    }
            } else {
                echo "MailRunScript-> Unzulässiger Absender in eMail: ".$absender_email."->Stopping MailRunScript";
             }
      } else {
             echo "MailRunScript-> E-Mail-Anweisung: ".IPS_GetKernelDir()."scripts/".$script.".ips.php";
             echo "-> Script nicht gefunden -> Stopping MailRunScript".$CRLF;
       }
    } else {
        echo "MailRunScript-> Unzulässiger Betreff in eMail: ".$absender_email."->Stopping MailRunScript";
    }

   //}
}
// Mailbox schließen
imap_close($mailbox);
?>

PS: hab den strpos trotzdem dringelassen - Dadurch werden die Schaltungen sicherlich nicht schneller, aber ich hab’s mir nunmal angewöhnt, den Befehl zu nutzen :smiley:

Gruß

cAtMaX

Danke für das Script läuft prima.

Kann man auch ein IPS Script mit Parameter starten z.B

Temperatur Wohnzimmer 20 Grad ??

Moin,

  1. freut mich, das es klappt

  2. Parameterschaltung

geht nicht so wie in den meisten anderen Programmiersprachen mit Skriptname(Variable), sondern nur über einen (kleinen) Umweg:

  • Variable in IPS anlegen, dabei den richtigen Datentypen beachten !!
  • im Skript, in dem du das andere Skript aufrufst, gibst du erstmal der Variablen aus Schritt einen Wert (z.B. SetValueFloat(„Variablenname“, <Wert>);
  • im Skript, dass du aufrufst, liest du die Variable dann aus (z.B. mit GetValueFloat(„Variablenname“);

Aber Achtung: Falls du das Skript, was aufgerufen wird noch sonstwie triggerst oder aufrufst, wird trotzdem die Variable ausgelesen und dementsprechend geschaltet !!! Also besser für sowas z.B. ein seperates Skript erstellen

Gruß

cAtMaX

Hallo cAtMaX,

finde das scrpt prima. bekomme aber immer eine fehlermeldung.

MailRunScript: Host gefunden pop3.t-online.de pos 0MailRunScript->Skript das ausgeführt werden soll: Lampe_Flur_oben_OnMailRunScript-> E-Mail-Anweisung: C:\Programme\IP-SYMCON\scripts/Lampe_Flur_oben_On.ips.php-> Script nicht gefunden -> Stopping MailRunScript

woran kann dies liegen, es wird das script nicht gefunden. oder ist der betreff falsch ?
wie wird denn der befehl in der mail geschrieben ?

mfg uwe

slash und backslash … hmm guck noch mal gut ?? da ist bestimmt dein fehler

Hi Uwe,

einfach irgendwo im Mailinhalt lediglich den Skriptnamen so schreiben, wie er im IPS angezeigt wird + . In deinem Beispiel wäre das:

[Lampe_Flur_oben_On]

Als Betreff reicht IPS (falls du nichts anderes festgelegt hast.)

Gruß

cAtMaX

Hi

mit der befehl ist es jetzt klar, aber es kommt immer die fehlermeldung das das script nicht gefunden wird.

C:\Programme\IP-SYMCON\scripts/lampe_aussen_OFF.ips.php-> Script nicht gefunden -

hier stimmt ja auch was nicht

slash und backslash

ich weiss nur nicht wo ich das ändern kann

Also bei mir kommt die Fehlermeldung nur, wenn ich ein Skript aufrufe, was nicht existiert.

Der Slash kommt nur aus der Statusmeldung in Zeile 146 - hat also nichts mit der Skriptausführung zu tun !!!

Gibt es denn die Skripte die du ausführen willst in IPS ? (case sensitive)

Gruß

Jörg

ja die scripte gibt es und funtionieren auch.
weiss irgendwie nicht weiter

Schade eigentlich…

…kannst du bitte einmal folgendes nachgucken:

Hast du das Skript vom 13.11. oder vom 15.11. ? Falls du das vom 13.11. hast, tausche es bitte gegen das vom 15.11. aus

Im Skript vom 13.11. ist fest „C:\Programme\IP-Symcon\Scripts“ als Skriptordner eingetragen - im Skript vom 15.11. habe ich das Skriptverzeichnis abhängig vom IPS-Kernel umgeschrieben, damit sollte es egal sein, wo IPS installiert wurde.

Bitte um kurze Info, ob’s jetzt klappt

Gruß

Jörg

hallo,
klappt jetzt mit schalten, aber nur mit dem alten script. beim neuen kommt immer fehlermeldung script nicht gefunden. aber das ist ja nicht so schlimm.
ein problem gibt es aber noch ich bekomme keine bestätigungsmail.
nur fehlermeldung

E-Mail Ausgeführt: Befehl -> Weihnacht_OFFMailRunScript-> Error in AUTH

das heisst doch das ips sich nicht anmelden konnte, oder ?

mfg uwe

Die Fehlermeldung deutet darauf hin, dass sich das Skript nicht am SMTP-Server anmelden konnte (das ist der Serverport, der zum Wegmailen genutzt wird).

Prüf doch bitte mal, ob die Variable „$mailserver_out“ (ziemlich weit oben im Skript) den richtigen Servernamen für deinen Provider benutzt. Vielleicht geht’s bei deinem Provider auch nicht mit smtp.blabla.de, sondern nur mit blabla.de oder etwas anderem ?

Gruß

cAtMaX

seit ich die beta vom webintervace drauf habe funktioniert mein mailscript nicht mehr.
es kommt immer die fehlermeldung

Error: Call to undefined function imap_open() in line 64
MailRunScript: Host gefunden pop3.freenet.de

hat jemand auch das problem

mfg uwe

seit ich die beta vom webintervace drauf habe funktioniert mein mailscript nicht mehr.

Jo, hab ich auch, hatte es aber gar nicht in Verbindung mit dem neuen Webinterface gebracht, aber stimmt ist erst seit ich das neue draufhabe.