Eintreffende Mails abfragen und per Sprachausgabe ausgeben

Programmierung der FHZ-Zentralen mit contronics homeputer Standard / homeputer Studio & WEB-Server

Moderator: Co-Administratoren

Benutzeravatar
squeeezer
Beiträge: 545
Registriert: 17.07.2006, 00:00
Wohnort: Idstein

Eintreffende Mails abfragen und per Sprachausgabe ausgeben

Beitrag von squeeezer » 09.07.2007, 16:59

hi ...

ich habe hier mal ein beispiel, wie man das eintreffen von neuen mails in seinem postfach (z.B. bei gmx) auswerten und ggf. durch eine sprachausgabe vorlesen lassen kann. weiterhin wird dies in ein log oder ein textfenster geschrieben.

die lösung ist eine mischung zwischen makrosprache und php-bestandteilen. für das abrufen von mails benötigt man eine php-extension namens "php_imap.dll". diese ist im php-paket unter extensions vorhanden. diese .dll einfach ins homeputer-root-verzeichnis kopieren und folgende stellen der php.ini anpassen (ggf .ini erstellen):

Code: Alles auswählen

; Directory in which the loadable extensions (modules) reside.
extension_dir = "c:\homeputerstudio"

Code: Alles auswählen

; Windows Extensions
; Note that ODBC support is built in, so no dll is needed for it.
; Note that many DLL files are located in the extensions/ (PHP 4) ext/ (PHP 5)
; extension folders as well as the separate PECL DLL download (PHP 5).
; Be sure to appropriately set the extension_dir directive.

;extension=php_mbstring.dll
;extension=php_bz2.dll
;extension=php_curl.dll
;extension=php_dba.dll
;extension=php_dbase.dll
;extension=php_exif.dll
;extension=php_fdf.dll
;extension=php_filepro.dll
;extension=php_gd2.dll
;extension=php_gettext.dll
;extension=php_ifx.dll
extension=php_imap.dll
;extension=php_interbase.dll
;extension=php_ldap.dll
;extension=php_mcrypt.dll
;extension=php_mhash.dll
;extension=php_mime_magic.dll
;extension=php_ming.dll
;extension=php_mssql.dll
;extension=php_msql.dll
für das beispiel benötigt man 2 makros und einige variablendeklarationen.

zunächst wird eine "globale" variable benötigt, die ich - zusätzlich zu vielen anderen - in einem eigens dafür angelegten objekt "var" gespeichert habe. diese lautet
  • var.anzahlMail
und ist vom typ "zahl".

dieser variablen wird die gesamtzahl der mails zugeordnet, die derzeit im postfach vorhanden ist. dies kann man durch folgendes makro realisieren, welches beim programmstart ein mal ausgeführt werden muss:

Code: Alles auswählen

**objektname: MAKROMailAnzahl
** ausführungsintervall des makros: beim systemstart (z.b. im objekt *init)

<?
   // mailbox öffnen, die attribute "pop.gmx.net" = pop3-host, "name@gmx.net" = benutzername oder mail-adresse und "12345678" = passwort entsprechend anpassen
	$mbx = imap_open ("{pop.gmx.net:110/pop3}INBOX", "mail@gmx.net", "12345678") or die("POP3 Connection kann nicht hergestellt werden");
   // es wird die gesamtzahl der vorliegenden nachrichten im pop3-postfach ermittelt und in die variable var.anzahlMail geschrieben
	$V_Var_anzahlMail = imap_num_msg($mbx);
   // schließen der mailbox und der pop3-verbindung
	imap_close($mbx);
?>

** auswerten eventueller fehler in ein logfile

wenn scriptoutput <> "" dann
   LOGFile := "PHP: " + scriptoutput
   aufrufen(LOGFile)
   scriptoutput := ""
endewenn
man braucht diese information, um zu bestimmen, ob und wann neue mails eintreffen. das eigentliche makro wird in regelmäßigen abständen ausgeführt.

in diesem makro müssen folgende objekt-variablen definiert werden
  • anzahl (typ zahl)
    neu (typ zahl)
    text (typ zeichen)
    speech (typ zeichen)
dann folgt das makro

Code: Alles auswählen

** ausführungsintervall des makros: jede minute

** zunächst die prüfung auf 10-min-abstände, damit der mailserver nicht zu oft angesprochen wird.e
** weiterhin wird eine bedingung geprüft, ob die mails überhaupt per sprachausgabe ausgegeben werden sollen.

wenn uhrzeit =# "**:*0:**" und OBJAnsageMail = "an" dann
  gehezu ausfuehren
endewenn
verlassen

ausfuehren:

** jetzt kommt der php-teil, um die mails vom pop3-server abzufragen

