FS20 per Mail schalten

Das folgende Beispiel zeigt, wie man die Anzahl der neuen Mails in einem POP3
Postfach eines Server abfragt und anschließend eine FS20 Komponente schaltet.
Am Besten richtet man sich hiefür ein separates Postfach ein.

Eine Verbindung zu einem lokalen POP3-Server (POP3 = Port 110) erhalten Sie mit:
$mbox = imap_open ("{localhost/pop3:110}INBOX", „user_id“, „password“);
Siehe auch: PHP: imap_open - Manual

Hier müssen Sie Ihren Server, Benutzernamen, sowie das Passwort eintragen.

Das Skript wird per Timer z .B. alle 10 Minuten ausgeführt und setzt eine bestehende
Internetverbindung voraus.

Werden neue Mails erkannt, so muß in der Betreffzeile „IPS“ stehen und in
der Nachricht der Name das von IP-Symcon auszuführende Skript in einer
eckigen Klammer [Lampe_An] oder (Lampe_Aus] (siehe Bild)

Dies soll lediglich nur die Grundlage für eigene Ideen sein, die gerne hier im
Forum veröffentlicht werden können.
Die // echo … habe ich absichtlich zu Testzwecken im Code gelassen.
Bei Fragen, Unklarheiten, Anregungen usw. bitte hier posten!

MST


<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
*/
//File: POP3Check.ips.php
// Triggered Variables:
// Timer Settings: 600
// Links:
// http://de3.php.net/manual/de/ref.imap.php
// http://de3.php.net/manual/de/function.substr.php
// http://de3.php.net/manual/de/function.strpos.php
// http://de2.php.net/manual/de/function.substr.php

@error_reporting(7);

// Connect to Mailbox

$mailbox = imap_open ("{pop.ipsymcon.de:110/pop3}INBOX", "PF_Name", "PF_Passwort")
   // erzeugt eine Meldung und bricht das Parsing / die Abarbeitung des Skriptes ab
   or die("Keine Verbindung bzw. Login ins Postfach");

// Mail holen
$check = imap_check($mailbox);
$num_msg = $check->Nmsgs;
$num_msg_new = $check->Recent;

// Mail auslesen
$nMessages = imap_num_msg($mailbox);
for($i = 1; $i <= $nMessages; $i++){
   $header = imap_header($mailbox, $i);
   $datum = $header->Date;
   $m_id = $header->message_id;
   $empfaenger = $header->toaddress;
   $betreff = $header->subject;
   $absender = $header->from[0]->personal;
   $absender_email = $header->from[0]->mailbox."@".$header->from[0]->host;
   $body = imap_body($mailbox,$i);
   $text_koerper = $body;
   $fheader = imap_fetchheader($mailbox,$i);
   $nachricht = quoted_printable_decode(imap_fetchbody($mailbox, $i, 1));
}
// echo "Nachricht: ".$nachricht."xENDEx
";
// echo "Anzahl Nachrichten: ".$num_msg."
";
// echo "Neue Nachrichten: ".$num_msg_new."
";

if (($num_msg_new > 0) and ($betreff == "IPS")){
   $k_auf = strpos($nachricht,"[");
   $k_zu = strpos($nachricht,"]");
   //echo  $k_auf;
   //echo  $k_zu;
   $script = substr($nachricht, $k_auf + 1 , $k_zu - $k_auf - 1 );
   echo "Skript: ".$script."
";
   IPS_RunScript($script);
   //TTS_Speak(52151, "You have new mails");
}

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

Voraussetzug:
php_imap.dll (Aktuell PHP 5.1.6. Download von der PHP Seite)

und ein Eintrag in der php.ini

extension=php_imap.dll;

schalten_per_mail.jpg

Das hiess also das IPS auf mails verschicken kann … ah jah
hehe heute abend probieren.

PS: gibt es eine IPS function die checkt ob das script tatsachlich bestaet?
oder soll mann uber


if (!fopen("path_zu_IPS"."/scripts/"."script_name"."ips.php", "r")) {
    do something
}

controlieren ?

Hallo GGGss,

leider gibt es noch keine Funktion – also selber machen:

