下記フォームから送られてくるメールをGmailで受け取ると、全て文字化けしてしまいます。

同じメールを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ファイルの文字エンコード

これらの組み合わせだと思うのですが、
問題を解決できません。

どのように修正すれば、文字化けせずに表示されるようになりますでしょうか?
教えていただけると助かります。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/02/02 13:24:32
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:rouge_2008 No.5

回答回数595ベストアンサー獲得回数351

ポイント300pt

「# メールボディを作成する」の処理内(※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";
		}
	}



※コメントでの質問ですが、カスタマイズしている箇所がバージョンアップの変更点に影響している場合、コピー&ペーストしただけでは動かない可能性もあります。

他1件のコメントを見る
id:rouge_2008

修正前にも、コメントも送信メールに含まれていたのですね。良かったです。
hiddenやメールに記載しない項目の分だけループの回数を少なくしているようですので、おそらく動作に問題はないと思います。

下のコードは、代表者、2人目...の参加者のようにコメントにも区切り文字を出力するように変更してあります。良かったら「for ($i = 1; $i < $cnt; $i++) {」を「for ($i = 1; $i < $cnt-3; $i++) {」に変更して使ってみてください。

ポイントとベストアンサーありがとうございました。

2013/02/02 21:09:26
id:nobu55

ご丁寧にコメントありがとうございます。
いただいたコードも試してみます。
また機会がございましたら、よろしくお願いいたします。

2013/02/03 16:33:49

その他の回答4件)

id:pigmon88 No.1

回答回数501ベストアンサー獲得回数25

ポイント30pt

メールにつけるヘッダの文字コード指定は正しいですか?

id:nobu55

メールにつけるヘッダの文字コードとは、どこに入っているのでしょうか?

2013/01/30 16:58:28
id:oil999 No.2

回答回数1728ベストアンサー獲得回数320

ポイント30pt

メール送信を行っているであろう "../../cgi-bin/formmail.cgi" の問題と思われます。
まずは、formタグに下記のようにenctypeを追加してみてください。

<FORM action="../../cgi-bin/formmail.cgi" method="POST" enctype="multipart/form-data">
他1件のコメントを見る
id:oil999

http://tohoho.wakusei.ne.jp/
を見ても formmail.cgi は存在しないようです。

2013/01/30 23:12:14
id:nobu55

ありがとうございます。
確認しておりませんでした。申し訳ありません。
以下にfomacgi.cgiの中身をアップしました。

http://planetscuba.blog5.fc2.com/blog-entry-2001.html

2013/02/01 14:31:36
id:nobu55

質問者から

Tomo2013/01/30 18:18:26

formmail.cgi の文字コードはshift-JIS です。

UTF-8に変更して上書きしてみましたが、文字化けはかわらずでした。

id:pretaroe No.3

回答回数531ベストアンサー獲得回数75

ポイント30pt

メール送信時のエンコードが
ISO-2022-JP あたりでないと文字化けするのかも。
SJISのまま送信すると、文字化けするメーラーがあります。

どういう処理をしてるのか不明ですが、エンコード処理してなければ
受け取ったコードのまま送信してると思います。


formmail.cgiのソースの文字コードは関係ありません。
メール送信のロジックの部分です。


<FORM action="../../cgi-bin/formmail.cgi" method="POST">
これはこのままでよいです。

処理を見直す必要があるのは、formmail.cgiの中身です。


Outlook Express の場合は
メールの本文が、SJISでもISO-2022-JPでも
文字化けしないようになっています。

id:sinrabanshyo No.4

回答回数139ベストアンサー獲得回数17

レンタルサーバー側の文字環境の問題でないでしょうか?

id:rouge_2008 No.5

回答回数595ベストアンサー獲得回数351ここでベストアンサー

ポイント300pt

「# メールボディを作成する」の処理内(※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";
		}
	}



※コメントでの質問ですが、カスタマイズしている箇所がバージョンアップの変更点に影響している場合、コピー&ペーストしただけでは動かない可能性もあります。

他1件のコメントを見る
id:rouge_2008

修正前にも、コメントも送信メールに含まれていたのですね。良かったです。
hiddenやメールに記載しない項目の分だけループの回数を少なくしているようですので、おそらく動作に問題はないと思います。

下のコードは、代表者、2人目...の参加者のようにコメントにも区切り文字を出力するように変更してあります。良かったら「for ($i = 1; $i < $cnt; $i++) {」を「for ($i = 1; $i < $cnt-3; $i++) {」に変更して使ってみてください。

ポイントとベストアンサーありがとうございました。

2013/02/02 21:09:26
id:nobu55

ご丁寧にコメントありがとうございます。
いただいたコードも試してみます。
また機会がございましたら、よろしくお願いいたします。

2013/02/03 16:33:49
  • id:nobu55
    formmail.cgi を見ていただく必要があれば、ネット上で見ていただけるようにしようと思いますが、あまり知識がないのでセキュリティー上問題がないのか不安です。
  • id:rouge_2008
    以前次の質問に回答した時に「formmail.cgi」のソースを頂きましたが、その時点から何か変更していますか?
    http://q.hatena.ne.jp/1242125094

    ※ソースファイルの文字コードを変更しただけでは、送信されるメールの文字コードは適切に処理されませんので元に戻してください。(送信フォームの各ファイル、「formmail.cgi」ともにShift_JISで正しく動作する仕様になっています。)

    ※カスタマイズしていない「WwwMail」の最新バージョンは現在3.28ですが、こちらで確認した所文字化けは確認されませんでした。
    GmailにWEBアクセスして表示した時に文字化けしているのですか?
  • id:nobu55
    rouge_2008様
    ありがとうございます。
    formmail.cgiは何も変更していません。
    メールはGmailに転送しているのですが、WebアクセスしてGmailで見ると文字化けしてしまいます。
  • id:nobu55
    rouge_2008様
    最新バージョンに必要な箇所だけコピペして、現状のformmail.cgiを上書きしたら、フォームはそのまま使えるものでしょうか?

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません