※ ChatGPTを利用し、要約された質問です(原文:CGIの文字化けについて)
CGIの文字化けについて
このQ&Aのポイント
CGI初心者ですが、本番用サイトにアップしたメールフォームで自動返信メールが文字化けする問題が発生しています。
本文が文字化けする問題に対して、件名の文字化けは解決済みですが、本文の文字化けが解決できません。
HTMLの文字コードはUTF-8で、CGIもUTF-8Nで保存していますが、文字化けが発生しています。原因がわかる方がいれば教えてください。
CGI初心者ですが、本とネットを調べてメールフォームを作成しています。
テストで作成していた時は何故かうまくいったのですが、
本番用サイトにアップしテストしてみると、自動返信メールが文字化けするようになってしまいました。
送信先は会社側がgmail、お客様側がスマホ(docomo)として自分のスマホに送っていますが、
gmailもスマホも本文のみが文字化けしています。
ネット上でも調べて、件名の文字化けは治すことが出来たのですが、本文がどうしても文字化けしてしまい、治せません。。。
HTMLの文字コードはUTF-8で、CGIもUTF-8Nで保存しています。
ほぼ本を見てそのまま作成し、修正部分だけネットで調べて追記していく、というような感じで
酷い内容のコードになってると思いますが。。
原因がわかる方がいらっしゃいましたら、是非ご教示頂ければと思っています。
また、こんな私に参考になるサイトがあれば教えて頂きたいです。
不明点は出来るだけ補足するつもりです。
宜しくお願いします。
どうかお助け下さい!
-------------------------------------------------
以下がコードです。
#!/usr/local/bin/perl
#setting
require './lib/cgi-lib.pl';
use lib './lib';
use Jcode;
use CGI;
use utf8;
use Encode;
#フォームから入力データ読込
&ReadParse(*in);
$name = "$in{'name'}";
$subject = "$in{'subject'}";
$address = "$in{'address'}";
$at = '@';
$domain ="$in{'domain'}";
#★メール送信先★会社側メールアドレス
$to = 'kaisya@gmail.com';
#★メール送信者名★会社名
$fromname='株式会社かいしゃ';
#★メール送信者表示アドレス★
$from = 'kaisya2@kaisya2.com';
#★メール送信用タイトル★
$fromsubject = 'WEB会員登録のお申込みありがとうございました';
#★メール送信用内容★
$from_msg = <<END_OF_DATA;
WEB会員登録のお申込み、ありがとうございました。
以下のURLへアクセスし、ご登録を進めて下さい。
http://www.kaisya.xxxx
また、このメールに心当たりのない方は、このメールは削除して頂きますようお願い致します。
☆---------------------------------☆
株式会社かいしゃ
HP:http://www.kaisya.xxxx
MAIL:kaisya2@kaisya2.com
TEL:00-9999-9999
FAX:00-9999-8888
☆---------------------------------☆
END_OF_DATA
$nstatus = 0;
$mstatus = 0;
$dstatus = 0;
#process before send
$mailName = Jcode::convert( $name , "utf8", "utf8" );
$mailSubject = Jcode::convert( $subject , "utf8", "utf8" );
$soushin_name = Jcode::convert( $fromname , "utf8", "utf8" );
$from_msg = Jcode::convert( $from_msg , "utf8", "utf8" );
#未入力check
if($address eq "" ){
$nstatus = 1;
}
#mailaddress check
if($address =~ /[^a-z0-9_\-\.]/ ){
$mstatus = 1;
}
#domain check
if($domain =~ /^$/ ){
$dstatus =1;
}
if($nstatus == 1 or $mstatus == 1 or $dstatus == 1){
&mailerror;
}
#mailaddress
$mailaddress = $address . $at .$domain;
#sendmail #会社側にメールを送る
$soushin_name = encode('MIME-Header-ISO_2022_JP', $soushin_name);
open(MAIL, "| /usr/sbin/sendmail -t");
print MAIL "To: $to\n";
print MAIL "From:$soushin_name<$from>\n";
print MAIL "subject: $mailSubject\n";
print MAIL "Content-Type: text/plain; charset=\"iso-2022-jp\"\n\n";
print MAIL "名前: $mailName\n";
print MAIL "e-mail: $mailaddress\n";
close(MAIL);
#sendmail2 #送信者側にメールを送る
open(MAIL, "| /usr/sbin/sendmail -t");
print MAIL "To: $mailaddress\n";
print MAIL "From:$soushin_name<$from>\n";
print MAIL "subject: $mailSubject\n";
print MAIL "Content-Type: text/plain; charset=\"iso-2022-jp\"\n";
print MAIL "Content-Transfer-Encoding: 7bit\n";
print MAIL "MIME-Version: 1.0\n";
print MAIL "{$from_msg}\n";
print MAIL "-------------------------------------\n";
print MAIL "以下の内容で送信されました\n";
print MAIL "名前: $mailName\n";
print MAIL "e-mail: $mailaddress\n";
close(MAIL);
#display
print "Content-type: text/html;charset=utf-8\n\n";
print "<html>\n";
print "<title>send result</title>\n";
print "<h1>send mail</h1><hr />\n";
print "以下のメールを送信しました<br />";
print "Name: $name<br />\n";
print "email: $mailaddress<br />\n";
print "</body></html>\n";
#サブルーチン メールアドレスにエラー
sub mailerror{
print "Content-type: text/html;charset=utf-8\n\n";
print "<html>\n";
print "<title>mailaddress error</title>\n";
print "<body>\n";
print "<h1>send mail</h1><hr />\n";
if($nstatus == 1){
print "メールアドレスが入力されていません。<br />\n";
print "$nstatus<br />\n";
}
if($mstatus == 1){
print "メールアドレスを正しく入力して下さい。<br />\n";
print "$mstatus<br />\n";
}
if($dstatus == 1){
print "ドメインを選択して下さい。<br />\n";
print "$dstatus<br />\n";
}
print "<a href=\"javascript: history.back()\">戻る</a><br />\n";
print "</body></html>\n";
exit;
}
exit;
お礼
大変遅くなってしまいましたが、 ご回答頂きありがとうございました! メールのルールを教えていただき、そのとおりに修正したところ、 文字化けが解消されました!! その後の処理などで時間がかかってしまいお礼が遅くなってしまいましたが、 本当に助かりました。 テキストやネットで調べてもわからないことがまだまだあるぐらい、 CGIは奥の深いものですね…。 精進します! 改めてありがとうございました!!