人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

CGIの質問です。いちばん下の「この質問・回答へのコメント」に記載の内容は誕生日を登録したユーザーに誕生日の前月にメール配信するCGIの一部です。
一部の方から配信されるメールが文字化けして見えないとの指摘があります。
Hotmailユーザーは必ず文字化けするようです。
CGIの知識が浅いため、解決方法そのものを教えていただければうれしいです。
そのまま置き換えるだけで使える完全なコードを回答していただいた回答者の方には500ポイントを差し上げます。よろしくお願いいたします。
なおこの質問はhttp://q.hatena.ne.jp/1204044433の派生質問です。
CGIの内容は上記とは異なるものですが、製作者は同じですので内容が似通っています。
こちらで回答していただいた内容を参考にしてコードの修正を試みましたが、エラーが頻発して一歩も先に進めず、新たに質問するに至った次第です。


●質問者: icta
●カテゴリ:インターネット ウェブ制作
✍キーワード:CGI Hotmail エラー コメント コード
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● KID the Euforia
●0ポイント

このコードでいかがでしょうか?動かなかったら申し訳ありません。

require './jcode.pl';
require './conf/conf.pl';
#########################################################
$datefile = "monthdate.txt";
$mailcontents = 'birthmonth.txt';
#########################################################


($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time + ($timediff * 60 * 60));
$mon++;
#if ($mon < 10) { $mon = "0$mon"; }
#if ($mday < 10) { $mday = "0$mday"; }
$tday = "$mon/$mday";
$tday2 = "$mon月$mday日";

open (DATA,"$datefile");
$setday = <DATA>;
($mondata,$daydata,) = split(/\,/,$setday);
$day= "$mondata/$daydata";
close (DATA);

if ($day eq "$tday") {
 open (DATA, ">$datefile");
 flock(DATA, 2);
 $mondata++;
 if ($mondata eq "13") {
 $mondata = 1;
 }
 $regday = "$mondata\,$daydata\,";
 print DATA $regday;
 close (DATA);
 flock(DATA, 8);
 &sub1;
}

print "Content-type: image/gif\n\nGIF89a\1\0\1\0\200\0\0\0\0\0\0\0\0!\371\4\1\0\0\0\0,\0\0\0\0\1\0\1\0\0\2\2D\1\0\n";

exit;


sub sub1{
 open(DF, "$mailcontents");
 @DATAM = <DF>;
 close(DF);
 foreach $linem (@DATAM) {
 $mailtext = "$mailtext$linem";
 }
 open (DB, "$database");
 @DATA = <DB>;
 close(DB);
 foreach $line (@DATA) {
 ($name, $email, $birth1, $birth2,) = split(/\,/,$line);
 if ($mondata eq "$birth1") { 
 &mailcheck;
 if ($errorh eq "0") {
 &sub2;
 }
 }
 }
 &sub3;
}

sub sub2{
 open(MAIL, "|$sendmail $email");
# print MAIL "To: $email\n";
 # いちおうToヘッダもJISでエンコードしておく
 &jis("To: $email");
 print MAIL "$msg\n";
# print MAIL "From: $myaddress\n";
 # いちおうFromヘッダもJISでエンコードしておく
 &jis("From: $myaddress");
 print MAIL "$msg\n";
 # SubjectヘッダをJISエンコード
 &jis("Subject: $mailtitle");
 print MAIL "$msg\n";
 # Content-typeヘッダを打つ
 print MAIL "Content-type: text/plain;charset=\"ISO-2022-JP\"\n"; 
 print MAIL "\n";
 $message = <<END_OF_MESSAGE;
$email様 

$mailtext

END_OF_MESSAGE
# &jcode'convert(*message, 'sjis');
# print MAIL "$message";
 # メール本文をJISでエンコード
 &jis($message);
 print MAIL "$msg";
 close(MAIL);

 $tosendall="$tosendall$name,$email,誕生日:$birth1/$birth2\n";
}

sub sub3{
 open(MAIL, "|$sendmail $myaddress");
# print MAIL "To: $myaddress\n";
 # いちおうToヘッダもJISでエンコードしておく
 &jis("To: $myaddress");
 print MAIL "$msg\n";
# print MAIL "From: $myaddress\n";
 # いちおうFromヘッダもJISでエンコードしておく
 &jis("From: $myaddress");
 print MAIL "$msg\n";
 # SubjectヘッダをJISでエンコード
 &jis("Subject: 来月に誕生日を迎える方の誕生日処理が正常に終わりました");
 print MAIL "$msg\n";
 # Content-typeヘッダを打つ
 print MAIL "Content-type: text/plain;charset=\"ISO-2022-JP\"\n"; 
 print MAIL "\n";
 $message = << END_OF_MESSAGE;
来月に誕生日を迎える方の誕生日処理が正常に終わりました

【送信日】
$tday2

【メール送信先】
$tosendall

【メール文】
$mailtext
END_OF_MESSAGE
# &jcode'convert(*message,'sjis');
# print MAIL "$message";
 # メール本文をJISでエンコード
 &jis($message);
 print MAIL "$msg";
 close(MAIL);
}