Warning: fopen(c:/Programme/IP-SYMCON/scripts/fht1.ips.php) [<a href=‚function.fopen‘>function.fopen</a>]: failed to open stream: No such file or directory in line 10

bekomme ich, wenn die Datei nicht vorhanden ist.
Da muss doch anders gehen …?

MST

PS: Wie schmeckt das belgische Bier? :wink:

Hi…

ich nutze hierzu die Funktion: file_exists($Datei)
Diese liefert ein true als Rückgabewert wenn die Datei vorhanden ist und ein false wenn nicht.

ich denke da brauch man nicht extra was neues zu erfinden

Hallo Retiarius,

danke für den Hin weis – klappt prima:

http://de3.php.net/manual/de/function.file-exists.php

if (file_exists(„c:/Programme/IP-SYMCON/scripts/“.„fht.“.„ips.php“)) {
echo „TRUE“;
} else {
echo „FALSE“;
}

MST

@Steiner

und „extension=php_imap.dll“ in der „php.ini“ auskommentieren:

Ich finde die php.ini bei mir nicht, wo soll die denn sein ?

Gruss

Horst

Hallo Horst,

die php.ini befindet sich im IP-Symcon Hauptordner.
Zur Not hilft auch ein F3…

Gruß MST

@Steiner

suchen habe ich schon versucht, ich finde keine php.ini

Kann es sein das ich keine habe :confused:

gruss
horst

Hallo Horst,

ja, das kann sein. Man braucht diese nur, wenn man Extensionen benutzt und diese auch dann im Extensions Ordner hinterlegt werden. Lege bitte einfach eine php.ini im IP-SYMCON Ordner an und schreibe folgendes hinein:

<---------- php.ini ---------------->
; General
extension_dir=c:\Programme\IP-SYMCON\

extension=php_imap.dll

<---------- php.ini ---------------->

Anschliessend nicht vergessen, die php_imap.dll in den IP-SYMCON Ordner zu kopieren, falls die noch nicht drin ist.

Gruss Torro

@Torro,

danke hat geholfen.

Gruss
Horst

Klappt irgendwie noch nicht ganz :frowning:

Folgende meldung kommt im Output:

Notice: Undefined variable: k_auf in line 48
Notice: Undefined variable: k_zu in line 48
Notice: Undefined variable: k_auf in line 48
Warning: ips_runscript: Cannot find Script "Dim_Tischlampe_Wohnzimmer_On]
"! in line 55
Skript: Dim_Tischlampe_Wohnzimmer_On]

und hier Zeile 48 bis 55 des Scripts:

