mixmastertobsi: imap_base64 Problem

Hallo,

ich habe ein Problem mit Anhängen beim IMAP Import.

Das Skript lief immer 1a, doch nun sind wir vom Exchange Server zu einem Linux-Server umgezogen und jetzt sind die PDF-Dateien fehlerhaft.

In meinem Beispiel hat zum Beispiel die Original-Datei 772kb und die Datei nach dem Import nur noch 765kb.

Letztendlich mache ich ja nur ein imap_base64($message);

Hat jemand eine Idee?

  1. Ziemlich schwierig dazu was zu sagen, wenn man keinerlei verwertbare Angaben außer

    • Umzug von Exchange Server zu einem Linux-Server
    • Original-Datei 772kb, nach dem Import nur noch 765kb.

    hat. Letztere Ausgabe kann schon am Unterschied zwischen "kilo" (1000) und "kibi" (1024) liegen. Das wird immer wieder gern durcheinander verwendet.

    Fragen:

    • Wie wird das Mail erzeugt?
    • Wie versendet?
    • Was soll das für ein "Import" sein?
    • Kannst Du RAW-Quelltext eines solchen Mails mit Anhang und allen Headern in beiden Varianten (Erzeugt / Mailserver empfangen) zur Verfügung stellen?

    Generell ist das smtp sehr alt und die meisten Implementierungen sind "fehlerfrei". Deshalb vermute ich das Problem darin, dass das ausgehende Mail unsauber ist und das der Exchange Server den Fehler bisher ausgebügelt hat.

    Was mich schon stört ist:

    imap_base64 — Dekodiert Base-64 kodierten Text

    Das "Text" ist auch bei PHP.net FETT - Gehe mal davon aus, dass die Nutzung dieser Funktion für binäre Daten (PDF ist ein Binärformat) keine gute Idee ist. Es kann also Zufall gewesen ein, dass es bisher womöglich nur ging weil imap_base64() in PHP unter Windows womöglich ein Alias für base64_decode() ist.

  2. Einer der häufigeren Verstöße gegen die Regeln zum Aufbaus eines Mailes ist es auch, nach dem base64-kodieren die Zeilenumbrüche zu vergessen (oder hierbei wordwrap/chunk_spit() falsch anzuwenden)

    <?php
    
    $pdfOriginal   = '/tmp/test.pdf';
    $pdfBase64     = '/tmp/test.pdf.base64';
    $imapDecoded   = '/tmp/test.imap.pdf';
    $base64Decoded = '/tmp/test.base64decoded.pdf';
    
    $base64 = chunk_split( base64_encode( file_get_contents( $pdfOriginal ) ) );
    file_put_contents( $pdfBase64, $base64 );
    file_put_contents( $base64Decoded, base64_decode( $base64 ) );
    file_put_contents( $imapDecoded, imap_base64( $base64 ) );
    
    echo `ls -l $pdfOriginal $pdfBase64 $imapDecoded $base64Decoded`;
    
  3. imap_base64($message);

    Ups! Wirklich die ganze Nachricht ($message)? Entweder liegt da was im Argen, weil Du nur einen Teil ($part / $parts[$i]) decodieren willst oder Deine Variablennamen sind besch… äh: "nicht aussagekräftig" - was dann irgendwo zu anderen logischen Fehlern führt.

    Ab hier führt der Blick in den Krug nicht mehr weiter. Du musst jetzt Antworten liefern.

    Im übrigen wäre es fürchterlich nett von Dir auch mal zu erfahren, ob was geholfen hat. Als Antwortender ist man nämlich gerade bei derart kryptischen Fragen stets im Zweifel und überlegt ob man wirklich alles bedacht hat. Man könnte nämlich auch mit

    4. Idee - Allgemeine Fehlerbeschreibung

    Du hast was falsch gemacht

    antworten.

  4. Hallo,

    Letztendlich mache ich ja nur ein imap_base64($message);

    Der Fehler ist das nur. D.h., wenn die Message Base64 kodiert wird, muss auch das Encoding in einem entsprechenden Header gesetzt werden.

    MfG

    1. Hello,

      [...] und man muss immer trennen zwischen Content-Encoding und Transfer-Encoding.
      Wenn der Content utf-8-codiert ist, muss das dem Empfänger auch mitgeteilt werden. Sonst wird mWn immer noch ISO-8859-1 angenommen.

      Man kann das ganze Rätsel also vermutlich am schnellsten lösen, wenn Eingangsgrößen und Ausgangsgrößen als HEX bekannt sind und die Header beim Empfang ebenfalls.

      Liebe Grüße
      Tom S.

      --
      Es gibt nichts Gutes, außer man tut es!
      Das Leben selbst ist der Sinn.
      1. Hello,

        [...] und man muss immer trennen zwischen Content-Encoding und Transfer-Encoding.

        So isses. Es gibt also 2 Header, Beispiel

        Content-Type: text/plain; charset=UTF-8
        Content-Transfer-Encoding: base64
        

        MfG