e-Mails vom Server abrufen (POP3) und vorlesen per TTS

GMail-Version weiter unten im Thread

Liebe Leidensgenossen,

ein solches Script war vor einiger Zeit mal hier im Forum erfragt worden - ich habe mir eines zusammengebastelt und möchte es euch nicht vorenthalten.

Zur Nutzug wird das IMAP-Modul (DLL) für PHP benötigt, eine Anleitung zur Installation gibt es im Forum.

Änderung: Fehler in alter Zeile 83 ($nachricht_tell mit Inhalt versehen) behoben; Fix von H-MAN für bestimmte Mailserver hinzugefügt; $prefix mit Startwert versehen


<?
/*
******************************************************
e-Mails vom Server abrufen (POP3) und vorlesen per TTS
******************************************************
File     : emailtts.ips.php
Trigger  : none
*/



// Funktionen zum Auslesen eines bestimmten MIME-Types

function get_mime_type(&$structure)
{
    $primary_mime_type = array("TEXT", "MULTIPART", "MESSAGE", "APPLICATION", "AUDIO", "IMAGE", "VIDEO", "OTHER");
    if ($structure->subtype) {
        return $primary_mime_type[(int) $structure->type] . '/' . $structure->subtype;
    }
    return "TEXT/PLAIN";
}

function get_part($stream, $msg_number, $mime_type, $structure = false, $part_number = false)
{
$prefix = "";
    if (!$structure) {
        $structure = imap_fetchstructure($stream, $msg_number);
    }
    if ($structure) {
        if ($mime_type == get_mime_type($structure)) {
            if (!$part_number) {
                $part_number = "1";
            }
            $text = imap_fetchbody($stream, $msg_number, $part_number);
            if ($structure->encoding == 3) {
                return imap_base64($text);
            } else if ($structure->encoding == 4) {
                return imap_qprint($text);
            } else {
                return $text;
            }
        }
        if($structure->type == 1) /* multipart */
        {
            while (list($index, $sub_structure) = each($structure->parts)) {
                if ($part_number) {
                    $prefix = $part_number . '.';
                }
                $data = get_part($stream, $msg_number, $mime_type, $sub_structure, $prefix . ($index + 1));
                if ($data) {
                    return $data;
                }
            }
        }
    }
    return false;
}




// hier Script mit den Benutzerdaten des POP3-Servers konfigurieren
$hostname = "pop3.web.de";
$username = "sagichnicht";
$kennwort = "findsraus";

$mailbox = imap_open("{".$hostname."}", $username, $kennwort);
// $mailbox = imap_open ("{".$hostname.":110/pop3}INBOX", $username, $kennwort); // für GMX und andere bekannte Freemailer


$mails = imap_fetch_overview($mailbox,"1:*", FT_UID); // Holt eine Übersicht aller Emails
$nachricht_tell = "";

$size=count($mails); // Anzahl der Nachrichten
$cmsg = 0;           // Zur Ausgabe einer fortlaufenden Nummer

for ($i=$size-1; $i>=0; $i--) { // für alle vorhandenen Mails durchlaufen

    $cmsg++;
    $value = $mails[$i];
    
    $mail = get_part($mailbox, $value->msgno, "TEXT/PLAIN"); // aus der Nachricht den Plaintext holen

    // Vorlesetext zusammenbasteln....
    $nachricht_tell .= "Nachricht Nummer ".$cmsg." von ".$value->from.". Betreff: ".$value->subject.".";
    $nachricht_tell .= "Inhalt: ".$mail.".";
    
}

imap_close($mailbox); // Verbindung zum POP3-Server beenden

TTS_Speak(47164,  $nachricht_tell); // Vorlesen per TTS - Instance ID anpassen!!!


?>

schön wärs, wenn man endlich mal ein Skript hätte, mit dem man auch SSL secure Server POP3 emails abfragen könnte, z.B. GMAIL. Aber bisher habe ich hier noch nichts brauchbares/funktionierendes gefunden.

mfG Franz

Ich find’s gut, wenn funktioniert. Werde es heute abend wenn Zeit ist gleich mal testen.

Grüße,
Doc

@guyabano

Tut mir leid, dass Du Google Mail nicht mit dem Script verwenden kannst. Ursächlich ist ein Fehler in PHP’s IMAP Extension.
http://bugs.php.net/bug.php?id=36496&edit=1