sub mailcheck{
 $errorh = "0";
 $xx =$email;
 &transmail;
 $email = $xx;
 @email2 = split(/\@/, $email);
 @email3 = split(/\./, @email2[1]);
 unless ($email =~ /.+\@.+\..+/) {
 $errorh = "1";
 }
 if ($email =~ /[^a-zA-Z0-9_\@\.\-]/) {
 $errorh = "1";
 }
 if ($email =~ /[^a-zA-Z]$/) {
 $errorh = "1";
 }
 if (@email3[0] eq "") {
 $errorh = "1";
 }
 if (@email3[1] eq "") {
 $errorh = "1";
 }
 if (@email3[4] ne "") {
 $errorh = "1";
 }
 if (@email3[2] ne "") {
 if(@email3[2] =~ /[^a-zA-Z]/) {
 $errorh = "1";
 }
 }
 if (@email3[3] ne "") {
 if (@email3[3] =~ /[^a-zA-Z]/) {
 $errorh = "1";
 }
 }
 if ($email eq "") {
 $errorh = "1";
 }
}

sub transmail{
 $from = '[@01-9A-Za-z._?]';
 $to = '[@01-9A-Za-z._-]';
 &jcode'convert(*xx, 'euc');
 &jcode'convert(*from, 'euc');
 &jcode'convert(*to, 'euc');
 &jcode'tr(*xx, $from, $to);
 &jcode'convert(*xx, 'sjis');
}

sub jis{
 $msg = $_[0];
 &jcode'convert(*msg, 'jis');
}

◎質問者からの返答

blueberrystreamさん回答ありがとうございます。

教えていただいたコードに早速置き換えてみました。

結果は残念ながら文字化けは修正されませんでした。

それどころかユーザにメールが送られなくなりました。

管理者に届くメールも以前は文字化けされなかった件名が空白になり、送信者にメールアドレスが入らなくなってしまいました。

メール本文にも意味のない英数字の羅列が並んでいます。

どこに問題があるのか原因がよくわかりません。

どこを修正すればよいか教えていただけませんでしょうか?

◆修正前

○ユーザーに届くメール

差出人:xxxxxx\@hotmail.com

件名:お誕生日おめでとうございます

内容:文字化け

○管理者に届くメール

差出人:xxxxxx\@zzzzz.net

件名:来月に誕生日を迎える方の誕生日処理が正常に終わりました

内容:文字化けなし

◆修正後

○ユーザーに届くメール

届かない

○管理者に届くメール

差出人:User

件名:なし

内容:英数字の羅列

=?iso-2022-jp?B?U3ViamVjdDogGyRCTWg3biRLQ0JAOEZ8JHI3XiQoJGtKfSROQ0JAOEZ8PWhNfSQsQDU+byRLPSokbyRqJF4kNyQ/GyhC?=

To: xxxxxx\@zzzzz.net

From: xxxxxx\@zzzzz.net

Subject: =?iso-2022-jp?B?MhskQjduGyhCMjgbJEJGfCROQ0JAOEZ8PWhNfTQwTjsbKEI=?=

Content-Type: text/plain; charset=iso-2022-jp

Content-Transfer-Encoding: 7bit


2 ● KID the Euforia
●500ポイント ベストアンサー

1の回答をしたものです。1のコードが予期した動作にならなかったようで申し訳ありません。

よく見たら単純ミスをしているところがありました。

また、JISエンコードだけでは不十分な場合があるようなので、JISエンコードに加えて

MIMEエンコードをするようにしました。

require './jcode.pl';
require './mimew.pl';
require './conf/conf.pl';
#########################################################
$datefile = "monthdate.txt";
$mailcontents = 'birthmonth.txt';
#########################################################


($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time + ($timediff * 60 * 60));
$mon++;
#if ($mon < 10) { $mon = "0$mon"; }
#if ($mday < 10) { $mday = "0$mday"; }
$tday = "$mon/$mday";
$tday2 = "$mon月$mday日";

open(DATA, "$datefile");
$setday = <DATA>;
($mondata, $daydata,) = split(/\,/, $setday);
$day= "$mondata/$daydata";
close(DATA);

if ($day eq "$tday") {
 open (DATA, ">$datefile");
 flock(DATA, 2);
 $mondata++;
 if ($mondata eq "13") {
 $mondata = 1;
 }
 $regday = "$mondata\,$daydata\,";
 print DATA $regday;
 close(DATA);
 flock(DATA, 8);
 &sub1;
}

print "Content-type: image/gif\n\nGIF89a\1\0\1\0\200\0\0\0\0\0\0\0\0!\371\4\1\0\0\0\0,\0\0\0\0\1\0\1\0\0\2\2D\1\0\n";

exit;


sub sub1{
 open(DF, "$mailcontents");
 @DATAM = <DF>;
 close(DF);
 foreach $linem (@DATAM) {
 $mailtext = "$mailtext$linem";
 }
 open(DB, "$database");
 @DATA = <DB>;
 close(DB);
 foreach $line (@DATA) {
 ($name, $email, $birth1, $birth2,) = split(/\,/, $line);
 if ($mondata eq "$birth1") {
 &mailcheck;
 if ($errorh eq "0") {
 &sub2;
 }
 }
 }
 &sub3;
}

