- PR -

PHPでメール送信で「?」の文字化け

投稿者投稿内容
slave
会議室デビュー日: 2004/04/21
投稿数: 4
投稿日時: 2004-04-21 10:51
初めて投稿させていただきます。

PHPとPostgresを使用できるレンタルサーバーでアドレスクリックで
自動的にメール送信されるスクリプトを作っております。

実際メールを送信すると、
BCCで確認する限りでは
100通ほど送り、3割程度[?]の文字化けに変わり、他は正常です。

mail送信のスクリプトファイルはEUCで
subjectと本文で日本語を仕様しております。
本文内に記述するメッセージ内容はDBより引っ張ってきております。
DBの文字コードもEUCで統一しております。

ソースを抜粋すると・・・

+++++++++++++++
$subj = "予約確認";
$mess = mb_convert_encoding($mess, "iso-2022-jp", "auto");
$headers = "From:test@test.com\\r\\n";
$headers .= "Bcc:test2@test.com\\r\\n";
$headers .= "Reply-to:test@test.com\\r\\n";

mb_language(ja);
mb_send_mail($mail,$subj,$mess,$headers);

+++++++++++++++

エラーの場合のクライアント側のさまざまで
化けたり化けなかったりです。

ですので、サーバー側、スクリプト側の問題と思われます。

レンタルサーバーのため、
php.iniファイルもいじれません。

[?]はUnicodeの問題とネットで探していると書いてありましたが、
対策方法が載っておらず行き詰まっております。


どなたかご教授願えればと思い投稿いたしました。
はゆる
ぬし
会議室デビュー日: 2004/02/16
投稿数: 1008
お住まい・勤務地: 首都圏をウロウロと
投稿日時: 2004-04-22 00:53
こんばんは〜。

PHP は全く詳しくないのですが(汗)、100通のうちの一部だけがおかしいのであれば、やはりスクリプトを疑うのが筋かと思われます。
文字化けするとのことですので、MIME とエンコードの同期が取れていないのでは?なども気になる点です。
# レンタルサーバだから日本語のメールが送れない、とは聞いたことがないので。(^^;

既出の問題だとも思われますので、日本 PHP ユーザ会 さんの 「PHP 初心者のための情報」 あたりで情報を探してみてはいかがでしょうか。
マニュアルから、関数の仕様と例を確認することもオススメいたします。
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2004-04-22 11:15
i18n_mime_header_encode
mb_encode_mimeheader

使い方は http://www.google.co.jp/
slave
会議室デビュー日: 2004/04/21
投稿数: 4
投稿日時: 2004-04-23 10:35
はゆるさん、コブラさん
ご返答ありがとうございます。

i18n_mime_header_encode
mb_encode_mimeheader
ググって使用してみました。

共に使用しても、逆に文字化けてしまいました。
subjectは正常に日本語で表記されており、
bodyだけが[?]でたまーに表示されておりました。

分からなかったので一応
$headers .= "Content-type: text/plain; charset=\"iso-2022-jp\"\r\n";
上記を追加して再びテストしています。

【MIME とエンコードの同期】
というのが気にかかります。同期を取る際のアドバイスを頂けたらと思います。


ひぐち おさむ
大ベテラン
会議室デビュー日: 2001/07/26
投稿数: 108
お住まい・勤務地: 東京都在住
投稿日時: 2004-04-23 10:46
通りがかりのものです。

何という文字がどういうコードに化けているのかを調べて、化け方の規則をみつけると、どこで化けているか判断ができるかもしれません。

mb_send_mail関数にどういう値が渡っているか、mb_send_mailを呼び出す直前で、$mail,$subj,$mess,$headersの各変数を書き出してみて、それを受け取ったメールの内容(ヘッダを含むソース)と比べるのが確実かと思います。

$mess = mb_convert_encoding($mess, "iso-2022-jp", "auto");
の行は不要ではないでしょうか?mb_send_mailは$messが内部文字コード(この場合EUC)だと思って動作しているはずですので。

また、うろおぼえですが
$headers .= "Content-type: text/plain; charset=\"iso-2022-jp\"\r\n";
は、
mb_language(ja);
をやっていればmb_send_mailが勝手に付けてくれるので不用だったような気がします。これも、受け取ったメールのヘッダを確認してみてください。
_________________
ひぐち おさむ
[Disclaimer] この書き込みは私個人の見解を記述したものです。私が所属・関与する法人・団体の意見を代表・代弁するものではありません。
slave
会議室デビュー日: 2004/04/21
投稿数: 4
投稿日時: 2004-04-23 11:24
ひぐちさま
ご返答ありがとうございます。

>何という文字がどういうコードに化けているのかを調べて、化け方の規則をみつける>>と、どこで化けているか判断ができるかもしれません

規則を見つけるにも、現象がたまーーーにですので、すぐに現象調査できず。。
化ける時の文字は日本語全てです。半角英数文字は正常です。

しかし、各変数のデバックを行って見たところ、
>$mess = mb_convert_encoding($mess, "iso-2022-jp", "auto");
上記がある場合はブラウザ上で$messが文字化けしておりました。
mb_convert_encodingをはずすと正常に表示されておりました。
(ブラウザ出力時はEUCだからだと思うのですが。。。)
受信メールも正常です。ヘッダーは以前となんら変わりはありません。

>mb_language(ja);
>をやっていればmb_send_mailが勝手に付けてくれるので不用だったような気がします。>これも、受け取ったメールのヘッダを確認してみてください。

たしかにContent-type: text/plain; charset=\"iso-2022-jp\が2行ありました。
ですので消しました。

$mess = mb_convert_encoding($mess, "iso-2022-jp", "auto");
この記述を消去してしばらく様子をみてみようかと思います。

常連さん
会議室デビュー日: 2004/04/06
投稿数: 38
お住まい・勤務地: 大阪
投稿日時: 2004-04-23 11:48
参考にならないかもしれませんが
外部SMTPサーバ メール送信スクリプトです

携帯端末用なのでスクリプト自体SJISでかかれてますので
EUC-JPなら置き換えてください

参考にならなければごめんなさい〜

//SMTPサーバ
$smtp=smtp.hoge.com;
//送信元アドレス
$add=hoge1@hoge.com;
//送信元名前
$nam=ホゲホゲ;
//宛先
$to=hoge2@hoge.com;
//題名
$sub="テストメール";
//本文
$msg="本文です";

//文字エンコード

//FROM
$nam=mb_convert_encoding($nam,"JIS","SJIS");
$from= 'From: "=?iso-2022-jp?B?'.base64_encode($nam).'?="<'.$add.'>';

//SUBJECT
$sub=mb_convert_encoding($sub,"JIS","SJIS");
$sub='=?iso-2022-jp?B?'.base64_encode($sub).'?=';

//MESSAGE
$msg=mb_convert_encoding($msg,"JIS","SJIS");

//送信!
$fp = fsockopen( $smtp, 25, $err_str, $err_no, 5 );
if( !$fp ){
echo $err_str.' ('.$err_no.")<br />\n";
}else{
$header = $from."\r\n";
$header .= "To: ".$to."\r\n";
$header .= "Reply-To: ".$add."\r\n";
$header .= "Subject: ".$sub."\r\n";
$header .= "Mime-Version: 1.0\r\n";
$header .= "Content-Type: Text/Plain; charset=iso-2022-jp\r\n";
$header .= "Content-Transfer-Encoding: 7bit\r\n";
fputs( $fp, "HELO ".$smtp."\r\n" );
fputs( $fp, "MAIL FROM:".$add."\r\n" );
fputs( $fp, "RCPT TO:".$to."\r\n" );
fputs( $fp, "DATA \r\n" );
fputs( $fp, $header.$msg."\r\n.\r\n" );
fputs( $fp, "QUIT \r\n" );
}
ひぐち おさむ
大ベテラン
会議室デビュー日: 2001/07/26
投稿数: 108
お住まい・勤務地: 東京都在住
投稿日時: 2004-04-23 12:09
引用:

slaveさんの書き込み (2004-04-23 11:24) より:
>$mess = mb_convert_encoding($mess, "iso-2022-jp", "auto");
上記がある場合はブラウザ上で$messが文字化けしておりました。
mb_convert_encodingをはずすと正常に表示されておりました。


それはそうですね。
iso-2022-jpにわざわざ変換した文字列をEUC-JPのページに表示しているわけですから、化けるのが正しいです。
_________________
ひぐち おさむ
[Disclaimer] この書き込みは私個人の見解を記述したものです。私が所属・関与する法人・団体の意見を代表・代弁するものではありません。

スキルアップ/キャリアアップ(JOB@IT)