$script = substr($nachricht, $k_auf + 1 , $k_zu - $k_auf - 1 );
echo „Skript: „.$script.“
„;
if (($num_msg_new > 0) and ($betreff == „IPS“)){
$k_auf = strpos($nachricht,“[“);
$k_zu = strpos($nachricht,"]");
//echo $k_auf;
//echo $k_zu;
IPS_RunScript($script);

Kann mal wieder jemand helfen ?

Gruss
Horst

Hallo Horst,

die ersten drei Meldungen sind klar: Die Variablen wurden nicht vorher definiert, PHP verlangt seit kurzen eine restriktivere Variablenbenutzung, man sollte sie also vorher mal eindeutig setzen, z.B. durch $k_auf = „“;

Bei letzterem Fehler (Zeile 55) sagt Dir der interne Script-Editor, dass das genannte Script nicht vorhanden ist?

Gruss Torro

@Torro,

und wie löse ich das jetzt? Für mich sieht es ja so aus als wenn die eckigen Klammern nicht richtig erkannt werden, und deshalb auch das
Script "Dim_Tischlampe_Wohnzimmer_On] nicht erkannt wird.

Ein script mit eckiger Klammer am ende gibt es tatsächlich nicht

Gruss
Horst

Hallo Horst,

Was wird denn in der Zeile 49 ausgegeben? Da ist doch dann schon die Klammer da? Danach stimmt Deine Zeile 48 nicht beim zusammenbauen des Scriptnamens, Du nimmst also bei der Laenge ein Zeichen zuviel auf.

Also Zeile 48 ueberpruefen, ab besten, indem Du vorher auch noch


echo $nachricht . "
";
echo $k_auf . "
";
echo $k_zu . "
";

Auf welchen Wert setzt Du eigentlich die Werte k_auf und k_zu ? Sehe ich das richtig, dass Du die Werte erst in den Zeilen 51,52 holst, aber schon in der Zeile 48 brauchst? Ich glaube, da hast Du etwas durcheinander gebracht.

Gruss Torro

@Torro

ich habe das Script von Steiner aus dem ersten Post genommen und nur noch auf meine mail-Daten angepasst.

Ich dachte das dass Script in Ordnung ist und ich damit keine Probleme habe.

Gruss
Horst

Hallo,

ich habe das Beispielscript auch mal getestet und komme zum gleichen Ergebnis, habe mich aber noch nicht weiter mit der Fehlersuche beschäftigt.

Grüße Keule

Hallo Horst,

aber die Reihenfolge stimmt da nicht, bei Dir wird die Position erst danach berechnet. Aber wie auch immer, so gehts zu testen:


$nachricht="[Dim_Tischlampe_Wohnzimmer_On]";
$num_msg_new=1;
$betreff="IPS";

if (($num_msg_new > 0) and ($betreff == "IPS")){
   $k_auf = strpos($nachricht,"[");
   $k_zu = strpos($nachricht,"]");
   // echo  $k_auf;
   // echo  $k_zu;
   $script = substr($nachricht, $k_auf + 1 , $k_zu - $k_auf - 1 );
   // echo "Skript: ".$script."
";
   IPS_RunScript($script);
   //TTS_Speak(52151, "You have new mails");
}

Die Nachricht ist ja im Text der Email und muss durch die zwei Klammern den eingeschlossenen Script-Namen haben. Du kannst das obige Script kopieren in ein neues Script und im Script-Editor aufrufen. Da siehst Du, dass es so laeuft.

Gruss Torro

Hier eine andere Variante :wink:

Diese Führt ein Script aus wenn IPS im Betreff steht.

Im Body muss dann das Script stehen, das ausgeführt werden soll z.B.


IPS_RunScript("Lampe_An");

Die E-Mail wird immer vor dem Ausführen gelöscht, sodass bei einem Script Fehler die nächten Mails trotzdem abgearbeitet werden kann. (Beim nächsten Run)

Wichtig: Es scheint ein Problem mit Umlauten zu geben!


<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File	 : MailRunScript.ips.php
Trigger : 
Interval :
*/
@error_reporting(7);
$mailserver="pop.ipsymcon.de";
$username="web***";
$password="****";
// Connect to Mailbox
$mailbox = imap_open ("{".$mailserver.":110/pop3}INBOX", $username, $password)
		 or die("Keine Verbindung bzw. Login ins Postfach");
 
// Mail auslesen
$nMessages = imap_num_msg($mailbox);
if($nMessages == 0) {
exit; //Keine Nachrichten
}
//Alle Mails durchlaufen
for($i = 1; $i <= $nMessages; $i++)
{
$header = imap_header($mailbox, $i);
$subject = $header->subject;
$body = imap_fetchbody($mailbox,$i,"1");
 
if($subject == "IPS") {
	//IPS Nachricht löschen
	imap_delete($mailbox,$i);
	imap_expunge ($mailbox);
 
	//E-Mail Inhalt ausführen
	eval($body);
 
	echo "E-Mail Ausgeführt";
 
}
 
}
// Mailbox schließen
imap_close($mailbox);
?>

Grüße, paresy

@Torro,

danke, jetzt klappts :slight_smile:

Gruss
Horst

Hmm … LoVeLy :cool:

Ist es denn Uberhaupt möglich einel SMTP server ein zurichten und GLEICH (also nich max.9.59 minuten) die nachrich an IPS zu speisen ?

PS : dass hies also das IPS ein SMTP server wird die die möglichkeit hat processsor thread ab zu schnuffeln und die texte da zu uberprufen …

Ow - way - ya

lieber auf POP3 halten ??? :smiley:

<Sang die IPS-gemeinschaft : ‚Yaaaaah‘>

PPS : Ich auch :stuck_out_tongue: