同じメールをOutlook Express で受信すると文字化けしません。
http://www.hobo-ya.com/kohtao/planetinfo/ask/fandive_book.php
上記フォームは、各項目が、それぞれ別のphpファイルになっています。
上記フォームのソースは、以下に貼りつけました。
http://planetscuba.blog5.fc2.com/blog-entry-1999.html
フォームの文字コードを変更したり、
項目別のphpファイルの文字コードを変更したのですが、
文字化けがなおりません。
(受信したメールだけでなく、ブラウザで表示した時にフォーム自体が文字化けしてしまったりもしました。)
●フォーム本体とソース内にあるphpファイルに関する文字エンコード
●フォーム本体で読み込まれるphpファイルの文字エンコード
これらの組み合わせだと思うのですが、
問題を解決できません。
どのように修正すれば、文字化けせずに表示されるようになりますでしょうか?
教えていただけると助かります。
「# メールボディを作成する」の処理内(※295行目の「$mailbody .= "$naiyo_o\n\n";」から318行目のforループの処理終了「}」までの変更になります。)
# $mailbody .= "$naiyo_o\n\n"; # この行の前に次の処理を追加して、$mailbodyには変数で代入します。 $naiyo_o = "$naiyo_o\n\n"; $naiyo_o =~ tr/+/ /; $naiyo_o =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; $naiyo_o =~ s/[\r\n]+/\n/g; &jcode'convert(*naiyo_o, "jis"); $mailbody .= $naiyo_o; for ($i = 1; $i < $cnt-3; $i++) { if($FORM{$FORM[$i]} ne ""){ if($FORM[$i] eq $onamae){ $first = "\n代表\の方の情報----------------------------------------------\n"; $first =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; &jcode'convert(*first, "jis"); $mailbody .= $first; } if($FORM[$i] eq $onamae2){ $second = "\n2人目の方の情報----------------------------------------------\n"; $second =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; &jcode'convert(*second, "jis"); $mailbody .= $second; } if($FORM[$i] eq $onamae3){ $third = "\n3人目の方の情報----------------------------------------------\n"; $third =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; &jcode'convert(*third, "jis"); $mailbody .= $third; } if($FORM[$i] eq $onamae4){ $fourth = "\n4人目の方の情報----------------------------------------------\n"; $fourth =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; &jcode'convert(*fourth, "jis"); $mailbody .= $fourth; } $mailbody .= "$FORM[$i] = $FORM{$FORM[$i]}\n"; } }
※エンコードされていない箇所とエンコードされている箇所が混在していた為、文字化けしていたようですので、すべてエンコードされるように変更しました。
※今まで受信したメールには、フォームで入力した人数分の情報とコメントが記載されていたでしょうか?
上記のコードでは届いていなかった可能性があります。
入力されたすべての情報を受信したい場合は、次の記述を使ってください。(※全員の情報送信済みだったり、コメントに質問などが書かれていた場合、話がかみ合わなかったのではないかと思うのですが・・・)
# $mailbody .= "$naiyo_o\n\n"; # この行の前に次の処理を追加して、$mailbodyには変数で代入します。 $naiyo_o = "$naiyo_o\n\n"; $naiyo_o =~ tr/+/ /; $naiyo_o =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; $naiyo_o =~ s/[\r\n]+/\n/g; &jcode'convert(*naiyo_o, "jis"); $mailbody .= $naiyo_o; for ($i = 1; $i < $cnt; $i++) { if($FORM{$FORM[$i]} ne ""){ if($FORM[$i] eq $onamae){ $first = "\n代表\の方の情報----------------------------------------------\n"; $first =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; &jcode'convert(*first, "jis"); $mailbody .= $first; } if($FORM[$i] eq $onamae2){ $second = "\n2人目の方の情報----------------------------------------------\n"; $second =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; &jcode'convert(*second, "jis"); $mailbody .= $second; } if($FORM[$i] eq $onamae3){ $third = "\n3人目の方の情報----------------------------------------------\n"; $third =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; &jcode'convert(*third, "jis"); $mailbody .= $third; } if($FORM[$i] eq $onamae4){ $fourth = "\n4人目の方の情報----------------------------------------------\n"; $fourth =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; &jcode'convert(*fourth, "jis"); $mailbody .= $fourth; } # 項目名の比較の為にエンコードします。※お名前~お名前4についても、項目名が固定で変更予定がないのでしたら、+記号の変換と改行コードの変換の行は削除するかコメントアウトしても大丈夫です。 $comment = 'コメント'; $comment =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; &jcode'convert(*comment, "jis"); if($FORM[$i] eq $comment){ $comment = "\nコメント(ご質問・ご連絡など)-------------------------------\n"; $comment =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; &jcode'convert(*comment, "jis"); $mailbody .= $comment; } $mailbody .= "$FORM[$i] = $FORM{$FORM[$i]}\n"; } }
※コメントでの質問ですが、カスタマイズしている箇所がバージョンアップの変更点に影響している場合、コピー&ペーストしただけでは動かない可能性もあります。
メール送信を行っているであろう "../../cgi-bin/formmail.cgi" の問題と思われます。
まずは、formタグに下記のようにenctypeを追加してみてください。
<FORM action="../../cgi-bin/formmail.cgi" method="POST" enctype="multipart/form-data">
http://tohoho.wakusei.ne.jp/
を見ても formmail.cgi は存在しないようです。
ありがとうございます。
確認しておりませんでした。申し訳ありません。
以下にfomacgi.cgiの中身をアップしました。
http://planetscuba.blog5.fc2.com/blog-entry-2001.html
メール送信時のエンコードが
ISO-2022-JP あたりでないと文字化けするのかも。
SJISのまま送信すると、文字化けするメーラーがあります。
どういう処理をしてるのか不明ですが、エンコード処理してなければ
受け取ったコードのまま送信してると思います。
■
formmail.cgiのソースの文字コードは関係ありません。
メール送信のロジックの部分です。
■
<FORM action="../../cgi-bin/formmail.cgi" method="POST">
これはこのままでよいです。
処理を見直す必要があるのは、formmail.cgiの中身です。
■
Outlook Express の場合は
メールの本文が、SJISでもISO-2022-JPでも
文字化けしないようになっています。
「# メールボディを作成する」の処理内(※295行目の「$mailbody .= "$naiyo_o\n\n";」から318行目のforループの処理終了「}」までの変更になります。)
# $mailbody .= "$naiyo_o\n\n"; # この行の前に次の処理を追加して、$mailbodyには変数で代入します。 $naiyo_o = "$naiyo_o\n\n"; $naiyo_o =~ tr/+/ /; $naiyo_o =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; $naiyo_o =~ s/[\r\n]+/\n/g; &jcode'convert(*naiyo_o, "jis"); $mailbody .= $naiyo_o; for ($i = 1; $i < $cnt-3; $i++) { if($FORM{$FORM[$i]} ne ""){ if($FORM[$i] eq $onamae){ $first = "\n代表\の方の情報----------------------------------------------\n"; $first =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; &jcode'convert(*first, "jis"); $mailbody .= $first; } if($FORM[$i] eq $onamae2){ $second = "\n2人目の方の情報----------------------------------------------\n"; $second =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; &jcode'convert(*second, "jis"); $mailbody .= $second; } if($FORM[$i] eq $onamae3){ $third = "\n3人目の方の情報----------------------------------------------\n"; $third =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; &jcode'convert(*third, "jis"); $mailbody .= $third; } if($FORM[$i] eq $onamae4){ $fourth = "\n4人目の方の情報----------------------------------------------\n"; $fourth =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; &jcode'convert(*fourth, "jis"); $mailbody .= $fourth; } $mailbody .= "$FORM[$i] = $FORM{$FORM[$i]}\n"; } }
※エンコードされていない箇所とエンコードされている箇所が混在していた為、文字化けしていたようですので、すべてエンコードされるように変更しました。
※今まで受信したメールには、フォームで入力した人数分の情報とコメントが記載されていたでしょうか?
上記のコードでは届いていなかった可能性があります。
入力されたすべての情報を受信したい場合は、次の記述を使ってください。(※全員の情報送信済みだったり、コメントに質問などが書かれていた場合、話がかみ合わなかったのではないかと思うのですが・・・)
# $mailbody .= "$naiyo_o\n\n"; # この行の前に次の処理を追加して、$mailbodyには変数で代入します。 $naiyo_o = "$naiyo_o\n\n"; $naiyo_o =~ tr/+/ /; $naiyo_o =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; $naiyo_o =~ s/[\r\n]+/\n/g; &jcode'convert(*naiyo_o, "jis"); $mailbody .= $naiyo_o; for ($i = 1; $i < $cnt; $i++) { if($FORM{$FORM[$i]} ne ""){ if($FORM[$i] eq $onamae){ $first = "\n代表\の方の情報----------------------------------------------\n"; $first =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; &jcode'convert(*first, "jis"); $mailbody .= $first; } if($FORM[$i] eq $onamae2){ $second = "\n2人目の方の情報----------------------------------------------\n"; $second =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; &jcode'convert(*second, "jis"); $mailbody .= $second; } if($FORM[$i] eq $onamae3){ $third = "\n3人目の方の情報----------------------------------------------\n"; $third =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; &jcode'convert(*third, "jis"); $mailbody .= $third; } if($FORM[$i] eq $onamae4){ $fourth = "\n4人目の方の情報----------------------------------------------\n"; $fourth =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; &jcode'convert(*fourth, "jis"); $mailbody .= $fourth; } # 項目名の比較の為にエンコードします。※お名前~お名前4についても、項目名が固定で変更予定がないのでしたら、+記号の変換と改行コードの変換の行は削除するかコメントアウトしても大丈夫です。 $comment = 'コメント'; $comment =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; &jcode'convert(*comment, "jis"); if($FORM[$i] eq $comment){ $comment = "\nコメント(ご質問・ご連絡など)-------------------------------\n"; $comment =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; &jcode'convert(*comment, "jis"); $mailbody .= $comment; } $mailbody .= "$FORM[$i] = $FORM{$FORM[$i]}\n"; } }
※コメントでの質問ですが、カスタマイズしている箇所がバージョンアップの変更点に影響している場合、コピー&ペーストしただけでは動かない可能性もあります。
修正前にも、コメントも送信メールに含まれていたのですね。良かったです。
hiddenやメールに記載しない項目の分だけループの回数を少なくしているようですので、おそらく動作に問題はないと思います。
下のコードは、代表者、2人目...の参加者のようにコメントにも区切り文字を出力するように変更してあります。良かったら「for ($i = 1; $i < $cnt; $i++) {」を「for ($i = 1; $i < $cnt-3; $i++) {」に変更して使ってみてください。
ポイントとベストアンサーありがとうございました。
ご丁寧にコメントありがとうございます。
いただいたコードも試してみます。
また機会がございましたら、よろしくお願いいたします。
修正前にも、コメントも送信メールに含まれていたのですね。良かったです。
2013/02/02 21:09:26hiddenやメールに記載しない項目の分だけループの回数を少なくしているようですので、おそらく動作に問題はないと思います。
下のコードは、代表者、2人目...の参加者のようにコメントにも区切り文字を出力するように変更してあります。良かったら「for ($i = 1; $i < $cnt; $i++) {」を「for ($i = 1; $i < $cnt-3; $i++) {」に変更して使ってみてください。
ポイントとベストアンサーありがとうございました。
ご丁寧にコメントありがとうございます。
2013/02/03 16:33:49いただいたコードも試してみます。
また機会がございましたら、よろしくお願いいたします。