プロが教える店舗&オフィスのセキュリティ対策術

windowsXP、XAMPPでメーラーMercuryを使用してローカルでメールしたとき受信メールの
SubjectがSubject: =?ISO-2022-JP?B?GyRCRnxLXDhsJTUlViU4JSclLyVIGyhC?=と文字化けします。
文字化けしないようにはどうすればいいのでしょうか。
下記内容がメールしたときのPHP、php/php.ini、メールの内容です。
また図がMercuryの設定内容です。

PHPの内容#################################################################################
<?php

$from = "admin@localhost";
$to = "admin@localhost";
$subject = '日本語サブジェクト';
$body = "本文です。\n日本語テスト";
//送信処理(日本語メール特有の文字コード変換とかヘッダの処理をする)
$body = mb_convert_encoding($body, 'iso-2022-jp', 'UTF-8');
$subject = mb_convert_encoding($subject, 'iso-2022-jp', 'UTF-8');
$subject = mb_encode_mimeheader($subject, 'iso-2022-jp');
$headers[] = "From: $from";
$headers[] = 'Content-Type: text/plain; charset=iso-2022-jp';
$headers[] = 'Transfer-Encoding: 7bit';
mail($to, $subject, $body, join("\n", $headers));

?>

xampp/php/php.iniの内容#################################################################################
[mail function]

SMTP = localhost

smtp_port = 25

sendmail_from = postmaster@localhost

sendmail_path = "\"C:\xampp\sendmail\sendmail.exe\" -t"

mail.add_x_header = Off

mail.log = "C:\xampp\apache\logs\php_mail.log"

[mbstring]

mbstring.language = Japanese

mbstring.internal_encoding = UTF-8

mbstring.http_input = auto

mbstring.http_output = UTF-8

mbstring.encoding_translation = On

mbstring.detect_order = auto

mbstring.substitute_character = auto

mbstring.script_encoding = UTF-8


メールの内容#################################################################################

Received: from spooler by localhost (Mercury/32 v4.72); 26 Sep 2010 22:09:23 +0900
X-Envelope-To: <admin@localhost>
Return-path: <postmaster@localhost>
Received: from localhost (127.0.0.1) by localhost (Mercury/32 v4.72) with ESMTP ID MG000001;
26 Sep 2010 22:09:22 +0900
To: admin@localhost
Subject: =?ISO-2022-JP?B?GyRCRnxLXDhsJTUlViU4JSclLyVIGyhC?=
From: admin@localhost
Content-Type: text/plain; charset=iso-2022-jp
Transfer-Encoding: 7bit

本文です。
日本語テスト

A 回答 (1件)

mb_encode_mimeheader関数は、PHPのビルド時のデフォルトの文字コードから、第二引数で指定した文字コード(ISO-2022-JP)に変換をした上で、mimeヘッダにエンコードをしてくれる関数です。



つまり、この関数を叩く前に、UTF-8の文字コードをISO-2022-JPに変換してはダメです。

<?php
//こいつが不要
$subject = mb_convert_encoding($subject, 'iso-2022-jp', 'UTF-8');
?>

php.iniの設定で、mb_internal_encodingの値はUTF-8に成っているので今回必要ないですが、
レンタルサーバとか、他の環境でiniを編集出来ない場合は、スクリプトの頭にでも
<?php
mb_internal_encoding('UTF-8');
?>
とでもしてやってください。これが確実です。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2010/09/28 06:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!