• ベストアンサー

CGIフォームから飛ばすメールがMacのMailで本文だけ文字化け

フリー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行に戻すということでお願いします。

051007
質問者

お礼

#5、6、7、8と回答ありがとうございました!! とうとうMacのMailでも正常に動作を確認できました。 題名については &jcode'convert(*subject,'jis'); の状態がベストのようです。 本文については &jcode'convert(*msg, 'jis'); ではなぜかうまくいかず、 #9のEtherskyさんの書き方をいただいて &jcode'convert(\$msg, 'jis'); になおしたところで(*を\$に)完了しました。 ただただ教えていただいてばかりで、お忙しい中大変ご助力いただけましたことを感謝します!! これを期にCGIについてもう少し勉強をしようと思います。 長い間お付き合いいただきありがとうございました~!

その他の回答 (8)

  • Ethersky
  • ベストアンサー率71% (168/235)
回答No.9

> &jcode'convert(*subject, 'sjis'); というよりも、これは &jcode::convert(\$subject, 'sjis'); と書くべきです。 なぜいまさらPerl4の文法で書く必要があるのでしょうか。

051007
質問者

お礼

回答ありがとうございます! 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になってしまうために今回のような文字化けが起こります。

051007
質問者

補足

回答ありがとうございます。 フォームのページが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.html で入手できます。

051007
質問者

補足

重ねての回答ありがとうございます! >&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 ---------------------------------------------------- ということになりました。 面倒な質問ばかりになって本当にごめんなさい。 以上の問題についてお分かりになるようでしたら続けてアドバイスいただけたらありがたいです!

  • Ethersky
  • ベストアンサー率71% (168/235)
回答No.2

メールを送る場合、 ・Subject(件名)はJISにしたあと、BASE64エンコードしなければいけない。 ・本文はJISでなければいけない の2点があります。 察するに、本文がJISのままで件名がJISにしただけな手抜きスクリプトではないですか?

051007
質問者

補足

回答ありがとうございます。 >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が必要です)

051007
質問者

補足

ご回答ありがとうございます。 >メールフォームを表示している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

専門家に質問してみよう