送信メールのサブジェクトが長いと文字化けする

カテゴリ フォーム コアバージョン 7.16 関連モジュール Webform, Mail System, Mime Mail, Jp Mail Helper

一部のスマートフォンやメーラーでサブジェクトが文字化けする現象がありました。

Japan Mobile Helperモジュールを利用しているので、サブジェクトもISO-2022-JPにエンコードされています。
なのに文字化けしてしまいます。

コメント

ユーザー actbrain の写真

Japan Mail Helperの機能不足と思われます。

Japan Mail Helperでサブジェクトのエンコードを mb_encode_mimeheader に依頼していますが、
それ以前(hook_init)でmb_internal_encoding("UTF-8")としてしまっています。
その結果、mb_encode_mimeheader は内部エンコーディングによりサブジェクトを分割しようとします(※1)
その分割の際に内部エンコーディングに基づく分割を行ってしまいます。
ISO-2022-JPの文字列をUTF-8で分割したわけです。
※1)RFCによりサブジェクトが長い時は分割して記述するように規定されています。

措置として、Japan Mail Helperモジュールに下記変更が必要になります。
function jp_mail_helper_mime_header_encode($string) {
if (preg_match('/[^\x20-\x7E]/', $string)) {
+ mb_internal_encoding(JP_MAIL_HELPER_ENCODING_MAIL_HEADER); // 20121102144200 +
$string = mb_convert_encoding($string, JP_MAIL_HELPER_ENCODING_MAIL_HEADER, "UTF-8");
$string = mb_encode_mimeheader($string, JP_MAIL_HELPER_ENCODING_MAIL_HEADER);
+ mb_internal_encoding("UTF-8"); // 20121102144200 +
}
return $string;
}

参考:
http://www.onecreation.jp/blog/?p=1132

ユーザー actbrain の写真

その後の調査で上記措置は誤りであると解りました。

mb_encode_mimeheader()に渡す引数は、UTF-8で良く、iso-2022-jpに変換したり、内部円コーディングをiso-2022-jpにしたりするのは不要、問題でした。

正しくは下記になります。

if (preg_match('/[^\x20-\x7E]/', $string)) {
// 20121106024700 - + mb_internal_encoding(JP_MAIL_HELPER_ENCODING_MAIL_HEADER); // 20121102144200 +
// 20121106024700 - $string = mb_convert_encoding($string, JP_MAIL_HELPER_ENCODING_MAIL_HEADER, "UTF-8");
$string = mb_encode_mimeheader($string, JP_MAIL_HELPER_ENCODING_MAIL_HEADER);
// 20121106024700 - + mb_internal_encoding("UTF-8"); // 20121102144200 +
}

ページ

OTHER FAQ

Drupal開発・運用の疑問/質問の答えはここに

無料ユーザー登録すると質問できます。

カテゴリ降順で並び替える Core Ver. 関連モジュール タイトル
JavaScript 8.5.x PHP Commerce決済モジュール設定をJavaScriptにデータに渡す方法
JavaScript 7.34 PHP PHPからJavaScriptに変数値を渡したい
jQuery Revolution 7.50 jQuery Revolutionのリンクがスマホで機能しない
Libraries 8.5.x Libraries Commerceで外部JavaScriptをテスト/本番で読み分ける方法
mac linux ファイル名 文字化け 8.7.x mac linux ファイル名 文字化け Macからlinuxにrsyncするとファイル名(濁点)が文字化けする場合の対応方法
Messages 7.34 Disable messages 標準(コア)が表示する特定のメッセージ非表示にしたい
Migrate 9.x drush config Upgrade source(環境) を 変更したときにやるべきこと
PCRE 7.50 preg_match()がおかしい
PHP 7.22 PHP ノードに付いたコメントを好きな場所に表示する
PHP 8.9.x PHP YamlをPHP配列にする方法
PHP 8.9.x drush drush sql:cli < が機能しない場合の対処
PHP 8.3x PHP drupa8でhook_init()する方法
PHP-FPM 8.9.x PHP PHP-FPM 環境で .htaccess に php_value を 書いてもダメ
PhpStorm 7.50 LocalForward PhpStormから踏み台を使う
Proxy 7.59 Proxy Apache settings.php リバースプロキシ(Apache)+バックグランドWeb(Drupal 7 )でログインセッションを維持する方法
SESSION 8.9.x api $_SESION操作のAPI
SFTP 8.4x SFTP RSA SFTP(RSA)でファイル転送(送信)する方法
SSH 7.50 ProxyCommand SSH IP制限を1コマンドで通過する
Token 8.4x Token カスタムモジュールからtokenを提供する方法(drupal8版)
token 7.34 token オリジナルモジュールからtokenを提供する方法を教えて下さい。

ページ