Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] imap_body richtig decoden /MIMETypen/Mail_mimeDecode

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] imap_body richtig decoden /MIMETypen/Mail_mimeDecode

    Hi Leute

    Ich lese minütlich eine mailbox via IMAP aus und speichere die neuen emails in meiner mysqlDB. Das klappt auch ganz gut, den header mit den Informationen des Absenders, des Empfängers, die CC, BCC, das Subject und so weiter kann ich korrekt ermitteln.
    Auch das decoden funktioniert mit dem Subject und dem Absendernamen korrekt, mittels

    Code:
    $subject = imap_utf8($subject);
    $subject = utf8_decode($subject);

    Wo ich jetzt aber noch komplett stecken bleibe ist beim Auslesen des Mail bodies mit dem Textinhalt.
    Im Netz habe ich wenige Informationen gefunden, und nichts hat wirklich geklapt.

    Den Body hole ich mit
    Code:
    $mailtext = imap_body($mailbox, $index);
    Nun gibt es mir mails aus, die so aussehen:

    This message is in MIME format. Since your mail reader does not understand this format, some or all of this message may not be legible. ------_=_NextPart_001_01C54F11.577D1260 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
    So sehen die Mails aus die als MIME-type "multipart" haben.

    Andere Mails (MIME-type 0, also einfach text), sehen wiederum so aus:

    Messieurs, J'ai bien remport=E9 cette ench=E8re en plus j'i pay=E9 la facture le 22.= 04.2005,=20 mais =E0 ce jour, je n'ai toujours rien re=E7u,
    usw... einfach mit falschem encoding.


    Ich blicke hier einfach nicht durch und hoffe, dass mir jemand einen Denkanstoss geben könnte. Was hat es mit den verschiedenen Encodings auf sich (base65, 7 oder 8 bit, quoted printable, binary --->http://ch2.php.net/manual/de/functio...hstructure.php)
    ud wie muss ich mit denen umgehen?

    Ich stelle mir etwas ähnliches wie:
    Code:
    if ( $tcode == 0 ) { 
        //decodier 7bit string
    }	
    if ( $tcode == 3 ) { 
        //decodier base64
    }
    ..... usw

    Danke im Voraus und Gruss,
    dsxs

  • #2
    1. "imap_fetchstructure: Diese Funktion liefert die gesamten Strukturinformationen zu einer gegebenen Nachricht. Das zurückgegebene Objekt enthält den Umschlag, die internen Daten, Größe und Flags der Nachricht sowie ein (rekursives) Array von ähnlichen Objekten für jeden enthaltenen MIME-Teil der Nachricht."

    2. was Du suchst: "Tabelle 3. Transfer encodings"

    Und wenn Du bequem mit Objekten umgehen möchtest, dann setzt Du auf PHP5.

    Kommentar


    • #3
      Musste das eben mal verdauen.

      Also mit imap_fetchstructure arbeite ich bereits, ich kann also den Bodytype (plain oder multipart) richtig determinieren, und die entsprechende Codierung (7bit, 8bit, base64 usw) rausfinden.

      Was ich aber nicht weiss ist, wie ich nun den Body decodieren muss, damit er schön formatiert ist und den ganzen Müll nicht mehr enthält.

      Kommentar


      • #4
        Dann noch mal:
        1. Tablle 3
        Code:
        0 7BIT  <- nix
        1 8BIT  <- nix
        2 BINARY <- sowas will man nicht
        3 BASE64 <- imap_base64
        4 QUOTED-PRINTABLE <- imap_qprint
        5 OTHER <- who the f.uck is 'other'?
        2. Du mußt Dich durch das Objekt von imap_fetchstructure bewegen.
        die 1. Entscheidung, die Du treffen mußt:
        Code:
        0 text 
        1 multipart
        Isses nur Text, brauchst Du nur noch $struktur->encoding auszuwerten, wie Du imap_body dekodieren mußt. Hier ein Beispiel (Auszug!) für QP:
        PHP-Code:
        <?php
            
        case 4:
                echo 
        nl2br(imap_qprint(imap_body($mbox$msgno))); break;
        ?>
        Bekommst Du aber eine multipart-mime Message (also HTML Schrott), haste wesentlich mehr Streß, weil Du durch die "Parts walken" mußt.

        Dir das zu erklären, bin ich aber zu faul. Zumal Du das ja auch mit etwas Zeit und Hirnschmalz selber rauskriegst.

        Kommentar


        • #5
          Hier mal ein par Fetzen aus meinem Mailprogramm:

          PHP-Code:
          <?php
               $struktur 
          imap_fetchstructure ($Mailbox,$i);
              echo 
          "Struktur: $struktur
          "
          ;
               
          $kodierung $struktur->encoding;
              echo 
          "Kodierung: $kodierung
          "
          ;
              
              
              
          $body=imap_body($Mailbox,$i);

           if (
          $kodierung == 4)
           {
            
          $body htmlentities(quoted_printable_decode($body), ENT_QUOTES);
           }
           elseif (
          $kodierung == 3)
           {
            
          $body htmlentities(base64_decode($body), ENT_QUOTES);
           }
           else
           {
            
          $body htmlentities($bodyENT_QUOTES);
           }
          ?>

          Kommentar


          • #6
            Vielen Dank für die Antworten an euch beide.
            Ich fange so langsam an die Sache zu verstehen.

            Die Mails mit Type 0 decode ich nun richtig mit quoted_printable_decode() bzw. base64_decode(). Das klapt wunderbar. Ich lasse htmlentities weg, weil ich in der DB wirklich _ausschliesslich_ den Mail-Text haben möchte, um ihn später easy zu verarbeiten.

            Nun bin ich mit den Mails mit Type 1 (multipart) beschäftigt. Echt ne harte nuss, hast Recht meikel.
            Hab' mir jetzt mal die PEAR base und die Mail_mimeDecode extension geholt, und habe versucht, $mailtext (die variable mit dem mailinhalt, welchen ich davor per imap_body($mailbox, $index); geholt habe) dem mail_mimedecode() zu übergeben.

            PHP-Code:
            <?php
            if ($ttype == 1) {
                    
            $params['include_bodies'] = true;
                    
            $params['decode_bodies']  = true;
                    
            $params['decode_headers'] = true;
                    
                    
            $decoder = new Mail_mimeDecode($mailtext);
                    
            $structure $decoder->decode($params);
                    echo 
            $structure->body;
            }
            ?>
            Der Output sieht danach aber immer noch exakt so aus, wie der "rohe mail text" in der Variable $mailtext.

            Hat schon jemand mit dieser PEAR Extension gearbeitet?

            Kommentar


            • #7
              string imap_fetchbody ( int imap_stream, int msg_number, string part_number [, flags flags])

              Hinweis:
              part_number aus imap_fetchstructure +1 = part_number
              Dies rauszukriegen, hat echt genervt.

              Kommentar


              • #8
                Hallo meikel

                das löst aber nicht das mime multipart problem, oder?

                Kommentar


                • #9
                  Zitat von NewBert
                  das löst aber nicht das mime multipart problem, oder?
                  Ich löse es damit. Du mußt die Parts der Reihe nach ermitteln und mit imap_fetchbody(..... Partnummer+1) zum Konvertieren rauslutschen.

                  Wenn Du Dir das alles mal genau anguckst -
                  print_r($imap_object) geht mit PHP5 ganz locker -
                  dann kommst Du von selber drauf, wies gemacht wird.

                  Kommentar


                  • #10
                    Hallo Meikel

                    würdest du mir deine Source zur Verfügung stellen damit ich mir das an einem funktionierenden Beispiel näher betrachten kann? Würde mir sehr helfen!! Auch gegen Bezahlung wenn du drauf bestehst. Komme sonst nicht vorwärts. Klar könnte ich mir noch wochenlang Texte durchlesen aber muss ein Projekt fertig stellen.

                    Gruss
                    NewBert

                    Kommentar


                    • #11
                      Vielen Dank meikel, hat mir sehr geholfen.
                      Ich habe mein Script jetzt fertig gebastelt und kann die Mailbodies korrekt extrahieren und der SQL Datenbank übergeben. Alle Bodies sind richtig decodiert, ausser die HTML Mails. Gibt es eine Möglichkeit, den gesamten HTML code rauszuschneiden?

                      Ich durchlaufe zusätzlich auch die einzelnen Parts nach Attachments und kenne so die Anzahl, die Dateinamen und den "inhalt" der Files. Letzterer sieht aber hässlich aus, ich nehme an, dass der noch codiert werden muss, wenn ich das File auf der Platte abspeichern möchte?! Soll ich besser gleich ganz die Finger davon lassen, oder ist es gar nicht mal so schwierig? (ich denk' da an Dateiendung extrahieren, und entsprechend die Datei "zusammenbasteln" . Oder? )

                      Ansonsten schonmal vielen Dank, das was wirklich wichtig für mich ist klappt nun perfekt.


                      @NewBert. Wenn du mir Deine email gibst schick' ich dir gerne meinen Code. Auslesen, korrekt decodieren usw klappt bestens. Eintragung in die DB hab ich noch nicht implementiert, das sollte aber keine Sache mehr sein.

                      Kommentar


                      • #12
                        hab dir eine PN geschickt!

                        Wegen den Attachments; glaube du musst diesen "verwirrenden Code" mit base64_decode() oder so ähnlich behandeln, damit daraus wieder binärcode wird. Dann muss man mit einem externen PHP-Skript diesen Code einlesen und oben den korrekten Header senden, damit der Browser weis was das ist. z.b. "application / octet-stream" (exe) und was es da sonst noch so alles gibt.

                        Wenn mir dein Skript weiterhilft werde ich mich drum kümmern das das mit den Attachments klappt

                        Kommentar


                        • #13
                          Mail ist raus NewBert (und thx für den GB Eintrag :wink: )

                          Ich möchte die Attachments nicht unbedingt an den Browser senden, sondern eher im Script welches die Mails holt gleich direkt auf die Platte ablegen. So kann ich danach den Filenamen und den Pfad in die mySQL DB geben und später so darauf zugreifen.
                          Hm, aber wie ich das hinkriege... kein Plan.

                          Hoffe mein Script hilft dir bei deiner Sache ein wenig weiter.

                          Kommentar


                          • #14
                            jau dsxs dein Script hat mir weitergeholfen und auch danke an Meikel der mir seins geschickt hat. E-Mails mit mime multipart abholen geht jetzt. Der output ist zwar noch voll fürn ****** wenns eine HTML-Mail ist aber das sollte man noch irgendwie in griff kriegen mit regex oder geeigneten PHP-Functions. Will sowieso "nur text" haben. HTML ist da nicht so erwünscht, weil die E-Mails technisch weiterverarbeitet werden sollen.

                            Wegen den Attachments mach ich nochmal einen neuen Thread auf, ist ja etwas das man auch auf andere Bereiche beziehen kann (File output)

                            Kommentar


                            • #15
                              Genau meine Sache NewBert, ich will meine Mails in purem Text in der DB haben, kein anderes Gefusel...
                              Das mit den Attchs kriegen wir zusammen auch noch hin demnächst ^^

                              Kommentar

                              Lädt...
                              X