IMap

Alice

Erfahrenes Mitglied
Hallo Zusammen.

Ist es eigentlich nicht möglich aus einer E-Mail nur den Absender, Betreff und den eigentlichen Text OHNE HTML und anderen Müll zu "konvertieren"?

Ich habe 1000 Codeschnipsel probiert, aber es will nicht funktionieren.
 
Ja richtig Sheel! :)

Ich habe wirklich alles mögliche ausprobiert. Wenn ich z.B. den Paramter "1.1" eintrage (nur Text ohne HTML), erfolgt keine Ausgabe (empty).

Ich möchte nur E-Mails auslesen (Absender, Betreff und Nachricht) und in die DB speichern. Eigentlich recht Simpel vom gedanken, aber seit gestern abend konnte ich - alleine - keine Fortschritte verbuchen.

PS: Ich arbeite an einem Ticket-System (E-Mail-Verkehr, der meinerseits über PHP verarbeitet werden soll) und möchte die ankommenden Nachrichten SO SAUBER es geht in die DB eintragen.

Über Code würde ich mich freuen. :D (alle Codeschnipsel ausprobiert)
 
Hier mal mein Ansatz.

Ich sehe zumindest so einigermaßen was ich sehen möchte. Aber das wahre ist es nicht. Es sind zuviele "Bugs" vorhanden.

- Manchmal keine E-Mail-Adresse
- Komische Zeichen obwohl (richtig?) umgewandet wie z.B. ü statt ü
- CSS-Style-Sheets (html,body{font-size:12px;background-color:....)
- usw.

PHP:
   // IMAP Zugangsdaten
   $IMAP_H = '{BlaBlaBla}';
   $IMAP_U = 'BlaBlaBla';
   $IMAP_P = 'BlaBlaBla';

   // IMAP Öffnen
   $IMAP_C = imap_open($IMAP_H, $IMAP_U, $IMAP_P);

   // Alle E-Mails auslesen
   $IMAP_E = imap_search($IMAP_C, 'ALL');

   if ($IMAP_E)
   {
       // E-Mails sortieren
       rsort($IMAP_E);

       foreach($IMAP_E as $IMAP_N)
       {
           // IMAP-Header auslesen
           $IMAP_Headers = imap_fetch_overview($IMAP_C, $IMAP_N, 0);

           // IMAP-Message auslesen
           $IMAP_Message = imap_fetchbody($IMAP_C, $IMAP_N, 1);

           // Betreff formatieren
           $IMAP_Subject = iconv_mime_decode($IMAP_Headers[0]->subject, 0, "ISO-8859-1");

           // E-Mail-Adresse auslesen (Filtern)
           $E_Mail_1 = explode('<', $IMAP_Headers[0]->from);
           $E_Mail_2 = explode('>', $E_Mail_1[1]);
           $IMAP_From = $E_Mail_2[0];

           // Datum/Zeit in Unix-Timestamp konvertieren
           $IMAP_Date = strtotime($IMAP_Headers[0]->date);

           // Prüfen ob Encoding ungleich UTF-8 ist
           if (mb_detect_encoding($IMAP_Message) != 'UTF-8')
           {
               $IMAP_Message = utf8_encode($IMAP_Message);
           }

           // IMAP-Message formatieren
           $IMAP_Message = quoted_printable_decode($IMAP_Message);

           // HTML aus IMAP-Message entfernen
           $IMAP_Message = strip_tags($IMAP_Message);

           // HTML-Ausgabe (Test)
           $Result .= $IMAP_Subject                .'<br />'."\n";
           $Result .= $IMAP_From                   .'<br />'."\n";
           $Result .= $IMAP_Date                   .'<br />'."\n";
           $Result .= $IMAP_Message                .'<br />'."\n";
           $Result .= '<br /><br /><br />'."\n";
       }
   }

   // IMAP schließen
   imap_close($IMAP_C);
 
Problem 1: Die explode-Sachen bei der Mailadressen.
Die Adresse muss nicht als "Name <adresse@domain.tld>" ankommen, einfach "adresse@domain.tld" kommt auch häufig vor. Und ab und zu auch andere Formate.

Problem 2: Zeichensätze
a) mb_detect_encoding kann falsche Ergebnisse liefern (weil Zeichensatzerkennung einfach nicht 100%ig geht)
b) utf8_encode heißt zwar so, kann aber nicht alle beliebigen Inputs zu UTF8 konvertieren. Der Parameter müsste in ISO88591 sein. Wenn nicht macht der Funktionsaufruf alles nur schlimmer.
c) Warum den verwendeten Zeichensatz nicht aus dem Mail nehmen? (wo er oft (aber auch nicht immer) vorhanden ist. Sollte es einmal keinen geben, Pech, einfach so anzeigen. Sollte nicht so häufig sein.)

