[Zend Framework] Zend_Mail: 日本語文字化けに関してわからなかった点をメモしておく
Zend_Mailで日本語を含んだメールの送信を試した中で、文字化けに関して分からなかった点を後で読み返せるようにメモしておきます。
ZendFrameworkのバージョンは、1.12.3です。
Contents
何が解決できなかったのか?
- 日本語の長い件名が途中から文字化けする
- To, From などに付けられるラベル?に日本語を使うと文字化ける
- 添付ファイル名に日本語が含まれると文字化ける
public function sendmailAction() {
function mbCnv($string) {
return mb_convert_encoding($string, 'ISO-2022-JP', 'UTF-8');
}
$txt = '長い日本語のテキスト。文字化けるか確認します。元のアドレスのコピー。松本人志。さらに特定の文字が文字化けるか確認します。長い日本語のテキスト。文字化けるか確認します。元のアドレスのコピー。松本人志。さらに特定の文字が文字化けるか確認します。';
$mail = new Zend_Mail('ISO-2022-JP');
// $mail->setHeaderEncoding(Zend_Mime::ENCODING_BASE64);
$mail->addTo('to@test.com');
$mail->addCc('copy@test.com');
$mail->setFrom('from@test.com');
$mail->setSubject(mbCnv($txt));
$mail->setBodyText(mbCnv($txt), null, Zend_Mime::ENCODING_7BIT);
$atImage = file_get_contents('http://www.foo.com//logo.png');
$at = new Zend_Mime_Part($atImage);
$at->type = 'image/png';
$at->disposition = Zend_Mime::DISPOSITION_INLINE;
$at->encoding = Zend_Mime::ENCODING_BASE64;
$at->filename = mbCnv('test.png');
$mail->addAttachment($at);
$config = array('port' => 1025);
$smtp = new Zend_Mail_Transport_Smtp('127.0.0.1', $config);
try {
$mail->send($smtp);
echo '送信しました';
} catch (Zend_Exception $e) {
echo "エラー: " . $e->getMessage();
}
}
Zend_Mail はバグもあったらしく、バージョンによって挙動が違うのかなと、いろんなスクリプトをみて思いました。
また、MUA(今回はMailCatcher)によって表示は変わるのかもしれないのですが、そこは突っ込んで調べてません。
また、いろいろ試している最中に「インターネットメールの基礎」を読みました。
ほかにも読んでおくとよい情報があれば教えて下さい。
Zend_MailのSVNリポジトリ http://framework.zend.com/svn/framework/standard/trunk/library/Zend/Mail.php
日本語の長い件名が途中から文字化けする
公式の「文字セット – Zend_Mail – Zend Framework」や「エンコーディング – Zend_Mail – Zend Framework」のサンプルスクリプトをもとに、こんな感じの記述を加えると、文字化けが発生します。
$mail->setHeaderEncoding(Zend_Mime::ENCODING_BASE64);
この記述を外すと、画像の青い部分のように文字化けしません。

