+ Antworten
Seite 1 von 4 1 2 3 ... LetzteLetzte
Ergebnis 1 bis 10 von 39
  1. #1
    Registriert seit
    Nov 2005
    Ort
    Lüdenscheid - die Stadt des Lichts ;-)
    Beiträge
    268

    Post 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:
    PHP-Code:
    <?
    /*
    *******************************
    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 "\r\n";
    //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 ($mailserver110$errno$errstr3);
    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($mailbox1);
       
    $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 $k_zu $k_auf );
           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);
    ?>

  2. #2
    Registriert seit
    May 2005
    Ort
    Leipzig
    Beiträge
    3,964

    Standard Kleine Verbesserung

    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

  3. #3
    Registriert seit
    Nov 2005
    Ort
    Lüdenscheid - die Stadt des Lichts ;-)
    Beiträge
    268

    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
    Geändert von steiner (22.03.11 um 13:50 Uhr)

  4. #4
    Registriert seit
    May 2005
    Beiträge
    1,854

    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

  5. #5
    Registriert seit
    Nov 2005
    Ort
    Lüdenscheid - die Stadt des Lichts ;-)
    Beiträge
    268

    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
    Gruß

    cAtMaX
    Geändert von steiner (22.03.11 um 13:50 Uhr)

  6. #6
    Registriert seit
    Jul 2005
    Ort
    Roeselare - Belgium
    Beiträge
    1,394

    Zitat Zitat von cAtMaX
    dass strpos schneller geht als z.B. preg_match cAtMaX
    Wenn FS20 protokoll so schnell gehen wurde wie die zeitdifference swichen strpos & preg_match ... yihaaa 1e IPS fur die ganse strasse.

    Grusse,
    Fredje

  7. #7
    Registriert seit
    Nov 2005
    Ort
    Lüdenscheid - die Stadt des Lichts ;-)
    Beiträge
    268

    Post Skript aktualisiert

    Hallo,

    Skript &#252;berarbeitet, Voraussetzungen (dll etc.) sind wie im 1. posting

    &#220;berarbeitung:
    - entfernen der EXITs, damit auf jeden Fall alle Schaltbefehle in einem Skriptdurchlauf durchgef&#252;hrt werden
    - einziger Abbruchgrund bleibt das Nichterreichen des Mailservers (dann wirds beim n&#228;chsten trigger hoffentlich klappen )

    PHP-Code:
    <?
    /*
    *******************************
    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 "\r\n";
    //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 ($mailserver110$errno$errstr3);
    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($mailbox1);
        
    $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 $k_zu $k_auf );
           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&#246;hnt, den Befehl zu nutzen

    Gru&#223;

    cAtMaX
    Geändert von cAtMaX (15.11.05 um 19:54 Uhr)

  8. #8
    Registriert seit
    Dec 2005
    Ort
    Saarland
    Beiträge
    289

    Question per Mail IPS Script mit Parameter starten

    Danke für das Script läuft prima.

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

    Temperatur Wohnzimmer 20 Grad ??
    Geändert von steiner (22.03.11 um 13:50 Uhr)

  9. #9
    Registriert seit
    Nov 2005
    Ort
    Lüdenscheid - die Stadt des Lichts ;-)
    Beiträge
    268

    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
    Geändert von steiner (22.03.11 um 13:50 Uhr)

  10. #10
    Registriert seit
    Nov 2005
    Beiträge
    416

    Standard Mail

    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