- - PR -
PHPでメール送信で「?」の文字化け
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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-04-22 00:53
こんばんは〜。
PHP は全く詳しくないのですが(汗)、100通のうちの一部だけがおかしいのであれば、やはりスクリプトを疑うのが筋かと思われます。 文字化けするとのことですので、MIME とエンコードの同期が取れていないのでは?なども気になる点です。 # レンタルサーバだから日本語のメールが送れない、とは聞いたことがないので。(^^; 既出の問題だとも思われますので、日本 PHP ユーザ会 さんの 「PHP 初心者のための情報」 あたりで情報を探してみてはいかがでしょうか。 マニュアルから、関数の仕様と例を確認することもオススメいたします。 | ||||
|
投稿日時: 2004-04-22 11:15
i18n_mime_header_encode
mb_encode_mimeheader 使い方は http://www.google.co.jp/ | ||||
|
投稿日時: 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 とエンコードの同期】 というのが気にかかります。同期を取る際のアドバイスを頂けたらと思います。 | ||||
|
投稿日時: 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] この書き込みは私個人の見解を記述したものです。私が所属・関与する法人・団体の意見を代表・代弁するものではありません。 | ||||
|
投稿日時: 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-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" ); } | ||||
|
投稿日時: 2004-04-23 12:09
それはそうですね。 iso-2022-jpにわざわざ変換した文字列をEUC-JPのページに表示しているわけですから、化けるのが正しいです。 _________________ ひぐち おさむ [Disclaimer] この書き込みは私個人の見解を記述したものです。私が所属・関与する法人・団体の意見を代表・代弁するものではありません。 |