
フリーCGIのメールフォームをちょこっとカスタマイズして使用しています。
基本的にJISで作られていて、当然ウィンドウズでは正常にメールを表示することができるのですが、我が家のMacのほうで使っているMailというソフトで確認するとメールタイトルは問題ないのですが、本文が文字化けを起こしてしまっています。
フリーCGIといっても色んなものがあるのでアドバイスをいただきにくいと思うのですが、どのポイントにどのような記述が必要であるなどを教えていただけたら幸いです。
補足★全体をEUCに直す方法もやってみましたが、種類の違う文字化けになりました。検索でいろいろ調べてみると、JISでもきちんとカスタマイズすれば文字化けをしないという書き込みがありましたので、JISの方向で進めたいと思っています。
ちょっとしたことでもいいのでよろしくお願いします!
No.8ベストアンサー
- 回答日時:
たぶんこれで最後です。
件名の件で、もし$subject = &mimeencode($subject);で文字化けするのでしたら、
&jcode'convert(*subject, 'sjis');
$subject = &mimeencode($subject);
の2行に変えてみて下さい。
これで文字化けするようであれば#7に書いた通りに
&jcode'convert(*subject,'jis');
の1行に戻すということでお願いします。
#5、6、7、8と回答ありがとうございました!!
とうとうMacのMailでも正常に動作を確認できました。
題名については
&jcode'convert(*subject,'jis');
の状態がベストのようです。
本文については
&jcode'convert(*msg, 'jis');
ではなぜかうまくいかず、
#9のEtherskyさんの書き方をいただいて
&jcode'convert(\$msg, 'jis');
になおしたところで(*を\$に)完了しました。
ただただ教えていただいてばかりで、お忙しい中大変ご助力いただけましたことを感謝します!!
これを期にCGIについてもう少し勉強をしようと思います。
長い間お付き合いいただきありがとうございました~!
No.9
- 回答日時:
> &jcode'convert(*subject, 'sjis');
というよりも、これは
&jcode::convert(\$subject, 'sjis');
と書くべきです。
なぜいまさらPerl4の文法で書く必要があるのでしょうか。
回答ありがとうございます!
Perl4の意味さえ理解できないのがお恥ずかしいばかりですが、スマートな記述をアドバイスいただき感謝しております。
件名については*subjectで大丈夫だったんですが、本文のほうは\$msgでないとダメだったので本当に驚いています。
ということで#8さんのところで書いてある通り、今回メールフォームのカスタマイズではなんとかMacのMailにも通用するようになりました。
お忙しい中、長い間お付き合いいただいてありがとうございました!
No.7
- 回答日時:
たびたびすいません! #5だとエラーがでるかもしれないので、次のように直して下さい。
× $msg = &jcode'convert(*msg, 'JIS');
× &jcode'convert(*msg, 'JIS');
○ &jcode'convert(*msg, 'jis');
うちの環境で試してみたら大文字だとエラーが出てしまったみたいで。
それから件名の文字化けの件ですが、こちらでは#3に書いた通りで問題ないようなのですが、もし化けるようなら最初に戻して
&jcode'convert(*subject,'jis');
でやってみてください。
たびたびお手数おかけします。
No.6
- 回答日時:
#4の「回答に対する補足」についての補足です。
#5にいっしょに書けばよかった(汗)。HTMLの日本語エンコーディングはJISもあります。というより昔はJISが中心だったように記憶しています。今お使いのブラウザの「JIS」あるいは「ISO-2022-JP」と書いてあるのがそれです(WINのIEだと出てこないかも)。
>EUCが基本で作られたCGIでHTMLもEUCだと話は簡単だったってことなんでしょうか
検索エンジン系のスクリプトだと、データがEUCでないと文字の一致が判定できなかったりするのでそうなります。メール送信の場合はCGI・HTMLをEUCで書いても結局JISへのエンコードが必要になります。
CGI・HTMLともにJISで書いておくと、今回のようなエンコードをしなくても文字化けしなかったはずです(昔そういうスクリプトを見たことがあります)。
No.5
- 回答日時:
すいません。
#3の回答の記述ミスのせいだと思います。× $msg = &jcode'convert(*msg, 'JIS');
○ &jcode'convert(*msg, 'JIS');
「$msg .=」に書き換えてしまったために、それまで入っていた未エンコードの$msgに&jcode'convert(*msg, 'JIS')の結果(中味は空っぽ)が追加され、結果としてエンコードされないままになってしまったんだと思います。
上のように訂正して、お試し下さい。
No.4
- 回答日時:
ちょっとだけ補足です。
CGIスクリプトがJISで書いてあってもフォームのページがShift-JISだと、CGIへ送られるデータの中味もShift-JISになってしまうために今回のような文字化けが起こります。
この回答への補足
回答ありがとうございます。
フォームのページがShift-JISであるという問題ですが、HTMLの日本語のためのエンコーディングってShift-JISとEUCだけ、ですよね?
ということはEUCが基本で作られたCGIでHTMLもEUCだと話は簡単だったってことなんでしょうか。
まずはじめにそこんとこを調べてから、カスタマイズ元のメールフォームを選ぶべきだったですね。
基本的にHTMLとCSSくらいしか分からないんで、、CGIってむずかしいですね~
No.3
- 回答日時:
スクリプトを書いていただいたのでわかりました。
#2さんのおっしゃる通りで、
$msgの中味をJISに変換する部分が抜けています。
&sendmailの行の直前に
$msg = &jcode'convert(*msg, 'JIS');
の1行を入れてみて下さい。
それとこのままだと件名が文字化けすることがありますので、mimew.plを入手してアップロードした上で
require './mimew.pl'; #同じディレクトリに置いた場合
の1行と、 &jcode'convert(*subject,'jis');の行の代わりに
$subject = &mimeencode($subject);
としてみてください。
mimew.plは
http://www.cc.rim.or.jp/~ikuta/mime_pls/document …
で入手できます。
この回答への補足
重ねての回答ありがとうございます!
>&sendmailの行の直前に$msg = &jcode'convert(*msg, 'JIS');の1行を入れてみて下さい。
これは記述の規則にしたがって、$msg =のとこを$msg .=に書き換えて挿入いたしました。(=の直前のピリオドのことです。ピリオドなしで検証してみると本文が空白でメールが届きましたので。)もし勘違いだったら、教えていただけると幸いです。
>require './mimew.pl'; #同じディレクトリに置いた場合
の1行と、 &jcode'convert(*subject,'jis');の行の代わりに
$subject = &mimeencode($subject);
ダウンロードページにてダウンロードし、パーミッションはjcode.plで設定したのと同じ640でアップロードしました。そのうえでCGIの書き換えも行いました。
以上のご指示にしたがって検証をおこなった結果は、
★WindowsのOutlookで受け取ったメールの場合
件名: ==?ISO-2022-JP?B?(中間省略)NzGyhC?=
本文: 文字化けなし
★MacのMailで受け取ったメールの場合
件名:
=?ISO-2022-JP?B?(中間省略)NzGyhC?=
=?ISO-2022-JP?B?G(中間省略)RvJDskchsoQg==?=
=?ISO-2022-JP?B?Gy(中間省略)Q3JD8bKEI=?=
本文:
(文頭省略)ˆâ≠¢ŸΩ≠í≠’≠›∂“≠è≠Ü≠µ≠∏™B
≠¨—q˜l≠Ì≠¨ˆâ≠¢ŸΩ≠í≠’≠Í√È≈º≠Ì≠Æ≠¨≠(中間省略)Ü≠·™B
----------------------------------------------------
≠¨ˆπŒO™™∞e∞X∞g
˜XÖ‰ÔŸ∫™™≠O≠O≠O™|≠O≠O≠O≠O
∂Z∂…™™∞e∞X∞g
„d˘b‰ÔŸ∫™™≠O≠O≠O™|≠O≠O≠O™|≠O≠O≠O≠O
email™™hoge@hogehoge.jp
≠¨ˆâ≠¢ŸΩ≠í≠’„à˜e™™∞e∞X∞g
----------------------------------------------------
ということになりました。
面倒な質問ばかりになって本当にごめんなさい。
以上の問題についてお分かりになるようでしたら続けてアドバイスいただけたらありがたいです!
No.2
- 回答日時:
メールを送る場合、
・Subject(件名)はJISにしたあと、BASE64エンコードしなければいけない。
・本文はJISでなければいけない
の2点があります。
察するに、本文がJISのままで件名がJISにしただけな手抜きスクリプトではないですか?
この回答への補足
回答ありがとうございます。
>Subject(件名)はJISにしたあと、BASE64エンコードしなければいけない。
BASE64エンコードについての記述を見てみました。
以下の部分のことでしょうか?ご確認いただけると幸いです。
↓
sub mail64encode {
local($subject) = $_[0];
&jcode'convert(*subject, "jis");
$subject =~ s/\x1b\x28\x42/\x1b\x28\x4a/g;
$subject = &base64encode($subject);
return("=?iso-2022-jp?B?$subject?=\n");
}
sub base64encode {
local($base) = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
. "abcdefghijklmnopqrstuvwxyz"
. "0123456789+/";
local($xx, $yy, $zz, $i);
$xx = unpack("B*", $_[0]);
for ($i = 0; $yy = substr($xx, $i, 6); $i += 6) {
$zz .= substr($base, ord(pack("B*", "00" . $yy)), 1);
if (length($yy) == 2) {
$zz .= "==";
} elsif (length($yy) == 4) {
$zz .= "=";
}
}
return($zz);
}
本文に関しては、toyota_sera_1990さんの3番目のアドバイスで検証しています。
スクリプト元は販売されているものでした。
なので参照スクリプトをここに載せすぎるのは無断転載になるようで心苦しいのですが。。。
いかがでしょうか?
よろしくお願いいたします。
No.1
- 回答日時:
>基本的にJISで作られていて
これはスクリプトの話ですよね。メールフォームを表示しているHTMLの文字コードはShift-JISではないですか?
MacのMailもWinのメールソフトの仕様もあまり詳しくはないんですが、メール本文がShift-JISのまま送られているのではないかと想像します。Winでは自動判定して直すところをMailでは直さないのではないかと。
メール本文のデータが$bodyに入ってるとして、
&jcode'convert(*body, 'JIS');
みたいな一文が入っていますか。
(上記の一文を使うにはjcode.plが必要です)
この回答への補足
ご回答ありがとうございます。
>メールフォームを表示しているHTMLの文字コードはShift-JISではないですか?
メールフォームを設置しているページはShift-JISです。CGIがJISの場合はこのままで矛盾がでないので。
>メール本文のデータが$bodyに入ってるとして、~
Jcode.plを参照する記述は入っていまして、
&jcode'convertみたいな記述部分は、デコード処理をのぞいてすべて'JIS'となっています。デコード処理のところだけ&jcode'convert(*name, 'sJIS');となっています。
ちなみにメール送信のための記述は以下のようなかんじです。
sub mail_to{
&jcode'convert(*subject,'jis');
$m_cnt = 0;
$d_cnt--;
my $msg = $text[0];
$msg .= "さま";
$msg .= "\n";
$msg .= "\n";
$msg .= 'お問い合わせ有り難うございます';
$msg .= "\n";
$msg .= 'お客様のお問い合わせの内容は以下のとおりとなっております。';
$msg .= "\n";
$msg .= "\n";
$msg .= "----------------------------------------------------\n";
while ($d_cnt>$m_cnt){
$msg .= $name[$m_cnt];
$msg .= "=";
$text[$m_cnt] =~ s/<br>/\n/g;
$msg .= $text[$m_cnt];
$msg .= "\n";
$m_cnt++;
}
$msg .= "----------------------------------------------------\n";
&sendmail($subject, $mailto, $email, $cc, $bcc, $msg);
}
メールソフトの自動判定によるものではないかということですが、自動判定の存在しないメールソフトである場合、どのような記述を挿入するとよいでしょうか?
よろしくおねがいします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 政治 私の発明した「二階建て漢字」は使えるでしょうか? 3 2023/02/08 16:40
- CGI (フリーの)ツリー掲示版CGI、昔は多用させてもらいましたが・・今セキュリティ上どうでしょう? 2 2023/06/25 07:18
- その他(メールソフト・メールサービス) 【GAS】GMail自動送信 2 2022/09/04 06:19
- その他(プログラミング・Web制作) Sikulix2.0.5(Jython2.7.3)でcsvを読込WEB検索条件にpasteで文字化け 1 2023/03/31 11:02
- その他(メールソフト・メールサービス) メールソフトを教えてください 1 2023/03/28 23:32
- Excel(エクセル) ExcelデータのMacとWindowsの文字化け対策について教えてください‼︎ 私はMacを使って 1 2022/08/22 12:46
- HTML・CSS docxをmht形式で保存したファイルをedgeで開くと文字化けする 1 2022/07/29 13:14
- Java VScodeのターミナルの文字化けについて 1 2022/09/27 22:19
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Evernote Evernote(エバーノート)の文字化け 1 2022/04/05 19:30
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
cgiの文章がHP上で見ると文字化...
-
ソ噂浬欺圭構蚕十申曾箪貼能表...
-
SHIFT-JIS utf-8 スクリプト
-
perl cgi のエンコード SHIFT...
-
応募フォームなどの住所欄で最...
-
JavaScriptでクッキーの使い方
-
read(buf,int,int)メソッドで1...
-
unicodeと2バイト文字
-
機械受注は?
-
文字列取得 substrではできませ...
-
EOM間にperl文を作成したい
-
エクセル VBプロジェクトの...
-
日本語名が含まれるディレクトリ
-
検索エンジンにブログサイトが...
-
Cプログラムがどうしても動きま...
-
入力した内容に余計な空行が入...
-
Yahoo!のログイン後のページの...
-
クッキーのデータ取得
-
外国人投資家
-
Rstudioによるテキストマイニン...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
utf-8でメールを送信すると件名...
-
SQLServerへの出し入れで文字化け
-
SendMailのsubject文字化け
-
ECUコードのCGIを編集す...
-
入力項目のチェック
-
顧客への返信メールが文字化け...
-
ESC/Pのテキスト印字の制...
-
CGIメールフォームのメールが文...
-
linuxサーバーにUPしたCGIにネ...
-
秀丸でCGIを開いたら文字化...
-
CGIフォームから飛ばすメールが...
-
Yahooの検索結果をエンコードし...
-
CGIで記述した文字が 化け...
-
cgiプログラムについて
-
文字コードsjisをUTF8に書き換...
-
&jcode'convert(しても文字化け...
-
変数に日本語を代入する方法は...
-
文字化けとパスワード変更
-
CGIプログラムを使った申し込み...
-
cgiでの文字化け
おすすめ情報