私のパソコン雑記帖

ファイル添付フォームメール・テクニカルノート(3)

mb_encode_mimeheader 関数補足

カテゴリー: PHP
14Feb2014

mb_encode_mimeheader を使っても字化けが起きるケース

mail関数で触れたように、mb_encode_mimeheaderは日本語の処理に欠かせません。しかしそれでも字化けが起きることがありました。それは第2引数 $subject で、ある長さ以上の日本語文字を扱う時に起こるようです。
ネットで検索してみるとPHPのmail()関数で日本語メールを送信するとSubjectの20文字目から文字化けするというような記事も見つかり、よく知られている問題なのかもしれません。しかしここに書かれている解決方法は普遍性に欠けるようで、mb_encode_mimeheader都市伝説に詳細な解説があります。以下はそれを参考にして解決をみた例です。


実際のスクリプト

以下のスクリプト。
注1:mb_encode_mimeheader に渡す文字列の文字コードを規定する(上記・・・都市伝説参照)。
注2:mb_encode_mimeheader の第4引数 linefeed はデフォルトでは \n\r ということであるが、こと $subject に関しては \n を明示する。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>テスト</title>
</head>
<body>
<?php
mb_internal_encoding("utf-8");//注1
$namae="山田太郎";
$from="yyyyy@yyyyy.net";
$to="xxxxx@xxxxx.com";
$subject="【てすと】 かきくけこさしすせそたちつてとなにぬねの";
$comment="あいうえお";
$subject=mb_encode_mimeheader($subject,"iso-2022-jp","B","\n");//注2
$msg="";
$nm=mb_encode_mimeheader($namae,"iso-2022-jp","B");
$header="From:$nm<$from>\n";
$header.="Reply-To:山田事務所<$from>\n";
$header.="MIME-version:1.0\n";
$header.="Content-Type: text/plain; charset=ISO-2022-JP\n";
$temp=mb_convert_encoding($comment,"ISO-2022-jp","auto");
$msg.="$temp\n";
$msg=str_replace("&quot;","\"",$msg);
$msg=str_replace("&amp;","&",$msg);
$msg=str_replace("&lt;","<",$msg);
$msg=str_replace("&gt;",">",$msg);
if(mail($to,$subject,$msg,$header)){
print "メール送信完了<br />";
}
}
?>
</body>
</html>


追記(ファイルネームも同様)

ファイル添付の場合、ファイルネームにも同様な処理を施さないと、デコードエラーになる可能性があります(ファイルが認識されなくなる)。



コメント