フリーCGIで、なんとか、メール送信まで成功したのですが、
一部の文字に文字化けが発生しました。「~」「(株)」などです。
文字化けを確認したのは、アウトルックエクスプレスとサンダーバードです。
が、他のメールクライアントでも文字化けはしていると思います。
1.チルダ(全角)等の文字化け("~ ∥ - ¢ £ ¬ ")
2.機種依存文字が含まれていた場合の対応
CGIに関してはまったくの素人ですので、
専門用語はわからないのですが、
解決方法をご教授いただけると幸いです。
下記が実際に使用している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/</</g;
$input{$id} =~ s/>/>/g;
$input{$id} =~ s/>/>/g;
$input{$id} =~ s/"/"/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/&/&/g;
$input{$id} =~ s/</</g;
$input{$id} =~ s/>/>/g;
$input{$id} =~ s/>/>/g;
$input{$id} =~ s/"/"/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); }
No.2ベストアンサー
- 回答日時:
メール本文は、iso-2022-jpでなければなりません。
ヘッダー内に
日本語などを含む場合は、Base64エンコードをします。
一行の文字数は、 75バイト以内です。
他にも沢山、mailに対しては規定があります。これを守らないと・・
この回答への補足
ORUKA1951さん
ご回答ありがとうございます。
ORUKA1951さんがおっしゃられたとおり、下記のように設定しました。
<form name="form1" method="post" action="mail.cgi" accept-charset="iso-2022-jp">
また、Base64エンコードはよくわかりませんが、
「mimew.pl」に下記のようにコメントがありましたので、
デフォルトで設定されているようです。
データをBase64形式またはQuoted-Printable形式でエンコードする。
# 第2パラメータに"qp"または"b64"を指定することによりコーディング形式
# を指示することができる。第2パラメータを省略するとBase64形式でエン
# コードする。
しかし、上記の設定にすると、今度は日本語全般が文字化けになりました。
サイトはUTF-8で作成しているので、その辺りは変更しないでいきたいのですが、何か良い方法はないでしょうか。
返答が遅れ申し訳ございません。
いろいろご教授いただき、ありがとうございます。
今回は解決までには至りませんでした。
ORUKA1951さんには何度もアドバイスいただいたのに、申し訳ございません。また、時間があるときに、いろいろ調べてみます。
ありがとうございました。
No.1
- 回答日時:
外すかもしれません。
その時はごめんなさい。1)CGIの文字コードがShift-JISならばEUCにしてください
特定の文字が文字化けするのはこれが原因な気がしています
2)ヘッダのサブジェクトだけをJISにする理由が謎なのでヘッダを作ってから全部JISにしてみてください
(これが一番怪しいです)
3)HTMLメールのようですが、$bodyの先頭に、Content-Typeの設定は必要ではないですか?
Content-Type: text/html; charset=UTF-8\n\n
http://dqn.sakusakutto.jp/2011/08/content-type-t …
この回答への補足
ありがとうございます。
すみません。上記の内容で一部間違いがありました。
#--- 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, 'jis');
open(SENDMAIL, "|$sendmail -t -oi") || &error("メール送信に失敗しました。");
print SENDMAIL &mimeencode($header);
print SENDMAIL "$body\n";
close(SENDMAIL);
}
このように修正した状態が現在の文字化けの状態です。
>CGIの文字コードがShift-JISならばEUCにしてください
文字コードを変更するのは怖いですが、一度試してみます。
>3)HTMLメールのようですが、$bodyの先頭に、Content-Typeの設定は必要ではないですか?
すみません。記述方法がわからないです(+_+)
返答が遅れ申し訳ございません。
いろいろご教授いただき、ありがとうございます。
今回は解決までには至りませんでした。
折角、アドバイスいただいたのに、申し訳ございません。また、時間があるときに、いろいろ調べてみます。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
心理テストページをCGIで作りた...
-
cgiの改造なんですけど助けてく...
-
チェックボックスの返す値
-
hiddenで送ったデータの取り出し方
-
別formのhidden項目を自form値...
-
select値をhiddenのvalueに渡し...
-
wordの数式について 定積分を書...
-
「value」に2つの値をセットす...
-
SUN BBSの改造方法
-
フォーム入力後の確認画面表示...
-
リストボックス(multipleなsel...
-
VB.net データーグリッドビュー...
-
ローカルテストサーバーと本番...
-
perl/cgi リダイレクトができない
-
ラジオボタンが両方とも選択で...
-
sendmailで送信すると、迷惑メ...
-
画面の改行ピッチを変えたいの...
-
リストボックスで選択してさら...
-
IEでプルダウンメニューをデザイン
-
掲示板(kentさんの所のsunbbs...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
チェックボックスの返す値
-
Error: No Recipient というエ...
-
別formのhidden項目を自form値...
-
CGIでチェックボックスを使...
-
cgiにSSLをつけたい
-
1つのformに2つのsubmitボタン
-
掲示板の文字色指定について
-
アンケートフォームがうまく動...
-
「利用規約の同意」チェックボ...
-
hiddenで送ったデータの取り出し方
-
cgi(サイト内検索?)について。
-
チェックボックスでのvalue値の...
-
VBAでWEBもっと見るを押して...
-
再度:cgiから別のcgiへ...
-
メール送信フォームで。
-
チェックボックスで選択した内...
-
アンケートで質問を複数ページ...
-
CGIに渡しているパラメータを表...
-
テキストエリアのデータを隠し...
-
ボタンの処理
おすすめ情報