Der Fehler ist ganz frisch behoben worden. Inwiefern sich aber die Snapshots von PHP mit IPS nutzen lassen, entzieht sich meiner Kenntnis.
Vielleicht kann sich dazu einer melden, der IPS denkt und lebt? :wink:

Marcus

@GreenT (Marcus)

Ich bekomme folgende Fehlermeldungen:

<br />
<b>Warning</b>: imap_open() [<a href=‚function.imap-open‘>function.imap-open</a>]: Couldn’t open stream {pop.gmx.net} in <b>C:\Programme\IP-SYMCON\scripts.currentscript</b> on line <b>66</b><br />
<br />
<b>Warning</b>: imap_fetch_overview(): supplied argument is not a valid imap resource in <b>C:\Programme\IP-SYMCON\scripts.currentscript</b> on line <b>69</b><br />
<br />
<b>Notice</b>: Trying to get property of non-object in <b>C:\Programme\IP-SYMCON\scripts.currentscript</b> on line <b>80</b><br />
<br />
<b>Warning</b>: imap_fetchstructure(): supplied argument is not a valid imap resource in <b>C:\Programme\IP-SYMCON\scripts.currentscript</b> on line <b>26</b><br />
<br />
<b>Notice</b>: Trying to get property of non-object in <b>C:\Programme\IP-SYMCON\scripts.currentscript</b> on line <b>83</b><br />
<br />
<b>Notice</b>: Trying to get property of non-object in <b>C:\Programme\IP-SYMCON\scripts.currentscript</b> on line <b>83</b><br />
<br />
<b>Warning</b>: imap_close(): supplied argument is not a valid imap resource in <b>C:\Programme\IP-SYMCON\scripts.currentscript</b> on line <b>88</b><br />
<br />
<b>Notice</b>: Unknown: [CLOSED] IMAP connection broken (server response) (errflg=2) in <b>Unknown</b> on line <b>0</b><br />

Kannst Du mir einen Tip geben woran es liegen könnte oder was ich falsch mache ?

Versuch es mal mit der Zeile, anstelle des Originals:

$mailbox = imap_open ("{".$hostname.":110/pop3}INBOX", $username, $kennwort);

Ah ja? Die Bugs sind behoben? Hmm, auch in der von IPS benutzen version? Das wäre ja zu schön ! Ich habe das Skript noch immer, ich werde es mal testen, sobald ich mich 5 Minuten vor dem PC langweile

mfG Franz

Klappt nicht. Das aktuelle PHP Branch ist 5.2.x. IPS läuft z.Z. nur mit 5.1.x.

paresy

Danke H-MAN,

hat geklappt. Jetzt bekomme ich nur noch diese Fehlermeldung:

<br />
<b>Notice</b>: Undefined variable: prefix in <b>C:\Programme\IP-SYMCON\scripts.currentscript</b> on line <b>48</b><br />
<br />
<b>Notice</b>: Undefined variable: prefix in <b>C:\Programme\IP-SYMCON\scripts.currentscript</b> on line <b>48</b><br />

Die Maschine hat mir auch eine Nachricht vorgelesen :slight_smile: mehr waren im Augenblick nicht vorhanden. Allerdings wurde mir nicht die Nachrichtnummer und der Betreff genannt.

Also falls Du nochmal helfen möchtest :smiley:

@Horst

Folgende Zeile

$prefix = "";

einfügen nach Zeile 24:

function get_part($stream, $msg_number, $mime_type, $structure = false, $part_number = false)
{

Dann sollte die Warnung nicht mehr ausgegeben werden.

@guyabano

Ich bastele Dir ein Workaround.

Richte Dich am Besten schon einmal auf die Installation von php_curl.dll (ins IPS-Verzeichnis) sowie libeay32.dll und ssleay32.dll (aus OpenSSL, ins \Windows\system32-Verzeichnis) ein.
Wenn man es mir gestattet, würde ich die entsprechenden Packages auch hier uploaden.

GMail-Version (Google Mail)

Beschreibung: Das Script ruft von Google Mail (GMail) die Mailübersicht ab und gibt die abgerufenen Informationen per TTS (Text to Speech) aus.

Einschränkung: Das Script verzichtet darauf, den vollständigen Inhalt einer Mail abzurufen. Stattdessen liest es nur die „Preview“ vor, die auch GMail auf der Übersicht anzeigen würde. Diese Einschränkung habe ich vorgenommen, damit die Performance nicht unnötig leidet. Wenn gewünscht, würde ich noch eine Alternative zum vollständigen Abruf des Mailtextes veröffentlichen.

1. Installation:

Lustiges Dateisammeln. Zunächst benötigen wir:

php_curl.dll - die Curl-Extension für PHP (Tipp: liegt z. B. bei der Contronics-Studio-Version dabei, falls die noch jemand rumzuliegen hat)

libeay32.dll und ssleay32.dll - diese Dateien gehören zu OpenSSL, bitte mal von hier die Datei openssl-0.9.8a.win32.zip downloaden und die beiden Bibliotheken entpacken.
Sie gehören nach \Windows\system32 (abhängig von Windows-Version).

libgmailer - nette Menschen haben diese Bibliothek gebastelt und unter freier Lizenz der Webgemeinde zur Verfügung gestellt. Download hier.
Diese ausgepackte Datei libgmailer.php gehört in das IP-SYMCON/scripts/ - Verzeichnis.

schwitz

So… nun noch ein wenig an der PHP.INI aus dem IP-SYMCON-Hauptverzeichnis herumfuschen.

extension_dir = „C:\Programme\IP-SYMCON“
extension = „php_curl.dll“

^^ Diese Einträge müssten hinzugefügt werden, i. d. R. wird die zweite Zeile genügen, falls ihr schon eine Extension eingebunden habt.

2. Hoffen und warten:

Nun ist es an der Zeit, IP-SYMCON neu zu starten. Sollten beim Start keine Fehlermeldungen (insbesondere auf OpenSSL-DLLs bezogen) zu sehen sein, habt ihr verdammtes Glück gehabt. Die Curl-Bibliothek und OpenSSL sollten nun funktionieren - damit ist der Weg frei zur Nutzung von GMail über HTTP.

Sollte letzter Schritt Fehlermeldungen hervorbringen, so gibt es wahrscheinlich mit Curl oder OpenSSL Probleme.
Wenn ihr nun den Schrei eurer Frau aus der Küche wahrnehmt: „DAS VERDAMMTE LICHT IN DER KÜCHE GEHT NICHT MEHR!!! WAS HAST DU SCHON WIEDER GEMACHT?!?!?!“ solltet ihr euch beeilen, den Schritt 1 noch einmal durchzugehen, bei weiterem Ausbleiben eines Erfolges eure Fehlermeldung hier posten.
Ansonsten geht es zu Schritt…

3. Script erstellen und Folgendes einfügen:


<?php
// Abwandlung "Mails abrufen und vorlesen lassen" für IP-SYMCON
// von GreenT, mit OpenSSL/Curl und libgmailer
// Support: http://www.ipsymcon.de/forum/showthread.php?t=2979
// v.2007-03-08/10:09


/////// Benutzeroptionen /////////////////
$name = "";                     // Benutzername
$pwd = "";                     // Kennwort
$tz = "0";                              // Zeitzone (Unterschied zur GMT)

/////// Sprachausgabe ///////////////////
$instance_id = 47164;                     // Instance ID der TTS-Instanz
$tell_mailcount = true;                // Anzahl neuer Nachrichten ansagen
$tell_quota     = true;                // Speichergröße ansagen
$tell_content   = true;                // Inhalt der Mails vorlesen


/////// Variablen ///////////////////////
$unread_set   = false;                 // Anzahl der ungelesenen Nachrichten
$imread_var   = "Mails.Unread";        // ...und in welche IPS-Variable?
$quota_set    = false;                 // zur Verfügung stehender Speicher
$quota_var    = "Mails.Quota";         // ...und in welche IPS-Variable?

function html2txt($document){  // Funktion zum Entfernen von HTML
$search = array('@<script[^>]*?>.*?</script>@si',  // javascript
               '@<[\/\!]*?[^<>]*?>@si',            // HTML tags
               '@<style[^>]*?>.*?</style>@siU',    // style tags
               '@<![\s\S]*?--[ 	
\r]*>@'        //  multi-line comments
);
$text = preg_replace($search, '', $document);
return $text;
}

