[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_Mail 2013-05-23 18-53-50
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

クラスの継承をはじめてみた気がするので、あとでちゃんと眺めます。

To, From などに付けられるラベル?に日本語を使うと文字化ける

例えばsetFromには送信者名をこんな感じで付けられます。

$mail->setFrom('somebody@example.com', myConvert('Some Sender'));

日本語を含めると、一部の文字が文字化けします。
Zend_Mail 2013-05-23 19-50-00
Zend_Mail を頑張って日本語対応してみた – localdisk」でふれられている文字化けのパターンです。
subjectでうまくできているので、解決方法はその辺りにあるのかもしれません。

添付ファイル名に日本語が含まれると文字化ける

ファイル名に日本語をつかうと文字化ける。

$at->filename    = mbCnv('日本語.png');

Zend_Mail 2013-05-23 21-17-32
ZendFrameworkを使い、添付ファイル付きでメール送信する場合にハマったことのメモ | Wataame Frog」のようにやれば解決できるのでしょうか。

  • 前項と同じ?
  • Zend_Mimeも確認

なんとなくISO-2022-JPの変換とheaderのBASE64エンコーディングがごっちゃになってる気がする。
と思って試してみたら、添付ファイル名対応できました。
文字化けの解決はできるかも。また改めてやってみます。