sub sub2{
 open(MAIL, "|$sendmail $email");
# print MAIL "To: $email\n";
 # Toヘッダの中身をJISでエンコード→MIMEエンコード
 &jis($email);
 $msg = mimeencode($msg);
 print MAIL "To: $msg\n";
# print MAIL "From: $myaddress\n";
 # Fromヘッダの中身をJISでエンコード→MIMEエンコード
 &jis($myaddress);
 $msg = mimeencode($msg);
 print MAIL "From: $msg\n";
 # Subjectヘッダの中身をJISエンコード→MIMEエンコード
 &jis($mailtitle);
 $msg = mimeencode($msg);
 print MAIL "Subject: $msg\n";
 # Content-typeヘッダとContent-Transfer-Encodingヘッダを打つ
 print MAIL "Content-type: text/plain;charset=\"ISO-2022-JP\"\n";
 print MAIL "Content-Transfer-Encoding: 7bit\n";
 print MAIL "\n";
 $message = <<END_OF_MESSAGE;
$email様

$mailtext

END_OF_MESSAGE
# &jcode'convert(*message, 'sjis');
# print MAIL "$message";
 # メール本文をJISでエンコード
 &jis($message);
 print MAIL "$msg\n";
 close(MAIL);

 $tosendall = "$tosendall$name,$email,誕生日:$birth1/$birth2\n";
}

sub sub3{
 open(MAIL, "|$sendmail $myaddress");
# print MAIL "To: $myaddress\n";
 # Toヘッダの中身をJISでエンコード→MIMEエンコード
 &jis($myaddress);
 $msg = mimeencode($msg);
 print MAIL "To: $msg\n";
# print MAIL "From: $myaddress\n";
 # Fromヘッダの中身をJISでエンコード→MIMEエンコード
 #&jis($myaddress); # 104行目で同じことをしている
 #$msg = mimeencode($msg); # 105行目で同じことをしている
 print MAIL "From: $msg\n";
 # Subjectヘッダの中身をJISでエンコード→MIMEエンコード
 &jis("来月に誕生日を迎える方の誕生日処理が正常に終わりました");
 $msg = mimeencode($msg);
 print MAIL "Subject: $msg\n";
 # Content-typeヘッダを打つ
 # Content-typeヘッダとContent-Transfer-Encodingヘッダを打つ
 print MAIL "Content-type: text/plain;charset=\"ISO-2022-JP\"\n";
 print MAIL "Content-Transfer-Encoding: 7bit\n";
 $message = <<END_OF_MESSAGE;
来月に誕生日を迎える方の誕生日処理が正常に終わりました

【送信日】
$tday2

【メール送信先】
$tosendall

【メール文】
$mailtext
END_OF_MESSAGE
# &jcode'convert(*message,'sjis');
# print MAIL "$message";
 # メール本文をJISでエンコード
 &jis($message);
 print MAIL "$msg";
 close(MAIL);
}

sub mailcheck{
 $errorh = "0";
 $xx =$email;
 &transmail;
 $email = $xx;
 @email2 = split(/\@/, $email);
 @email3 = split(/\./, @email2[1]);
 unless ($email =~ /.+\@.+\..+/) {
 $errorh = "1";
 }
 if ($email =~ /[^a-zA-Z0-9_\@\.\-]/) {
 $errorh = "1";
 }
 if ($email =~ /[^a-zA-Z]$/) {
 $errorh = "1";
 }
 if (@email3[0] eq "") {
 $errorh = "1";
 }
 if (@email3[1] eq "") {
 $errorh = "1";
 }
 if (@email3[4] ne "") {
 $errorh = "1";
 }
 if (@email3[2] ne "") {
 if(@email3[2] =~ /[^a-zA-Z]/) {
 $errorh = "1";
 }
 }
 if (@email3[3] ne "") {
 if (@email3[3] =~ /[^a-zA-Z]/) {
 $errorh = "1";
 }
 }
 if ($email eq "") {
 $errorh = "1";
 }
}

# メールアドレスに含まれる全角文字を半角文字に変換
sub transmail{
 # 変換元
 $from = '[@01-9A-Za-z._?]';
 # 変換先
 $to = '[@01-9A-Za-z._-]';
 # 変換の際、EUCにしておかないと正常に変換できない
 &jcode'convert(*xx, 'euc');
 &jcode'convert(*from, 'euc');
 &jcode'convert(*to, 'euc');
 # 変換
 &jcode'tr(*xx, $from, $to);
 # Shift-JISに戻している
 &jcode'convert(*xx, 'sjis');
}

# jcode.plでJISエンコードして$msgに格納
sub jis{
 $msg = $_[0];
 &jcode'convert(*msg, 'jis');
}

プログラムを実行する前に、下記URLよりmimew.plを入手して、このスクリプトと

同じディレクトリに配置してください。

http://itbtech.itboost.co.jp/perl/mimew.pl


なお、構文チェックはしていますが、動作チェックはこのスクリプトに関わる

ファイルが揃わないためしておりません。


関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