こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

CGIの文字化けについて

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;

投稿日時 - 2013-06-05 19:48:25

QNo.8121004

すぐに回答ほしいです

質問者が選んだベストアンサー

メールは、必ずiso-2022jpで送信しましょう。
print MAIL "Content-Type: text/plain; charset=\"iso-2022-jp\"\n";
となっているのに、内容はutf-8に変換してる。

メールにはルールがあります。
・iso-2022jpで本文は送ること
・一行は76文字以下(返信を考えるとさらに少なくすること)で折り返すこと
・ヘッダーに含まれる日本語は、必ずbase64エンコードすること
 以上の対応が一切されていません。

投稿日時 - 2013-06-07 07:57:14

お礼

大変遅くなってしまいましたが、
ご回答頂きありがとうございました!

メールのルールを教えていただき、そのとおりに修正したところ、
文字化けが解消されました!!

その後の処理などで時間がかかってしまいお礼が遅くなってしまいましたが、
本当に助かりました。

テキストやネットで調べてもわからないことがまだまだあるぐらい、
CGIは奥の深いものですね…。

精進します!
改めてありがとうございました!!

投稿日時 - 2013-06-18 19:07:04

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問