プロが教えるわが家の防犯対策術!

以前自社で使われていたフリーのCGIをそのままサイトのリニューアルで使用しているのですが、UTF-8でサイトを作成すると、CGIフォームの文字化けが発生して、いろいろ調べた結果、下記のコードで、解決しました。

しかし・・・・・。まさかの「Outlook Express」文字化けが発生しておりました・・・。
私のPCはwindows8のため、確認ができず本当に困っています…
コードは下記になるのですが、「Outlook Express」に対応させることは可能でしょうか?
上司のPCに「Outlook Express」が入っているため、確認は最小限に抑えなければいけません(汗)

ちなみにCGIは全くの素人です。すみません・・・

use Jcode;
require './mimew.pl';
require './cgi-lib.pl';
$sendmail = '/usr/sbin/sendmail';

# Main処理
$mustflag = 0;
$csvflag = 0;
$body = "";
$addr = $ENV{'REMOTE_ADDR'};
$host = $ENV{'REMOTE_HOST'};
if ($host eq "" || $host eq $addr) {
$host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2) || $addr;
}

my %input;
&ReadParse(\%input);
@names = keys %input;
@names = sort @names;


$config = $input{'config'};
require $config;

if ($must ne '') {
$mustflag = 1;
@mustitem = split(/,/, $must);
}
&readData;
if ($input{'action'} eq 'kakunin') {
&kakunin;
} elsif ($input{'action'} eq 'send') {
if ($csvname ne '') {
$csvflag = 1;
}
&crecsv;
&sendMail;
print "Location: $thanksURL\n\n";
exit;
}

#--- Read Data ---
sub readData {
$hidden = "";
foreach $id(@names) {
if (($id ne 'config') and ($id ne 'hidden') and ($id ne 'action') and ($id ne 'submit')) {
if ($mustflag) {
foreach $mt(@mustitem) {
if (($id eq $mt) and ($input{$id} eq '')) {
print "Location: $errorURL\n\n";
exit;
}
}
}
$input{$id} =~ s/\x0D\x0A/\n/g;
$input{$id} =~ s/\x0D/\n/g;
$input{$id} =~ s/\x0A/\n/g;
$input{$id} =~ s/\0/ /g;
if ($input{'action'} eq 'kakunin') {
$input{$id} =~ s/&/&/g;
$input{$id} =~ s/</&lt;/g;
$input{$id} =~ s/>/&gt;/g;
$input{$id} =~ s/>/&gt;/g;
$input{$id} =~ s/"/&quot;/g; #"
$hidden .= "<input type=\"hidden\" name=\"$id\" value=\"$input{$id}\">\n";
$input{$id} =~ s/\n/<br>/g;
} elsif ($input{'action'} eq 'send') {
$input{$id} =~ s/&amp;/&/g;
$input{$id} =~ s/&lt;/</g;
$input{$id} =~ s/&gt;/>/g;
$input{$id} =~ s/&gt;/>/g;
$input{$id} =~ s/&quot;/"/g; #"
push (@data, $input{$id});
$body .= "[$id]\n$input{$id}\n";
}
}
}
}

#--- Confirm Data ---
sub kakunin {
if (open(IN, $kakunin)){
local $/ = undef;
$src = <IN>;
close(IN);
} else{
&error("$kakuninがありません。");
}

print "Content-type: text/html\n\n";
foreach $item(@names) {
$str = "<!--%%".$item."%%-->";
$src =~ s/$str/$input{$item}/;
}

$hidden .= "<input type=\"hidden\" name=\"config\" value=\"$input{'config'}\">\n";
$src =~ s/<!--%%hidden%%-->/$hidden/;
print "$src\n";

}

#--- Create CSV File ---
sub crecsv{
push (@data, $host);
push (@data, $addr);
if ($csvflag) {
$flock = 'lock/'.$csvname;
&filelock;
$line = join ',', map {(s/"/""/g or /[\r\n,]/) ? qq("$_") : $_} @data; #"
open(FH, ">>$csvname") || &error("can't open $csvname:$!");
print FH $line, "\n";
close(FH);
rmdir($flock);
}
}


#--- send mail ---
sub sendMail{
$body .= "[host]\n$host\n";
$body .= "[IP Address]\n$addr\n";
Jcode::convert(\$subject, 'jis');
$header .= "To: $mailto\n";
$header .= "Cc: $mailcc\n";
$header .= "Bcc: $mailbcc\n";
$header .= "From: $mailfrom\n";
$header .= "Subject: $subject\n\n";

Jcode::convert(\$body, 'utf8');

open(SENDMAIL, "|$sendmail -t -oi") || &error("メール送信に失敗しました。");
print SENDMAIL &mimeencode($header);
print SENDMAIL "$body\n";
close(SENDMAIL);
}

#--- Error ---
sub error{
print "Content-type: text/html\n\n";
local($msg) = @_;
print &HtmlTop("error");
print $msg;
print &HtmlBot();
exit(0);
}

#--- File Lock ---
sub filelock {
$SIG{'PIPE'} = $SIG{'INT'} = $SIG{'HUP'} = $SIG{'QUIT'} = $SIG{'TERM'} = "sigexit";
for ($i = 0; $i < 6; $i++) {
if (mkdir("$flock", 0755)) {
last;
} elsif ($i == 1) {
($mtime) = (stat($flock))[9];
if ($mtime < time() - 600) {
rmdir($flock);
}
} elsif ($i < 6) {
sleep(1);
} else {
&error("File Lock Error");
}
}
}
sub sigexit { rmdir($flock); exit(0); }

A 回答 (2件)

さらっと見ただけなので外しているかもしれませんが...


受信したメールの本文が文字化けしているということでよろしいでしょうか。

sendMailサブルーチンでbodyをUTF-8にしているのは理由があるのでしょうか?
これをjisにしてみたらどうなるでしょうか。
    • good
    • 0
この回答へのお礼

lowrider_2005さん
ご回答ありがとうございます。
無事解決いたしました!
ありがとうございます(T_T)
UTF-8にしていたのは、サイトをUTF-8で作成していたからです。しかし、$subjectだけが、UTF-8にすると文字化けが発生したので、jisとしておりました。
bodyは文字化けしなかったので、UTF-8で合っていると思い込んでいました。
本当にたすかりました。
一発確認でなんとかなりました(^^)
ありがとうございました。

お礼日時:2013/04/10 13:17

メールは必ずiso-2022-jpにして送信します。


一行の文字数も規定があります。
また、ヘッダ部分はBASE64エンコードしなければなりません。

なお送信フォームの文字コードは(処理できるようにしてあれば)CGI側で処理できますから問題ないですし、FORMのaccept-charset属性で文字コードを指定しておけば良いです。
<form action="./" accept-charset="iso-2022-jp" metod="post">
    • good
    • 0
この回答へのお礼

ORUKA1951さん。
ご回答ありがとうございます!
無事解決いたしました。
Jcode::convert(\$body, 'jis');にすることで、
文字化けを防ぐことができました。
もしこれで、また何か問題が発生したときは
ORUKA1951さんの方法を試させて頂きます!
ご丁寧なご回答、ありがとうございました。

お礼日時:2013/04/10 13:20

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