Problem 3: Contenttyp
Mit imap_fetchstructure, imap_bodystruct und imap_fetchbody untersuchen was es gibt; und je nach Vorhandensein zB. 1.1 nehmen, 2.1 nehmen, oder aus 1.2/2.2 die Tags strippen
 
Kannst Du mir bitte mit dem Code helfen? :)

Problem 1 könnte man ja lösen, indem man vorher prüft, ob die E-Mail "valide" ist. Wenn nicht, kann man nach der E-Mail "suchen".

Problem 2... Tja... Ich verstehe das Problem, aber ich hab kein Schimmer vom "Handling" damit.

Problem 3... Ich kapier das mit den 1, 2, 1.2, 2.1 usw. sowieso nicht.

Kann man nicht einfach einen blöden REINEN TEXT empfangen?
 
Es gibt nicht zufällig einen "Dienst" oder eine PHP-Klasse der eine E-Mail "säubert"? :D

Hier 2 Beispiele:

Guten Tag, Für die Löschung benötigen wir den Link zu dem betroffenen Dokument um sicher zu stellen dass wir das richtige Dokument löschen. Mit freundlichen Grüssen

html,body{font-size:12px;background-color:#fff;color:#333;font-family:sans-serif,Arial,Verdana,Trebuchet MS;line-height:1.4;}Wie geht es dir?

Was sagst Du zu diesem Code? (Problem 1)

PHP:
           if (!filter_var($IMAP_Headers[0]->from, FILTER_VALIDATE_EMAIL) === false)
           {
               $IMAP_From = $IMAP_Headers[0]->from;
           }
               else
           {
               // E-Mail-Adresse auslesen (Filtern)
               $E_Mail_1  = explode('<', $IMAP_Headers[0]->from);
               $E_Mail_2  = explode('>', $E_Mail_1[1]);
               $IMAP_From = $E_Mail_2[0];

               if (filter_var($IMAP_From, FILTER_VALIDATE_EMAIL) === false)
               {
                   $IMAP_From = 'Kann nicht ausgelesen werden';
               }
           }
 
Die E-mail prüfung habe ich etwas verbessert.

Gut?

PHP:
                // E-Mail-Adresse prüfen (1. Versuch)
                if (!filter_var($IMAP_Headers[0]->from, FILTER_VALIDATE_EMAIL) === false)
                {
                    $IMAP_From = $IMAP_Headers[0]->from;
                }
                    else
                {
                    // E-Mail-Adresse Filtern (2. Versuch)
                    $E_Mail_1  = explode('<', $IMAP_Headers[0]->from);
                    $E_Mail_2  = explode('>', $E_Mail_1[1]);
                    $E_Mail_3 = $E_Mail_2[0];

                    if (!filter_var($E_Mail_3, FILTER_VALIDATE_EMAIL) === false)
                    {
                        $IMAP_From = $E_Mail_3;
                    }
                        else
                    {
                        // E-Mail-Adresse Filtern (3. Versuch)
                        $E_Mail_4 = preg_replace('/^(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){255,})(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){65,}@)(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22))(?:\.(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-[a-z0-9]+)*\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-[a-z0-9]+)*)|(?:\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\]))$/iD
', '$1', $IMAP_Headers[0]->from);

                        if (!filter_var($E_Mail_4, FILTER_VALIDATE_EMAIL) === false)
                        {
                            $IMAP_From = $E_Mail_4;
                        }
                            else
                        {
                            $IMAP_From = $IMAP_Headers[0]->from;
                        }
                    }
                }
 
So...

Ich habe das Skript verbessert. Was sagt ihr? Bitte sagt was! :D

PHP:
   if ($_GET['action'] == 'emails')
   {
       // Header setzen
       header('Content-Type: text/html; charset=ISO-8859-1');
       mb_internal_encoding('ISO-8859-1');

       // IMAP Zugangsdaten
       $IMAP_H = '{BlaBlaBla}';
       $IMAP_U = 'BlaBlaBla';
       $IMAP_P = 'BlaBlaBla';

       // IMAP Verbindung Öffnen
       $IMAP_C = imap_open($IMAP_H,$IMAP_U,$IMAP_P);

       // Alle E-Mails auslesen und sortieren
       $IMAP_E = imap_sort($IMAP_C, SORTDATE, 0, NULL, 'All');

       if ($IMAP_E)
       {
           // E-Mail für E-Mail durchlaufen
           foreach($IMAP_E as $IMAP_N)
           {
               // IMAP-Header auslesen
               $IMAP_Headers = imap_fetch_overview($IMAP_C, $IMAP_N, 0);

               // IMAP-Message auslesen
               $IMAP_Message = imap_fetchbody($IMAP_C, $IMAP_N, 1);

               // Betreff formatieren
               $IMAP_Subject = iconv_mime_decode($IMAP_Headers[0]->subject, 0, "ISO-8859-1");

               // E-Mail-Adresse prüfen (1. Versuch)
               if (!filter_var($IMAP_Headers[0]->from, FILTER_VALIDATE_EMAIL) === false)
               {
                   $IMAP_From = $IMAP_Headers[0]->from;
               }
                   else
               {
                   // E-Mail-Adresse Filtern (2. Versuch)
                   $E_Mail_1  = explode('<', $IMAP_Headers[0]->from);
                   $E_Mail_2  = explode('>', $E_Mail_1[1]);
                   $E_Mail_3  = $E_Mail_2[0];

                   if (!filter_var($E_Mail_3, FILTER_VALIDATE_EMAIL) === false)
                   {
                       $IMAP_From = $E_Mail_3;
                   }
                       else
                   {
                       // E-Mail-Adresse Filtern (3. Versuch)
                       $E_Mail_4 = preg_replace('/^(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){255,})(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){65,}@)(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22))(?:\.(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-[a-z0-9]+)*\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-[a-z0-9]+)*)|(?:\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\]))$/iD
', '$1', $IMAP_Headers[0]->from);

                       if (!filter_var($E_Mail_4, FILTER_VALIDATE_EMAIL) === false)
                       {
                           $IMAP_From = $E_Mail_4;
                       }
                           else
                       {
                           $IMAP_From = $IMAP_Headers[0]->from;
                       }
                   }
               }

               // Datum/Zeit in Unix-Timestamp konvertieren
               $IMAP_Date = strtotime($IMAP_Headers[0]->date);

               // Unix-Timestamp zurück konvertieren
               $IMAP_D = date("d.m.Y", $IMAP_Date);
               $IMAP_T = date("H:i", $IMAP_Date);
               $IMAP_Date = $IMAP_D.' '.$IMAP_T;

               // Nachricht in 8-Bit-String konvertieren
               $IMAP_Message = quoted_printable_decode($IMAP_Message);

               // HTML aus IMAP-Message entfernen
               $IMAP_Message = strip_tags($IMAP_Message, '<br><br/><br />');

               // Nachricht formatieren 1
               $IMAP_Message = str_replace("\r", '',  $IMAP_Message);
               $IMAP_Message = str_replace("\n", '<br />', $IMAP_Message);
               $IMAP_Message = str_replace("\t", '', $IMAP_Message);

               // Von UTF-8 nach ISO-8859-1 konvertieren
               if (mb_detect_encoding($IMAP_Message,'ASCII, UTF-8, ISO-8859-1',true) === 'UTF-8')
               {
                   $IMAP_Message = iconv("UTF-8", "ISO-8859-1", $IMAP_Message);
               }

               // Ticketnummer in Betreff suchen
               $IF_Ticket1 = explode('[TN:', $IMAP_Subject);
               $IF_Ticket2 = explode(']', $IF_Ticket1[1]);

               // Prüfen ob Ticketnummer vorhanden
               if (!$IF_Ticket2[0])
               {
                   // In der Nachricht nach Tickernummer suchen
                   $IF_Ticket3 = explode('[TN:', $IMAP_Message);
                   $IF_Ticket4 = explode(']', $IF_Ticket3[1]);
                   $IF_TicketF = $IF_Ticket4[0];
               }
                   else
               {
                   $IF_TicketF = $IF_Ticket2[0];
               }

               // Prüfen ob Ticketnummer eine 10 Stellige Zahl ist
               if (!is_numeric($IF_TicketF) AND strlen($IF_TicketF) != 10)
               {
                   $IF_TicketF = 'Neues Ticket';
               }
                   else
               {
                   // Gefundenes Ticket aus der Datenbank auslesen
                   $DB_Ticket = $vbulletin->db->query_read("BlaBlaBla");

                   // Prüfen ob das Ticket vorhanden ist
                   if (mysql_num_rows($DB_Ticket) == 0)
                   {
                       $IF_TicketF = 'Neues Ticket';
                   }
               }

               // Neue Ticketnummer erstellen
               if ($IF_TicketF == 'Neues Ticket')
               {
                   // Höchste Ticketnummer auslesen
                   $Ticket_Nr = $vbulletin->db->query_read("BlaBlaBla");

                   // Als Variable speichern
                   $Ticket_Nr = $vbulletin->db->fetch_array($Ticket_Nr);

                   // Ticketnummer um eins erhöhen
                   $New_Ticket = $Ticket_Nr['Max_Number'] + 1;
               }

               // Variable für Ticketnummer setzen
               if ($IF_TicketF == 'Neues Ticket')
               {
                   $IMAP_Ticket = $New_Ticket;
               }
                   else
               {
                   $IMAP_Ticket = $IF_TicketF;
               }

               // E-Mails in die Datenbank eintragen
               if ($IF_TicketF == 'Neues Ticket')
               {
                   // Neue Tickets
                   $vbulletin->db->query_write("BlaBlaBla)");
               }
                   else
               {
                   // Höchste Post-Nummer auslesen
                   $Post_Nr = $vbulletin->db->query_read("BlaBlaBla");

                   // Als Variable speichern
                   $Post_Nr = $vbulletin->db->fetch_array($Post_Nr);

                   if (!is_numeric($Post_Nr['Max_Number']) OR $Post_Nr['Max_Number'] == '')
                   {
                       $Post_Nr = '1';
                   }
                       else
                   {
                       $Post_Nr = $Post_Nr['Max_Number'] + 1;
                   }

                   // Antworten auf Tickets
                   $vbulletin->db->query_write("BlaBlaBla");

                   // Ticket als ungelesen markieren
                   $vbulletin->db->query_write("BlaBlaBla");
               }

               // HTML-Ausgabe (zum Testen)
               // $Result .= $IMAP_Subject                  .'<br />'."\n";
               // $Result .= $IMAP_From                      .'<br />'."\n";
               // $Result .= $IMAP_Date                       .'<br />'."\n";
               // $Result .= $IMAP_Message                .'<br />'."\n";
               // $Result .= $IMAP_Ticket                     .'<br />'."\n";
               // $Result .= '                                               <br />'."\n";

               // E-Mails in den Ordner "Bearbeitet" verschieben
               $imapresult = imap_mail_move($IMAP_C, $IMAP_N, 'Bearbeitet');
        }
    }

        // IMAP Verbindung schließen
        imap_close($IMAP_C, CL_EXPUNGE);

        // Zur Support Startseite weiterleiten
        header("Location: http://www.blablabla.de/ticket.php");
        exit;
   }

Bisher funktioniert es prima.

Aber vielleicht habt ihr Verbesserungsvorschläge oder sieht etwas was ich nicht sehe oder weiss?
 
Zuletzt bearbeitet:
Zurück