2012-01-03 16 views
8

(これは私の最初の質問ですので、私はそれがあまりにもZend特有でないことを願っています。 Zend Frameworkを超越したMIME関連の問題が含まれている可能性があるので、私はここで良い答えを得られる可能性が高いと感じています。私が直面している問題がZFのバグとみなされるべきかどうか、あるいは私が何かを誤解しているか誤解しているかどうかを理解しようとしています)Zend_Mail :: addHeader()が改行を取り除く理由を理解できません

私はZend_Mailを使って電子メール配信サービスのSendGridを介して送信されます。彼らのプラットフォームではSMTPサーバー経由で電子メールを送信できますが、特別なヘッダー(X-SMTPAPI)を使用すると追加機能が提供され、その値はJSONでエンコードされた独自パラメータの文字列です。

最終的に、私が通過していたヘッダーが長すぎる(1000文字を超えると思う)、エラーが発生しました。 Zend_Mail :: addHeader()に値を渡す前にPHPのネイティブwordwrap()関数を通過していることを知っていたので、私は混乱していました。

addHeader()は、改行を非常に意図的に削除しており、特にコメントはありません。

これは最初は妥当と思われました。おそらく、ZFは書式設定と改行の完全な制御を望んでいました。 Zend_Mailを使用中に呼び出される次の方法が::のaddHeader()

$value = $this->_encodeHeader($value); 

それが含まれる場合、このメソッドは、値を符号化する(quoted-printableのいずれか、または適切なBASE64)と適当な長さの行にそれをチャンクが、のみありますZend_Mime :: isPrintable($ value)によって決定される「印刷不可能な文字」。

改行(\ n)は、実際には印刷できない文字と見なされます。したがって、以前のメソッド呼び出しで文字列から文字列が取り除かれなかった場合、長いヘッダーはQPとしてエンコードされ、72文字の行にチャンクされ、すべて正常に動作します。実際、私は_filterOther()の呼び出しをコメントアウトしたテストを行い、長いヘッダーはエンコードされ、問題なく処理されます。しかし、今は私が削除した行の背後にある目的を本当に理解することなく、ZFに不注意にハックしたので、これは長期的な解決策ではありません。

私の中期的な解決策は、Zend_Mailを拡張して新しいメソッドaddHeaderForceEncode()を作成することです。このメソッドは、常にヘッダーの値をエンコードするため、常に短い行にチャンクします。しかし、私はまだ最初の場所で_filterOther()呼び出しが必要な理由がわからないので、私はまだ満足していません - おそらく私はそれを回避するべきではないかもしれません。

誰も私にこの改行がストリップされている理由を説明できますか?必然的に、改行以外の「印刷不可能な文字」が含まれていないとヘッダーが長くなりすぎることがあります。

私はこの件に関してさまざまな検索を行い、いくつかのZFバグレポートを見てきましたが、これについて誰も話していませんでした。意外にも、それは本当にあいまいな問題であるようです。参考までにZF 1.11.11で作業しています。


更新:誰もが、私はこれについて開かれたZFの問題を追跡したい場合は、ここにある:Zend_Mail::addHeader() UNfolds long headers, then throws exception

+1

StackOverflowですべてに回答できます) +1ここでの最初の質問です。 – Flavius

+0

私を歓迎してくれてありがとう。 – LinusR

答えて

6

あなたはおそらく、いくつかのことに実行しています。 RFC 2821あたり、SMTPのテキスト行は1000文字を超えることはできません。

テキスト行

透明性のために複製先頭のドットをカウントしない 1000文字(含むテキスト行の最大合計長)。この番号は、SMTP サービス拡張を使用することによって増加する場合があります。

ヘッダーに改行を含めることはできません。そのため、おそらくZendがそれらを削除しているのでしょう。長いヘッダーの場合は、改行(SMTPのCRLF)とタブを「折り返す」タブを挿入するのが一般的です。 RFC 822から

抜粋:

各ヘッダフィールドは、フィールド名とフィールド本体を含む、 ASCII文字の単一の論理行とみなすことができます。 便宜上、この概念的な エンティティのフィールド本体部分は、複数行の表現に分割できます。この は「折りたたみ」と呼ばれます。 がリニアホワイトスペース(単にLWSP-charsではない)の場合は、CRLF の直後にLWSP-charが1つ続き、 が挿入される可能性があります。私は_encodeHeader()機能は、おそらく行の長さを見て、ヘッダが長く、いくつかの魔法の値を超える場合、「ラップし、タブ」それは複数行にまたがる持つようにすればいいと言うでしょう

+2

またチェックしても表示されません。Zend_Mailはヘッダーフォールディングをサポートしていませんし、処理しない "未処理のヘッダー"を追加する方法もありません。この変更は、 'Zend_Mail_Transport_Abstract'の' _prepareHeaders'メソッドで行うのが最適です。 3番目のパラメータ '$ append'を' addHeader'に渡すと、追加されたデータは折り畳まれますが、JSONを壊すと思われる行の最後にカンマが追加されます。これは[issue](http://framework.zend.com/issues/secure/Dashboard.jspa)を作成する価値があります。 – drew010

+0

@tomlogic CRLFの一部としての改行が(RFC 822で指摘したように)折りたたみに必要であるため、なぜ「あなたのヘッダーに改行を入れることはできないので、おそらくZendがそれらを取り除いている」とは分かりません。 。しかし、一般的には、addHeader()や_encodeHeader()に何か不明な点があることに同意しますか? – LinusR

+0

@LinusR:Zendは折り返しヘッダーを期待していないと思うので、改行を取り除いているのです。私の意見では、Zendは折りたたまれたヘッダー(各CRLFの後に空白が続く、裸のCRまたはLFはない)を受け入れるか、長いヘッダーを折りたたみます。 – tomlogic

関連する問題