Kann nicht verstehen, warum Zend_Mail :: addHeader () neue Zeilen entfernt

8

(Da dies meine erste SO-Frage ist, lass mich nur sagen, ich hoffe, dass es nicht zu Zend-spezifisch ist. Soweit ich das beurteilen kann, sollte das kein Problem sein. Obwohl ich es in einem Zend-spezifischen Forum, ich fühle mich als wäre ich mindestens so wahrscheinlich, eine gute Antwort hier zu erhalten, besonders da die Antwort MIME-bezogene Probleme beinhalten könnte, die über Zend Framework hinausgehen. Ich versuche im Grunde zu verstehen, ob das Problem ich bin Einblenden sollte als ZF-Fehler betrachtet werden, oder wenn ich etwas falsch verstehe oder missbrauche.)

Ich habe Zend_Mail verwendet, um eine MIME-Nachricht zu erstellen, die über SendGrid, einen E-Mail-Verteilungsdienst, gesendet wird. Ihre Plattform ermöglicht das Senden von E-Mails über ihren SMTP-Server, bietet jedoch zusätzliche Funktionen, wenn Sie einen speziellen Header (X-SMTPAPI) verwenden, dessen Wert eine JSON-codierte Zeichenfolge mit proprietären Parametern ist, die ziemlich lang werden kann.

Schließlich wurde der Header, den ich passierte, zu lang (ich denke & 1000 Zeichen), und ich bekam Fehler. Ich war verwirrt, weil ich wusste, dass es durch PHPs native wordwrap () - Funktion übergeben wurde, bevor ich den Wert an Zend_Mail :: addHeader () übergab, also dachte ich, die Zeilenlänge sollte nie ein Problem sein.

Es stellt sich heraus, dass addHeader () Zeilenumbrüche sehr absichtlich und ohne besondere Erklärung durch Kommentare entfernt.

%Vor%

Ok, das erschien mir zunächst vernünftig - vielleicht will ZF die Formatierung und Zeilenumbruch vollständig steuern. Die nächste in Zend_Mail :: addHeader () aufgerufene Methode ist

%Vor%

Diese Methode codiert den Wert (entweder quoted-printable oder base64) und zerlegt ihn in Zeilen mit entsprechender Länge, aber only , wenn er "nicht druckbare Zeichen" enthält, wie von Zend_Mime festgelegt :: isPrintable ($ value).

Wenn Sie sich diese Methode ansehen, werden Zeilenumbrüche (\ n) tatsächlich als nicht druckbare Zeichen betrachtet! Wenn sie also beim vorherigen Methodenaufruf nicht aus der Zeichenfolge entfernt worden wären, würde der lange Header als QP codiert und in 72-Zeichen-Zeilen aufgeteilt werden, und alles würde gut funktionieren. Tatsächlich habe ich einen Test gemacht, bei dem ich den Aufruf von _filterOther () auskommentiert habe, und der lange Header wird codiert und läuft ohne Probleme durch. Aber jetzt habe ich ZF einfach einen sorglosen Hack gemacht, ohne wirklich den Zweck hinter der Linie zu verstehen, die ich entfernt habe, also kann das keine langfristige Lösung sein.

Meine mittelfristige Lösung bestand darin, Zend_Mail zu erweitern und eine neue Methode, addHeaderForceEncode (), zu erstellen, die immer den Wert des Headers codiert und ihn daher immer in kurze Zeilen zerlegt. Aber ich bin immer noch nicht zufrieden, weil ich nicht verstehe, warum dieser _filterOther () Aufruf überhaupt notwendig war - vielleicht sollte ich gar nicht daran arbeiten.

Kann mir jemand erklären, warum dieses Verhalten beim Entfernen von Zeilenumbrüchen besteht? Es scheint unvermeidlich zu Situationen zu führen, in denen ein Header zu lang werden kann, wenn er keine "nicht druckbaren Zeichen" außer Zeilenumbrüchen enthält.

Ich habe eine Reihe verschiedener Suchen zu diesem Thema durchgeführt und einige ZF-Fehlerberichte durchgesehen, aber ich habe niemanden gesehen, der darüber gesprochen hat. Überraschenderweise scheint es ein wirklich obskures Problem zu sein. FYI Ich arbeite mit ZF 1.11.11.

Update: Falls jemand der ZF-Frage nachgehen möchte, habe ich darüber gesprochen, hier ist es: Zend_Mail :: addHeader () Entfaltet lange Header und löst dann eine Ausnahme aus

    
LinusR 03.01.2012, 22:07
quelle

1 Antwort

6

Sie stoßen wahrscheinlich auf ein paar Dinge. Pro RFC 2821 dürfen Textzeilen in SMTP 1000 Zeichen nicht überschreiten:

  

Textzeile

     

Die maximale Gesamtlänge einer Textzeile einschließlich der   1000 Zeichen (ohne Berücksichtigung des führenden Punktes für   Transparenz). Diese Anzahl kann durch Verwendung von SMTP erhöht werden   Serviceerweiterungen.

Eine Kopfzeile darf keine Zeilenumbrüche enthalten, weshalb Zend sie wahrscheinlich entfernt. Bei langen Headern ist es üblich, einen Zeilenumbruch (CRLF in SMTP) und einen Tabulator einzufügen, um sie zu umbrechen.

Auszug aus RFC 822 :

  

Jedes Kopfzeilenfeld kann als eine einzelne logische Zeile von angezeigt werden   ASCII-Zeichen, bestehend aus einem Feldnamen und einem Feldkörper.   Der Einfachheit halber ist der Feldkörperabschnitt dieses Konzepts   Entity kann in eine mehrzeilige Repräsentation aufgeteilt werden; Dies   heißt "Faltung". Die allgemeine Regel ist, dass, wo auch immer   kann linear-white-space sein (nicht einfach LWSP-Zeichen), ein CRLF   unmittelbar gefolgt von AT-LAST kann stattdessen ein LWSP-char sein   eingefügt.

Ich würde sagen, dass die Funktion _encodeHeader() möglicherweise die Zeilenlänge betrachten sollte, und wenn die Kopfzeile länger als ein magischer Wert ist, machen Sie die "wrap and tab", damit sie mehrere Zeilen umfasst.

    
tomlogic 03.01.2012, 22:53
quelle