<?
   // mailbox öffnen, die attribute "pop.gmx.net" = pop3-host, "name@gmx.net" = benutzername oder mail-adresse und "12345678" = passwort entsprechend anpassen
	$mbx = imap_open ("{pop.gmx.net:110/pop3}INBOX", "name@gmx.net", "12345678") or die("POP3-Connection kann nicht hergestellt werden");
	// ermitteln der aktuellen anzahl von mails im postfach
   $i = imap_num_msg($mbx);
   // auslesen des mail-headers
	$header = imap_header($mbx, $i);
   // auslesen weiterer attribute des mail-headers
	$betreff = $header->subject;
   $absender = $header->from[0]->personal;
   $absender_email = $header->from[0]->mailbox."@".$header->from[0]->host;
   // generieren des strings für die anzeige (z.b. in einem log oder in einem textfenster (siehe unten)
	$text_text = "von ".$absender_email;
   // generieren des strings für die sprachausgabe
	$text_speech = "neue e-mail eingegangen . absender der e-mail ist . ".$absender." . betreff . ".$betreff;
   // übernehmen des inhaltes in variablen des makros
	$V_MAKROMailEingang_text = $text_text;
   $V_MAKROMailEingang_speech = $text_speech;
   $V_MAKROMailEingang_anzahl = $i;
   imap_close($mbx);
?>

** auswerten eventueller fehler in ein logfile

wenn scriptoutput <> "" dann
   LOGFile := "PHP: " + scriptoutput
   aufrufen(LOGFile)
   scriptoutput := ""
endewenn

** jetzt erfolgt die prüfung, ob die anzahl der aktuellen mails gleich oder sogar niedriger (durch löschen von mails) sind, als die zuletzt gespeicherte anzahl
** wenn dies zutrifft, wird die gespeicherte anzahl der mails auf den aktuellen wert gesetzt und das makro abgebrochen

wenn anzahl <= var.anzahlMail dann
   var.anzahlMail := anzahl
   verlassen
	
** ansonsten wird die anzahl der neu eingetroffenen mails in die makro-variable neu gespeichert und die gespeicherte anzahl aktualisiert
	
sonst
   neu := anzahl - var.anzahlMail
   var.anzahlMail := anzahl
   
** ausgabe der mail als sprachausgabe	
	
	sprachausgabe(speech)
   
** für die anzeige (z.b. im log oder anzeigefenster) kann man jetzt - abhängig von der anzahl der neuen mails - die ausgabe variieren
	
   wenn neu > 1 dann
      LOGFile := "IT: " + neu + " neue E-Mails eingegangen, zuletzt " + text
   sonst
      LOGFile := "IT: Neue E-Mail eingegangen " + text
   endewenn
   aufrufen(LOGFile)
endewenn
das makro ist entsprechend kommentiert und kann natürlich den eigenen bedürfnissen angepasst werden. ggf kann auch der mail-text mit abgefragt werden. dies kann man über den einbau einer php-zeile

Code: Alles auswählen

$nachricht = quoted_printable_decode(imap_fetchbody($mbx, $i, 1)); 
erreichen.

viel spass :)
... squeeezer

joesch
Beiträge: 789
Registriert: 03.02.2007, 14:57
Hat sich bedankt: 64 Mal
Danksagung erhalten: 2 Mal

Re: Eintreffende Mails abfragen und per Sprachausgabe ausgeben

Beitrag von joesch » 17.03.2008, 18:12

Hallo Squeezer,

eine kurze Frage: Worauf kann die Fehlermeldung "PHP: Parse Error:parse error, unexpected '=' in <Verzeichnisangabe> on lin 1" hindeuten?
Habe den Code für einen ersten Test Original übernommen und danach das Ganze auch mit IMAP statt pop versucht.

Danke schon mal!

VG - Joesch

shen
Ehrenmitglied
Beiträge: 753
Registriert: 14.07.2006, 19:24
Wohnort: Wegberg
Kontaktdaten:

Re: Eintreffende Mails abfragen und per Sprachausgabe ausgeben

Beitrag von shen » 17.03.2008, 18:21

Wie lautet denn die angemeckerte erste Zeile?
Gruß
Stefan Hendricks (ehemaliger HomeMatic-Forum Betreiber)

joesch
Beiträge: 789
Registriert: 03.02.2007, 14:57
Hat sich bedankt: 64 Mal
Danksagung erhalten: 2 Mal

Re: Eintreffende Mails abfragen und per Sprachausgabe ausgeben

Beitrag von joesch » 17.03.2008, 20:44

Ich stelle mal vorsichtshalber das ganze Makro ein:

Code: Alles auswählen

<?
$mbx = imap_open ("{imap.1und1.de:143}Posteingang", "mail@online.de", "abcdefg");

// es wird die gesamtzahl der vorliegenden nachrichten im pop3-postfach ermittelt und in die variable var.anzahlMail geschrieben
$VAR.anzahlMail = imap_num_msg($mbx);
// schließen der mailbox und der pop3-verbindung
imap_close($mbx);
?>

