アプリ版:「スタンプのみでお礼する」機能のリリースについて

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;

A 回答 (1件)

メールは、必ずiso-2022jpで送信しましょう。


print MAIL "Content-Type: text/plain; charset=\"iso-2022-jp\"\n";
となっているのに、内容はutf-8に変換してる。

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

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

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

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

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

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

お礼日時:2013/06/18 19:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!