CGI-BBS > CGI > Perl > Perlについて送信メールが文字化けするのを防ぎたい。


カレッヂ
カレッヂ


質問者 学問のスルメ  投稿日 2004/1/22(木) 02:25:22
説明しやすいのでスクリプトを先に記述します。

#!/usr/bin/perl


# 送信先メールアドレス
$mailto1 = 'aaa@bbb.net';
# メール送信コマンド
$mailcmd = '/usr/sbin/sendmail';
# ライブラリの呼び出し
require "jcode.pl";
require "mimew.pl";
# 入力値を読み取る
if ($ENV{'REQUEST_METHOD'} eq "POST") {
	read(STDIN, $query_string, $ENV{'CONTENT_LENGTH'});
	@a = split(/&/, $query_string);
	foreach $x (@a) {
		($name, $value) = split(/=/, $x);
		$name =~ tr/+/ /;
		$name =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
		&jcode'convert(*name, "jis");
		$value =~ tr/+/ /;
		$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
		$value =~ s/[\r\n]+/\n/g;
		&jcode'convert(*value, "jis");
		if ($FORM{$name} eq "") {
			$FORM{$name} = $value;
			$FORM[$cnt++] = $name;
		} else {
			$FORM{$name} .= (" " . $value);
		}
	}
}
# 日時の取得と形成
$tm = time;
($sec, $min, $hour, $mday, $mon, $year) = localtime $tm;
$year += 1900;
++$mon;
$ln = "$year\t$mon\t$mday\t";

# メールボディを作成する
@koumoku = ("分類","生徒氏","名","よみ","依頼者","名","よみ","アドレス","確認用","郵便","住所","電話","年齢","学年","理由","先生","科目","処理");

$mailbody .= "■ 登録されました\n";

#ここから問題部分
for ($i = 0; $i < $cnt; $i++) {
$mailbody .= "$koumoku[i] = $FORM{$FORM[$i]}";
}
#ここまで

# サブジェクト(件名)の指定
$subject = '登録情報';

# メールヘッダを作成する
{
	&jcode'convert(*subject, "jis");
	$mailhead = "";
	$mailhead .= "Content-Type: text/plain; charset=\"iso-2022-jp\"\n";
	$mailhead .= "Content-Transfer-Encoding: 7bit\n";
	$mailhead .= "MIME-Version: 1.0\n";
	$mailhead .= "To: $mailto1\n";
	$mailhead .= "From: pro-sensei-net-sendmail-program\n";
	$mailhead .= "Subject: $subject\n";
	$mailhead .= "\n";
}

# メールを送信する
if ($mailcmd =~ /sendmail/) {
	unless (open(OUT, "| $mailcmd -t")) {
		&errexit("メールの送信に失敗しました。(1)");
	}
	unless (print OUT &mimeencode($mailhead)) {
		&errexit("メールの送信に失敗しました。(2)");
	}
	unless (print OUT $mailbody) {
		&errexit("メールの送信に失敗しました。(3)");
	}
	close(OUT);
} else {
	&errexit("メール送信コマンド $mailcmd が存在しません。");
}
# 送信終了
#=====================================================================
# ブラウザ画面に送信結果を書き出す
正常、たぶん関係なし、省略します
# エラーメッセージを出力して終了
正常、たぶん関係なし、省略します

「以下、問題説明」
上記のコードを使ってメールを送信したのですが。
上記にある
#ここから問題部分
for ($i = 0; $i < $cnt; $i++) {
$mailbody .= "$koumoku[i] = $FORM{$FORM[$i]}";
}
#ここまで
ここ部分のの処理の指定が
$mailbody .= "$FORM{$FORM[$i]}";
だと正常なメールが届きます。また
$mailbody .= "$koumoku[$i]";
でも正常なメールが届きます。しかし上記のように
$mailbody .= "$koumoku[i] = $FORM{$FORM[$i]}";
だと、ある部分から文字化けしてしまいます。また
$mailbody .= "$koumoku[i] $koumoku[i]";
では正常でしたが。
$mailbody .= "$FORM{$FORM[$i]} $FORM{$FORM[$i]}";
だと同じように文字化けしてしまいました。
$mailbody .= "あいうえお $FORM{$FORM[$i]}";
でもある部分から文字化けしました
ためしに先に
$a[$i] = $FORM{$FORM[$i]}";
などと他の配列に置き換えて、処理してみても結果は同じでした。
どうやらフォームから取得した内容を処理した
配列$FORM{$FORM[$i]}に何か他の文字列をくっつけようとすると
どこからか文字化けしてしまうようです。
最初のほうの要素は文字化けしていないのでますますわかりません。
かなりいろいろ試しましたが原因が全くわからず困っています。
よろしくご指導願います。
(サーバーにも問い合わせましたが、異常はないということです。)


プロバイダ参照:http://www.neo-serve.net/
サーバのOS:不明
パソコンのOS:Win95系
エディタ:peggy pad
FTPソフト:ffftp
サーバ移転:していない
改造:していない 改造前正常動作
CGI習熟度:advanced

質問者 学問のスルメ  [削除]  投稿日 2004/1/22(木) 02:28:21
すみません、説明部分に「$」が抜けているところがありますが、
説明時の誤植です。スクリプトにはそのようなミスはありません。
よろしくお願いします。
質問者 学問のスルメ  [削除]  投稿日 2004/1/22(木) 02:59:12
お騒がせしました。
文字コード選択を間違っていたようです。
文字コード変換部分のjisをsjisに変更したらバッチリでした。
ご迷惑おかけしました

このページは終了したので返信(回答)は書きこめません
 


Web裏技