Zend_Mailの不具合まとめと修正見込み、テスト募集
Zend_Mailでは直感的に使うとヘッダーのエンコーディングに関して不具合があります。
しかし、次のリリースで直るかも知れません!
ここで改めて問題と解決方法についてまとめてみようと思います。
Zend_Mailの日本語(のみならず)対応がいまいちですに書いたように、現在のZend_MailのZend_Mail#setSubject等を使ったヘッダーのエンコーディングには二つ問題があります。
・長い文字列はRFC的には76バイトで分割しなければならないが分割されない
・日本で一般的なBエンコーディングではなく、Qエンコーディングされてしまう。
Long header lines containing non-printable characters are corruptedとして2007年に不具合も提出されており、Voteも多いにもかかわらず修正されず、どうなっとんねん!と言う指摘もあがっていました。
今回SVN r13598およびr13602にて修正が行われました。
Zend_Mail HEAD
私がissue trackerのコメントに書いた修正を元にして(それをさらに改善して)取り込んでくださいました。
コミットしてくださったのはZendの吉田さんです。すばらしいー。
メソッドsetEncodingOfHeadersが追加され、Bエンコーディングも選べるようになりました。
$mail->setEncodingOfHeaders(Zend_Mime::ENCODING_BASE64);
$mail->setSubject($japaneseLongSubject);
などと呼び出せるようになりました。メソッド名はまだ変わるかも知れませんが。
Zend_Mail使っている方々、ぜひ次のリリースではちゃんと動くよう、
svnのコードでテストをしてくださると助かります。
うまく動いたら吉田さんのおかげ、うまく動かなかったら私のせいです。
あと、iconv_mime_encodeがおかしいという指摘があがってますがそうなんですかね?
私は経験していないので良かったら教えてください。
それから、Zend Frameworkチームでは日本人の開発者を大募集中みたいです。我こそはと言う方助けてあげてください。
私も書類だけでも出したら簡単にコミットできるようになるのかな・・・。

[FYI] ZF1.9.4 ではまだ文字化けします
ご参考まで
Zend Framework 1.9.4
PHP5.2.10
CHARSET = UTF-8 / Zend_Mime::ENCODING_BASE64
の環境下で
Subject:
[試験] <日本語><日本語><日本語><日本語><日本語><日本語><日本語><日本語><日本語><日本語><日本語><日本語><日本語><日本語><日本語><日本語><日本語><日本語><日本語><日本語><日本語><日本語><日本語><日本語><日本語>
が文字化けしました。
Zend_Mime::ENCODING_QUOTEDPRINTABLE 時は問題無しなのでめんどくさくなって、
Zend/Mai.php
line(465) $value = Zend_Mime::encodeBase64Header($value, $this->getCharset(), Zend_Mime::LINELENGTH, Zend_Mime::LINEEND);
を
$value = mb_encode_mimeheader($value, $this->getCharset(), 'B');
へ直してしまいました。(安直T_T)
ISO-2022-JP に変換してお試しあれ
もしかすると、 Zend_Mail の各メソッドに渡す文字列が UTF-8 のままだったりして
あらかじめ ISO-2022-JP に変換してから渡してみると幸せになれるかも?
呼びかけありがとうございます
twkさん、こんにちは
呼びかけていただき、ありがとうございます。今Benjaminと一緒にいろいろいじってますので、乞うご期待です (^^)/
setEncodingOfHeaders() はOta Maresさんの意見を取り入れて setHeaderEncoding()にしました。
このほかMailヘッダー操作用に下記のpublic メソッドを追加しました。
設定系
setMessageId($id = true)
createMessageId() : (比較的)ユニークなMessage-Idを生成するためのメソッド
取得系
getHeaderEncoding()
getMessageId()
消去系
clearRecipients() : To, Cc, Bccヘッダを一括消去
clearFrom()
clearReturnPath()
clearSubject()
clearDate()
clearMessageId()