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で質問しましょう!
似たような質問が見つかりました
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
- Ruby パイソンプログラミング 2 2022/12/03 18:44
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
結果を得て自動的にページ移動...
-
my $html<<EOMの意味を教えてく...
-
ランダムに背景画像を変える方法。
-
テキストエリアにテキストファ...
-
UTF8 URLエンコード
-
Application.ScreenUpdating = ...
-
JSONで文字列が長い時
-
formで特定のinputを送信しない...
-
<SELECT>タグの折り返し
-
16進の10進変換について
-
実行時エラー 3020の対策
-
文字の横にプルダウンを表示さ...
-
デ-タテ-ブルの内容での更新...
-
セレクトメニューで2つの項目...
-
数値英単語変換
-
セレクトボックスのselected属...
-
複数列を持ったリストボックス...
-
selectタグ内の特定のoptionの...
-
【メモリ不足で落ちる(python)】
-
STLのlistで重複するものだけを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
malformed header from script....
-
結果を得て自動的にページ移動...
-
Perl CGIの中で # を使ってコメ...
-
my $html<<EOMの意味を教えてく...
-
テキストファイルの読み込み
-
どうしてもCookieとCGI・perlの...
-
パソコン → パャRン
-
Perlでの数字の12桁化
-
shift-jisからutf8に変換
-
サムネイルCGI
-
SSI にグローバル変数を渡すこ...
-
CGIから出力される文字が化けて...
-
cgiでのデータ受信
-
Application.ScreenUpdating = ...
-
JSONで文字列が長い時
-
どちのほうがすきですか?
-
formで特定のinputを送信しない...
-
文字の横にプルダウンを表示さ...
-
16進の10進変換について
-
実行時エラー 3020の対策
おすすめ情報