require("libgmailer.php"); // Bibliothek muss in scripts/ liegen

   $gm = new GMailer();
   $gm->setLoginInfo($name, $pwd, $tz);


   if ($gm->connect()) {  // Verbinden
      $gm->fetchBox(GM_QUERY, "is:unread", 0); // nur ungelesene Mails
      $snapshot = $gm->getSnapshot(GM_STANDARD);
      if ($snapshot) {

        $mails_gesamt = $snapshot->box_total; // Anzahl der ungelesenen Nachrichten
        $quota        = $snapshot->quota_tot; // Restspeicher
        

         $m = 0;
         foreach ($snapshot->box as $i) {
         
            $no      = $m+1;

            $sender  = $snapshot->box[$m]['sender']."
";
            $sender  = html2txt($sender);
            $sender  = utf8_decode($sender);
            
            $date    = $snapshot->box[$m]['long_date']."
";
            $date    = html2txt($date);
            $date    = utf8_decode($date);

            $subject = $snapshot->box[$m]['subj']."
";
            $subject = html2txt($subject);
            $subject = utf8_decode($subject);

            $content = $snapshot->box[$m]['snippet']."
";
            $content = html2txt($content);
            $content = utf8_decode($content);
            
            $tell_content_tmp = "Nachricht Nummer ".$no." von ".$sender.". Betreff: ".$subject." vom ".$date.".";
            $tell_content_tmp .= "Inhalt: ".$content.".";

          $m++;
        }

        $say = "";
        
        if ($tell_mailcount == true){
            $say  .= " Sie haben ".$mails_gesamt." neue Nachrichten.";
        }
        
        if ($tell_quota     == true){
            $say .= " Ihnen stehen noch ".$quota." Megabytes Speicher zur Verfügung.";
        }

        if ($tell_content == true){
            $say .= " Nachrichten folgen. ";
            $say .= $tell_content_tmp;
        }
        
        if ($unread_set == true){
          SetValueInteger($unread_var, intval($mails_gesamt));
        }

        if ($quota_set == true){
          SetValueInteger($quota_var, intval($quota));
        }

        TTS_Speak ($instance_id,  $say);

      }
       $gm->disconnect();
   }



?>

Danke GreenT,

hat geklappt.

Fertig!

:slight_smile:

Wenn großer Bedarf besteht, könnte ich auch in Sachen Mailversand etwas posten zwecks e-Mail-Benachrichtigung etc.

Hallo,

bin an dem Script auch sehr interessiert und habe es mal ausprobiert.
Bekomme aber folgende Fehlermeldung.

<b>Parse error</b>: parse error, unexpected ‚.‘ in <b>C:\Programme\IP-SYMCON\scripts.currentscript</b> on line <b>83</b><br />

was ist da falsch ?

cu uwe

@Uwe

Der Fehler ist ein Tippfehler in besagter Zeile und sollte im aktualisierten ersten Post dieses Threads behoben sein.

Statt


=.

muss es heißen


.=

:slight_smile:

Da bleibt mir doch glatt die Kinnlade offen stehen !

Das Skript ist fabelhaft, nur habe ich es ein wenig modifiziert. Ich habe das TTS Speak rausgeschmissen, brauch ich nicht.
Ich will nur, dass alle Meldungen mir nachher in einem String zu verfügung stehen so dass ich das einfach im Designer in einem Memo-Feld ausgeben kann!

Kann ich dieses Skript nun auch jetzt irgendwie mit normalen POP3 Email accounts benutzen? Was muss da geändert werden?

Sorry, aber auf dem gebiet bin ich nun wirklich ein N00b !

mfG Franz

Danke für die schnelle Hilfe. Klappt jetzt super.

cu uwe

Leider nein. Es ist eine „Spezialanfertigung“ für Dich, weil Du insbesondere nach GMail gefragt hattest und funktioniert auch nur mit GMail.
„Normale“ POP3-Accounts via SSL werden seitens der von IPS verwendeten Version von PHP im Moment nicht unterstützt. Sobald aber IPS auf die aktuelle PHP-Branch „umsteigt“, werde ich die erste Version des Skripts entsprechend modifizieren.
Die GMail-Version funktioniert übrigens auch hinter Firewalls und mit Proxy-Servern :slight_smile:

Ach, ist schon ok ! Das ist ein super Skript. Für mein normales POP3 Account kann ich ja weiterhin mein altes Script weiter benutzen.

Auf jeden Fall danke ! 12 Posts nur, doch von mir hast du jetzt schon ein grosses Lob !

mfG Franz