CGIの質問です。いちばん下の「この質問・回答へのコメント」に記載の内容は誕生日を登録したユーザーに誕生日の前月にメール配信するCGIの一部です。

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

回答の条件
  • 1人2回まで
  • 登録:2008/02/28 15:50:26
  • 終了:2008/03/06 03:13:29

ベストアンサー

id:blueberrystream No.2

KID the Euforia回答回数34ベストアンサー獲得回数52008/03/02 22:13:19

ポイント500pt

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


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

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


その他の回答(1件)

id:blueberrystream No.1

KID the Euforia回答回数34ベストアンサー獲得回数52008/02/28 16:46:45

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

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');
}

id:icta

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

2008/03/01 10:09:18
id:blueberrystream No.2

KID the Euforia回答回数34ベストアンサー獲得回数52008/03/02 22:13:19ここでベストアンサー

ポイント500pt

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


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

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


  • id:icta
    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");
    &jis("Subject: $mailtitle"); print MAIL "$msg\n";
    print MAIL "To: $email\n";
    print MAIL "From: $myaddress\n";
    print MAIL "\n";
    $message = <<END_OF_MESSAGE;
    $email様

    $mailtext

    END_OF_MESSAGE
    &jcode'convert(*message,'sjis');
    print MAIL "$message";
    close(MAIL);

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

    }

    sub sub3{
    open(MAIL,"|$sendmail $myaddress");
    &jis("Subject: 来月に誕生日を迎える方の誕生日処理が正常に終わりました"); print MAIL "$msg\n";
    print MAIL "To: $myaddress\n";
    print MAIL "From: $myaddress\n";
    print MAIL "\n";
    $message = <<END_OF_MESSAGE;
    来月に誕生日を迎える方の誕生日処理が正常に終わりました

    【送信日】
    $tday2

    【メール送信先】
    $tosendall

    【メール文】
    $mailtext
    END_OF_MESSAGE
    &jcode'convert(*message,'sjis');
    print MAIL "$message";
    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'); }

  • id:tezcello
    前質問とのスクリプトの違いは、
    ・データファイル名
    ・データファイル内のデータ書式の違いによる処理
    ・メールを送る条件(とそれによるメール内容)

    だと思います。
    なので、前質問の回答でうまくいっているのなら、
    「基本的には」 tukihatuさんのスクリプトの
    sub jis{} (現状の sub jis{} は削除)
    sub base64{}
    を追加、
    print MAIL "\n";
    の前に
    print MAIL "Content-Type: text/plain; charset=iso-2022-jp\n";
    print MAIL "Content-Transfer-Encoding: 7bit\n";
    を追加と、
    sub2{}, sub3{} の終り付近にある
    &jcode'convert(*message,'sjis');

    &jcode'convert(*message,'jis');
    または
    &jcode'sjis2jis(*message);
    に変更すればOKでしょう。

    「基本的には」なのは、宛先や差出人も本来はエンコードしなくてはいけませんし
    (必要があればですが。今回のblueberrystream さんの回答は処理されていますね)
    1行の文字数も75byteで折り返す方が望ましいようですし...

    スクリプトの作成者=質問者さんではないのかも知れませんが、
    引数として、宛先、差出人、件名、本文を渡したらメールを送信してくれるサブルーチンを作って
    引数をセット(お誕生日メール用)
    サブルーチンの呼び出し
    引数のセット(処理完了の報告メール用)
    サブルーチンの呼び出し
    とした方がメンテナンスし易かったろうと思いました。
  • id:icta
    tezcelloさん、回答ありがとうございます。
    ご指摘の場所を修正してみましたが、期待通りの結果は得られませんでした。
    ただユーザーに届くメールの本文のみは文字化けしていませんでしたので、これがおっしゃている”「基本的には」なのは、宛先や差出人も本来はエンコードしなくてはいけませんし”ということなのでしょうか?

    ○ユーザーに届くメール
     差出人:User
     件名:なし
     内容:文字化けなし 

    > スクリプトの作成者=質問者さんではないのかも知れませんが、

    もちろん私はスクリプトの製作者ではありません。これはフリーのCGIです。
    正直なところ文字化けしないようにすることがこんなにも難しいものだとは知りませんでした。
    道理で私の知識程度では何をやってもできないはずです。

    文字化けしているのはごく少数のユーザですので、その少数のためにこれ以上時間をかけるのは無駄なような気がしてきました。

  • id:tezcello
    あぁ、ごめんなさい。チャンとソースを読んでいませんでした。
    (でも、このソースはなんだかとても読み難いんです...最近perlを離れていたせいかも。PHPじゃだめですか?)
    件名が無いのは、メールヘッダの"Subject: "の部分もエンコードしているせいだとおもいます。
    &jis("Subject: $mailtitle"); print MAIL "$msg\n";
    の部分を
    &jis($mailtitle); print MAIL "Subject: $msg\n";
    のように変更して下さい。


    宛先や差出人にも日本語部分が存在するなら、エンコードは必要です。
    ですが、 tukihatuさんのスクリプトのではうまく変換出来ないかも知れません。
    元々このスクリプトも、それらには日本語が無い事を想定して記述されているように思います。
    ところで、$email, $myaddress の値って、@をエスケープしたものが入っているように見えるんですけどホントですか?(不要のはずですけど)

    > もちろん私はスクリプトの製作者ではありません。これはフリーのCGIです。
    この作者には申し訳ないですが、あまりデキのいいスクリプトだとは言えないようです。
    エンコード処理が不完全で、RFCにも準拠していないようです。

    > 正直なところ文字化けしないようにすることがこんなにも難しいものだとは知りませんでした。
    文字化けそのものはコードの指示の仕方が悪い為でしょうから結構単純です。
    問題は、RFCに準拠しないメールを作ってしまっている点でしょうね。

    > 文字化けしているのはごく少数のユーザ
    文字化けするのが、本来の動きなんです。(なにせRFC違反なのですから)
    文字化けしないのは、読み出しに使っているメーラが気を利かせてくれているからです。
    (ひょっとすると、文字化けしていないのは携帯もでしょうか?)

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません