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;
No.1ベストアンサー
- 回答日時:
メールは、必ずiso-2022jpで送信しましょう。
print MAIL "Content-Type: text/plain; charset=\"iso-2022-jp\"\n";
となっているのに、内容はutf-8に変換してる。
メールにはルールがあります。
・iso-2022jpで本文は送ること
・一行は76文字以下(返信を考えるとさらに少なくすること)で折り返すこと
・ヘッダーに含まれる日本語は、必ずbase64エンコードすること
以上の対応が一切されていません。
大変遅くなってしまいましたが、
ご回答頂きありがとうございました!
メールのルールを教えていただき、そのとおりに修正したところ、
文字化けが解消されました!!
その後の処理などで時間がかかってしまいお礼が遅くなってしまいましたが、
本当に助かりました。
テキストやネットで調べてもわからないことがまだまだあるぐらい、
CGIは奥の深いものですね…。
精進します!
改めてありがとうございました!!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CGIのテキストが文字化けし...
-
my $html<<EOMの意味を教えてく...
-
JSONで文字列が長い時
-
Application.ScreenUpdating = ...
-
FindFirst を複数条件で検索
-
テキスト入力後、エンターを押...
-
文字の横にプルダウンを表示さ...
-
formで特定のinputを送信しない...
-
sendmailで複数アドレスに送信...
-
前日の日付取得するには?
-
ACCESS テキストボックスを隙...
-
[python] 文字列を変数名として...
-
メモリをアドレスを直接指定し...
-
メ-ルにno problem@の前にname...
-
VB6で、長い時間かかる処理...
-
実行中の変数の中身をイミディ...
-
【至急!!!】python言語で本を見...
-
セレクトメニューで2つの項目...
-
セレクトメニューで選んだ値を...
-
実行時エラー 3020の対策
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
結果を得て自動的にページ移動...
-
どうしてもCookieとCGI・perlの...
-
CGIにおいて、エンコード・文字...
-
malformed header from script....
-
my $html<<EOMの意味を教えてく...
-
何がいけないんでしょうか?
-
アクセス人数制限CGIについて。
-
Perl CGIの中で # を使ってコメ...
-
ランダムリンク(ランダム表示...
-
CGIから出力される文字が化けて...
-
CGIにてPrintを一気に行う
-
TeraPadでよく使う文字を特定キ...
-
初歩的なCGIですが その2
-
半自作cgiが思うように動作しま...
-
HTMLの代わりに「SCALAR(・・・...
-
出来ているHTMLに無料CGIをつけ...
-
FLASHとCGIでのデータの受け渡...
-
shift-jisからutf8に変換
-
SSI にグローバル変数を渡すこ...
-
Perlでの数字の12桁化
おすすめ情報