Zend_Mime::ENCODING_BASE64 あり(base64 方式でエンコード)
To: to@test.com Cc: copy@test.com From: from@test.com Subject: =?ISO-2022-JP?B?GyRCRDkkJEZ8S1w4bCROJUYlLSU5JUghI0o4O3oyPSQxJGskKzNORy?= =?ISO-2022-JP?B?ckNyReJDkhIzg1JE4lIiVJJWwlOSROJTMlVCE8ISM+PktcP007ViEj?= =?ISO-2022-JP?B?JDUkaSRLRkNEaiROSjg7eiQsSjg7ejI9JDEkayQrM05HJyQ3JF4kOS?= =?ISO-2022-JP?B?EjRDkkJEZ8S1w4bCROJUYlLSU5JUghI0o4O3oyPSQxJGskKzNORyck?= =?ISO-2022-JP?B?NyReJDkhIzg1JE4lIiVJJWwlOSROJTMlVCE8ISM+PktcP007ViEjJD?= =?ISO-2022-JP?B?UkaSRLRkNEaiROSjg7eiQsSjg7ejI9JDEkayQrM05HJyQ3JF4kOSEj?= =?ISO-2022-JP?B?GyhC?= Date: Thu, 23 May 2013 17:11:57 +0900 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit Content-Disposition: inline MIME-Version: 1.0 $BD9$$F|K\8l$N%F%-%9%H!#J8;z2=$1$k$+3NG'$7$^$9!#85$N%"%I%l%9$N%3%T!<!#>>K\?M;V!#$5$i$KFCDj$NJ8;z$,J8;z2=$1$k$+3NG'$7$^$9!#D9$$F|K\8l$N%F%-%9%H!#J8;z2=$1$k$+3NG'$7$^$9!#85$N%"%I%l%9$N%3%T!<!#>>K\?M;V!#$5$i$KFCDj$NJ8;z$,J8;z2=$1$k$+3NG'$7$^$9!#(B
Zend_Mime::ENCODING_BASE64 なし(quotedprintable 方式でエンコード)
To: to@test.com Cc: copy@test.com From: from@test.com Subject: =?ISO-2022-JP?Q?=1B$BD9$$F|K\8l$N%F%-%9%H!#J8;z2=3D$1$k$+3NG'$7$^$9!#85$N%"%I%l%9$N%3%T!<!#>>K\=3FM;V!#$5$i$KFCDj$NJ8;z$=2CJ8;z2=3D$1$k$+3NG'$7$^$9!#D9$$F|K\8l$N%F%-%9%H!#J8;z2=3D$1$k$+3NG'$7$^$9!#85$N%"%I%l%9$N%3%T!<!#>>K\=3FM;V!#$5$i$KFCDj$NJ8;z$=2CJ8;z2=3D$1$k$+3NG'$7$^$9!#=1B(B?= Date: Thu, 23 May 2013 17:11:37 +0900 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit Content-Disposition: inline MIME-Version: 1.0 $BD9$$F|K\8l$N%F%-%9%H!#J8;z2=$1$k$+3NG'$7$^$9!#85$N%"%I%l%9$N%3%T!<!#>>K\?M;V!#$5$i$KFCDj$NJ8;z$,J8;z2=$1$k$+3NG'$7$^$9!#D9$$F|K\8l$N%F%-%9%H!#J8;z2=$1$k$+3NG'$7$^$9!#85$N%"%I%l%9$N%3%T!<!#>>K\?M;V!#$5$i$KFCDj$NJ8;z$,J8;z2=$1$k$+3NG'$7$^$9!#(B
- Zend_Mailの振る舞いに関して「Zend Framework – Zend_Mail編」
- Zend_Mailを継承した改修クラスの作成による解決方法「ねこすけLPO開発メモ – ねこすけ LPO Wiki – ねこすけ LPO – SourceForge.JP」
クラスの継承をはじめてみた気がするので、あとでちゃんと眺めます。
To, From などに付けられるラベル?に日本語を使うと文字化ける
例えばsetFromには送信者名をこんな感じで付けられます。
$mail->setFrom('somebody@example.com', myConvert('Some Sender'));
日本語を含めると、一部の文字が文字化けします。

「Zend_Mail を頑張って日本語対応してみた – localdisk」でふれられている文字化けのパターンです。
subjectでうまくできているので、解決方法はその辺りにあるのかもしれません。
- 改修クラス
- 「プログラミングおぼえがき: 続 Zend_Mailの文字化け対策」で mb_encode_mimeheader が書かれているのでこれを使う?
- 「ZendFrameworkで添付メール送信」
- 「php/zend_framework/zend_mail – 初心者エンジニアの簡易メモ」
添付ファイル名に日本語が含まれると文字化ける
ファイル名に日本語をつかうと文字化ける。
$at->filename = mbCnv('日本語.png');

「ZendFrameworkを使い、添付ファイル付きでメール送信する場合にハマったことのメモ | Wataame Frog」のようにやれば解決できるのでしょうか。
- 前項と同じ?
- Zend_Mimeも確認
なんとなくISO-2022-JPの変換とheaderのBASE64エンコーディングがごっちゃになってる気がする。
と思って試してみたら、添付ファイル名対応できました。
文字化けの解決はできるかも。また改めてやってみます。
