かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

PHPMailer でメールのタイトルが長いと文字化けする。

WordPressでも内部的に使われてるらしいPHPMailerさん便利なのでちょくちょく使っているのですが、メーラーによっては日本語で長い文章をメールのタイトルにすると文章の途中が文字化けしてしまっていました。
てっきりメーラーの仕様なんだと思っていたのですが、

ヘッダー各行は1k byte未満でなければならないというルールがあります(RFC)。
サーバーやソフトによってはもっと短い長さの文字までしか対応できないこともあります。

日本語はそのままでは扱えずエンコード処理を施すのでとても長くなります。
そのためそのままでは一行あたりの文字数制限を超える恐れがあります。
件名を短めに区切ってエンコードして複数行に分けることで対処しています。
 ー PHPmailerで送信するとメールが文字化けするときの対応:メールのプロの独り言

という仕様的な事だったようです。

解決方法のベストプラクティスが何なのかまだはっきり理解できていませんが、とりあえず僕は下記の方法で確認できるかぎりうまく動作しているっぽい状態に出来ました。

<?php
// デフォルトの言語設定、内部エンコーディングとかを指定
mb_language("japanese");
mb_internal_encoding("UTF-8");

// 件名は mb_convert_encoding($subject,"JIS","UTF-8") しない
// $mail->Subject = mb_encode_mimeheader( mb_convert_encoding($subject,"JIS","UTF-8") ); 
$mail->Subject = mb_encode_mimeheader($subject,'ISO-2022-JP');

 
文字コード関連は理解があまり出来てないなく、そももそもmb_encode_mimeheaderの使い方が違うって記事も見つけたので後でちゃんと理解したい。。。

ネット上で検索すると良く出てくるのが「38バイト目(74 文字)で文字化けが発生する」等の記述。 たしかに、38バイト目(74 文字)で文字化けが発生云々というのは現象面からするとその通りだが、実際にはmb_encode_mimeheaderの使い方に誤りがあるために起きる。

よくある間違った使い方。(mb_convert_encoding()は不要です) mb_encode_mimeheader(mb_convert_encoding($subject, 'ISO-2022-JP', 'UTF-8'));
 ー mb_encode_mimeheader()の文字化けについて [メモとかメモのようなものとか(By ルーキーの中のひと)]


[参考]