** auswerten eventueller fehler in ein logfile

wenn scriptoutput <> "" dann
LOGFile := "PHP: " + scriptoutput
aufrufen(LOGFile)
scriptoutput := ""
endewenn
VG - Joesch
System: RaspberryMatic auf Raspberry Pi 3 Model B Rev 1.2 (rpi3) mit RPI-RF-MOD (4.4.22)

rayki
Beiträge: 73
Registriert: 23.01.2008, 16:30

Re: Eintreffende Mails abfragen und per Sprachausgabe ausgeben

Beitrag von rayki » 19.03.2008, 15:05

Hallo joesch,

ich bermute mal (ohne getestet zu haben) folgende Zeile in deinem Skript:
$VAR.anzahlMail = imap_num_msg($mbx);

Homupter-Variablen muss iin PHP-Skripts ein '$V_' vorangestellt werden. Außerdem müssen Punkte ('.') in den Variablenbezeichnern durch Unterstrich ('_') ersetzt werden.

Schau mal in das Skript von squeeezer:
$V_Var_anzahlMail = imap_num_msg($mbx);
Aus seiner Homeputer-Variable 'VAR.anzahlMail' wird im PHP-Skript '$V_Var_anzahlMail'

joesch
Beiträge: 789
Registriert: 03.02.2007, 14:57
Hat sich bedankt: 64 Mal
Danksagung erhalten: 2 Mal

Re: Eintreffende Mails abfragen und per Sprachausgabe ausgeben

Beitrag von joesch » 20.03.2008, 19:20

Danke erst einmal für den Hinweis. Das mit der Voranstellung hatte ich tatsächlich übersehen.

Nun habe ich jedoch beim Starten des Projektes eine andere Fehlermeldung: "PHP Startup: Unable to load dynamic library 'c:\Program Files\contronics\homeputer studio\php_imap.dll' - Die angegebene Prozedur wurde nicht gefunden."

Allerdings liegt die php_imap.dll in dem angegebenen Verzeichnis ...

VG - Joesch
System: RaspberryMatic auf Raspberry Pi 3 Model B Rev 1.2 (rpi3) mit RPI-RF-MOD (4.4.22)

joesch
Beiträge: 789
Registriert: 03.02.2007, 14:57
Hat sich bedankt: 64 Mal
Danksagung erhalten: 2 Mal

Re: Eintreffende Mails abfragen und per Sprachausgabe ausgeben

Beitrag von joesch » 21.03.2008, 10:16

Eine kurze Ergänzung: Die Meldung kommt auch beim Start vorhergehender Projekte, in denen ich zwar PHP verwende, aber noch nicht die "Extension php_imap.dll " in der php.ini eingebunden hatte.

VG - Jörg
System: RaspberryMatic auf Raspberry Pi 3 Model B Rev 1.2 (rpi3) mit RPI-RF-MOD (4.4.22)

Benutzeravatar
squeeezer
Beiträge: 545
Registriert: 17.07.2006, 00:00
Wohnort: Idstein

Re: Eintreffende Mails abfragen und per Sprachausgabe ausgeben

Beitrag von squeeezer » 21.03.2008, 21:19

passt die php_imap.dll zur php-version, die du benutzt? beide müssen identisch sein.

viele grüße ...
... squeeezer

joesch
Beiträge: 789
Registriert: 03.02.2007, 14:57
Hat sich bedankt: 64 Mal
Danksagung erhalten: 2 Mal

Re: Eintreffende Mails abfragen und per Sprachausgabe ausgeben

Beitrag von joesch » 22.03.2008, 12:49

Treffer! Das war die Ursache. Danke für den Tipp!

VG - Joesch
System: RaspberryMatic auf Raspberry Pi 3 Model B Rev 1.2 (rpi3) mit RPI-RF-MOD (4.4.22)

joesch
Beiträge: 789
Registriert: 03.02.2007, 14:57
Hat sich bedankt: 64 Mal
Danksagung erhalten: 2 Mal

Re: Eintreffende Mails abfragen und per Sprachausgabe ausgeben

Beitrag von joesch » 22.03.2008, 14:33

Eine Frage noch:

Mit imap_delete kann ich z.B. durch Angabe der Parameter '($mbox, 1)' Nachricht 1 löschen bzw. zum Löschen markieren. Gibt es einen Trick, um alle vorhandenen Nachrichten zum Löschen markieren zu können?

Vielen Dank für eure Hilfe!

VG - Joesch
System: RaspberryMatic auf Raspberry Pi 3 Model B Rev 1.2 (rpi3) mit RPI-RF-MOD (4.4.22)

Antworten

Zurück zu „homeputer Studio / Standard: Programmierbeispiele“