Zend_Mailで日本語のFrom情報を扱う

以前の記事で、Fromの名前の部分が化けてしまうということを書きましたが、
解決方法がわかったので、ここに残しておきます。

参考になったのは http://iandeth.dyndns.org/mt/ian/archives/000628.html です。
ここに、日本語のヘッダーを扱うためには、ISO-2022-JPに文字コードを変換して、
さらにbase64でエンコードして、さらに “=?ISO-2022-JP?B?”と”?=”で囲む必要があると。
今まで、mb_encode_mimeheaderを何も考えずに使っていましたが、
内部では上記のbase64エンコード以降のことをやってくれていたんですね。

ここまでを踏まえて、Zend_Mailのソースを見たところ、メールヘッダーはすべて、
base64ではなく、printableでエンコードされていました。
文字化けの原因はここでした。日本語に対応した処理でなかったとうことです。

しかし、printableでエンコードしている部分( _encodeHeaderメソッド)を、
base64でエンコードするようにしてしまうと、送信日時等の日本語が入ることがない
ヘッダーが受信側で正確にデコードされなくなってしまいます。

base64でエンコードしないとおかしくなるのは、Fromです。(場合によっては、Subjectも)
なので、setFromメソッドで、_encodeHeaderメソッドを呼び出している部分を、
mb_encode_mimeheaderを使ってエンコードするように変更したらOKです。

$this->_encodeHeader(‘”‘.$name.'”‘)

  ↓

mb_encode_mimeheader(‘”‘.$name.'”‘, ‘ISO-2022-JP’)

mb_encode_mimeheaderについては、下記をご参照ください。
http://phpspot.net/php/man/php/function.mb-encode-mimeheader.html

プログラムを設置しているサーバからZend_Mailだけを使って送信する場合は、
必ず文字化けするようなので、この対応は必須です。
メールサーバにSMTP認証して送信する場合(Zend_Mail_Transport_Smtp利用)は、
上記対応をしなくても、文字化けしていない場合もありました。
メールサーバ側で、うまいことやってくれているのかもしれません。

Zend_Mailで日本語のFrom情報を扱う