スレッド表示 | フラット表示〕 全トピック 920 件中 430 番目 次≫ ≪前

メールの文字化けについて

created: 2005-06-06 19:22 | modified: 2005-06-14 00:40 | reply: 5

[2299] メールの文字化けについて

user: ビーム | created: 2005-06-06 19:22
こんにちは。
PHPから送ったメールで、ある環境の方は文字化けして見れないとの事を言われました。

Outlook ExpressではOK。
Outlook 2002等ではNG。

らしいです。
原因は何でしょうか?
reply: 2302 返信 編集 削除

[2302] どのようなメールを送ったんでしょう

user: ゆうじ | created: 2005-06-07 02:07
Outlook Express も Outlook も使っていませんが
メールクライアントによって読める読めないというのは良くあることです。

可能な限り多くのメールクライアントに対応しようと考えるなら
メールヘッダを理解する必要があります。

PHPマニュアル抜粋(参考RFC)
RFC 1896, RFC 2045, RFC 2046, RFC 2047, RFC 2048, RFC 2049


・・・と難しい話になるので、
どのような方法で、どのようなメールを送ったら、どう化けたのか、
お知らせいただいたほうが解決の近道だと思います。

例えばこんなこと。
● PHPのバージョン
● php.ini の mail、mb周りの設定は?
● 送信は、mail() 、mb_send_mail() どっち?
● メールの文字エンコーディングは?
● メールヘッダの内容は?
● 本文中に機種依存文字を含んでいないか?
● ヘッダ中にマルチバイト文字を含んでいないか?
● 文字の化け方に特徴は?
● 簡単な内容のメールでも同じように化けるのか?
Parent: 2299  reply: 2305 返信 編集 削除

[2305] 送った内容は…

user: ビーム | created: 2005-06-08 10:45
こんにちは。

使用環境は
・PHP 4.3.8
・送信はmail()です。
・エンコーディングは
$message=i18n_convert($message, "JIS", "EUC");

機種依存文字は含んでいません。
文字化けですが
「みなさんこんにちは」が
「$B$_$J$5$s$3$s$K$D$o!#(B」
ってな感じになってます。
別のWin環境で試すと問題なく表示されます。
たまたま、受けた方の環境の問題でしょうか?

ゆうじさんが書いていた、
● php.ini の mail、mb周りの設定は?
● メールヘッダの内容は?
ですが、「これが基準」のような決まりってあるのですか?

よろしくお願いします。
Parent: 2302  reply: 2306 返信 編集 削除

[2306] メールヘッダに2行追加

user: ゆうじ | created: 2005-06-08 12:19
WinXP SP2 + PHP 4.3.11、i18ライブラリが無いので
代わりに mb_convert_encoding で文字コード変換という環境で
次のコードを試したら、文字コードは "JIS" に変換されていましたが、
文字コードの検出が"JIS"とはならず、"EUC-JP"となりました。
どうもPHP内部で文字コード検出に失敗してる様です。
しかし 他のクライアントで正しく表示されることを考えると
Outlook 出文字化けする直接の原因ではないと思います。

テストコード
<?php
$str = 'みなさんこんにちは';
$str = mb_convert_encoding($str, 'JIS', 'EUC-JP');

echo mb_detect_encoding($str), ' : ', $str;
?>

出力
EUC-JP : みなさんこんにちは


ブラウザで、JISコードの文字列を強制的に EUC として表示すると
お知らせ頂いたように、"$" と "英数記号" だらけの文字が表示されますし
エンコードも EUC として検出されます。
Outlook でも同じように文字コードの検出に失敗しているのだと思われます。


■ 対策
いろんなメールのヘッダを確認してみるとわかりますが、
日本語を含むテキストメールのヘッダには次の2行が必ずあるはずですが
これが無い為に文字コードの検出に失敗してるのだと思います。

Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit


mb_send_mail 関数では、文字コードの変換も行ってくれますし
このヘッダも自動的に追加してくれますので、
可能なら mb_send_mail で送信すると良いと思います。

<?php
$message = 'みなさんこんにちは';

$to = 'php@sound-uz.jp';
$subject = 'Test';
$header = "From: php@sound-uz.jp";

mb_language('Japanese'); // 日本語メールの際は必須

mb_send_mail($to, $subject, $message, $header);
?>


もし どうしても mail 関数でということなら、
第4引数の追加ヘッダに自前で書き加えれば同じ効果が得られます。

<?php
$message = 'みなさんこんにちは';
$message = mb_convert_encoding($message, 'JIS', 'EUC-JP');

$to = 'php@sound-uz.jp';
$subject = 'Test';
$header = "From: php@sound-uz.jp\r\n";
$header .= "Content-Type: text/plain; charset=ISO-2022-JP\r\n";
$header .= "Content-Transfer-Encoding: 7bit";

mail($to, $subject, $message, $header);
?>
Parent: 2305  reply: 2308 返信 編集 削除

[2308] ありがとうございました。

user: ビーム | created: 2005-06-09 09:40
全ての環境では試してないのですが、大丈夫そうです。
助かりましたー。

>どうもPHP内部で文字コード検出に失敗してる様です。

これが不可解でした。こんなもんですかね?
でもおかげさまで助かりました。
ありがとうございました。
Parent: 2306  reply: 2315 返信 編集 削除

[2315] すいません。追加です。

user: ビーム | created: 2005-06-14 00:40
メーラーによる文字化けは改善できたのですが、
今までは大丈夫だった「【」のような文字がメールタイトルに入ってると文字化けしてしまいます。

$subject=mb_encode_mimeheader($subject);
mb_language('Japanese');
mb_send_mail($dest, $subject, $message,"From: $header<$from>");

としてるのですが、何故でしょうか?
Parent: 2308  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 430 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