メールの文字化け対策とは?

このQ&Aのポイント
  • メールを送信する際に文字化けしないようにする方法を探しています。
  • 現在、メール送信時に文字化けの問題が発生しており、UTF-8からJISに変換しようとしていますがうまくいきません。
  • 文字化けの対策方法について検索や参考書を調べましたが、解決策が見つかりません。JISへの変換方法を教えていただきたいです。
回答を見る
  • ベストアンサー

メールを文字化けしないようにしたい

次のようにメールを送信しようとしています。 Fedora CoreはUTF-8なので、jcode.plでJISに変換しようとしています。 require "jcode.pl"; $subject = "テストメール"; $data = "これはテストメールです。"; &jcode::convert(\$subject,'jis'); &jcode::convert(\$data,'jis'); @str = "subject:$subject\n\n"); push (@str, "$data\n.\n"); これがなぜかうまくいきません。メーラーの文字コードをutf8にすると正常に表示されます。 使い方が違うのかと思ったので、次のように変えてみたところ、エラーになりました。 &jcode::convert(\$subject,'utf8','jis'); また、先頭にuse utf8;を付けてみたところ、送信できたものの文字化けが余計ひどくなりました。 インターネットで検索したり本を読んでみたりしても、よくわかりませんでした。 どうやったらJISに変換できるのでしょうか。 よろしくお願いします。

noname#17299
noname#17299
  • Perl
  • 回答数7
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

>また、ヘッダ部分はBase64エンコードしないと文字化けするということを どこかのサイトで書いてありましたが、今回はMIME::Base64パッケージは 特に使ってなく、encode_base64($subject)もコメントアウトしています。 でも件名も内容も全く文字化けしていません。これはなぜでしょうか? メーラーの機能のおかげです。 RFCと呼ばれる事実上標準となっている規定ではBase64エンコードすべしと規定されているのですが、メーラーによっては、Base64エンコードされていなくてもjisコード変換してあれば解釈してくれます。ただし、どんなメーラーでも読めるという保証はなく、一般のメーラで読める保証があるのはBase64エンコードされている場合のみです。 >use encoding 'utf8'; >… >$subject = Encode::encode("jis", $str); 自分の環境がutf8であることを宣言。 $strが宣言されたutf8コードで書かれているとして、 jisコードに変換する という意味です。

noname#17299
質問者

補足

回答ありがとうございます。 メーラーの機能でデコードしてくれていたとうことですね。 encode_base64は指定することにします。 モジュールについては、まだよくわかりません。 encodingというのはモジュールですよね? (1)これがどのパッケージに含まれているとかどこにあるのかを調べるには、 どうすればよいのでしょうか。 (2)宣言しているのはencodingで、使っているのはEncodeパッケージの encodeモジュールなのが腑に落ちません。 (3)use encoding 'utf8';と指定すると、このPerlスクリプトがutf8で 書かれていることになるのでしょうか。 それとも、Encoding::encodeの()内の第2引数で指定された文字列のみが utf8であると解釈されるのでしょうか。 もし後者であるなら、useで宣言するよりEncoding::encodeの()内で、 第3引数として指定するほうが自然な気もします。 (4)実験で失敗した方法は、何が間違っているために失敗したのでしょうか。

その他の回答 (6)

回答No.7

encoding モジュールとか、encodeモジュールといったものは無いと思います。(Encodeモジュールはあっても) ↓ encoding パッケージ、encodeパッケージといったものは無いと思います。(Encodeパッケージはあっても)

noname#17299
質問者

お礼

これを理解するには予備知識が不足してるというのがわかりした。 まずそのあたりを自分で調べてから質問します。 でもHoComeComeさんのおかげで何を調べればよいかがはっきりしました。 最初の質問から話題がそれてしまっているので、この質問は締め切ります。 おかげさまで助かりました。ありがとうございました。

回答No.6

*encoding* を *encoding* に でした。 find `perl -e 'print "@INC"'` -name '*encoding*' -print | grep encoding

回答No.5

(1) *encoding* を encoding に grep encode を grep encoding にしてください。 探しているのはencodeでなく、encodingですよね? (2) encoding はパッケージではなく、プラグマと呼ばれるものです。 詳細はgoogleなどで調べて下さい。 use strict; とかと同種のものです。 やっていることは $ man encoding を参照してください。 これと、スカラーの内容をコード変換する Encode::encode が独立にあってもなんらおかしいことないです。 おかしいと感じる理由がわかりません。 質問と言うより感想に近い?のかな?というより他ないです。ごめんなさい。 encoding モジュールとか、encodeモジュールといったものは無いと思います。(Encodeモジュールはあっても) (4) useでパス指定してない場合はどこを参照してるのか疑問です。 @INC にある部分以外見ているのか、私は知りません。

回答No.4

(1)これがどのパッケージに含まれているとかどこにあるのかを調べるには、 どうすればよいのでしょうか。 Linux環境なら、 # locate encoding | grep perl 結果は /usr/lib/perl5/5.8.6/i386-linux-thread-multi/auto/PerlIO/encoding /usr/lib/perl5/5.8.6/i386-linux-thread-multi/auto/PerlIO/encoding/encoding.so /usr/lib/perl5/5.8.6/i386-linux-thread-multi/PerlIO/encoding.pm /usr/lib/perl5/5.8.6/i386-linux-thread-multi/encoding.pm また、 # man encoding は最低やって下さい。 (2)宣言しているのはencodingで、使っているのはEncodeパッケージの encodeモジュールなのが腑に落ちません。 別におかしくはないと思います。 (3)use encoding 'utf8';と指定すると、このPerlスクリプトがutf8で 書かれていることになるのでしょうか。 そうです。 それとも、Encoding::encodeの()内の第2引数で指定された文字列のみが utf8であると解釈されるのでしょうか。 Encodingというパッケージあります? Encode::encode でなくて? (4)実験で失敗した方法は、何が間違っているために失敗したのでしょうか。 ほとんどモジュールの読み込み時点で失敗してるようです。 cgiにしないで、ローカル環境においてスクリプト実行時で正常にうごいているのか調べて下さい。モジュールの読み込み、および、Encodeを読み込んでいないために関数が定義されていないというエラーが出るのでは?と思います。

noname#17299
質問者

補足

こんばんは、HoComeComeさん。 もう少しで解決しそうですのでお願いします。 (1) # locate encoding | grep perl # slocate encoding | grep perl ともに以下のエラーとなりました。 warning: locate: Could not find the group: slocate in the /etc/group file. fatal error: This is a result of the group missing or a corrupted group file. # find `perl -e 'print "@INC"'` -name '*encode*' -print | grep encode では、以下が表示されました。 /usr/lib/perl5/5.8.5/Encode/encode.h /usr/lib/perl5/vendor_perl/5.8.5/Convert/ASN1/_encode.pm /usr/lib/perl5/vendor_perl/5.8.5/Convert/ASN1/_encode.pm でもこれらは、.hはヘッダだし、_encode.pmはアンダーバーがついているので違うと思います。 どこにあるか現状探せてません。どうすれば見つけられるのでしょうか。 (2) 宣言してるのはencodingモジュールですよね? でも使ってるところはEncodeパッケージのencodeモジュールですよね。 解釈のしかたが間違っているのかもしれません。 encodingモジュールなのかencodeモジュールなのかどちらなのでしょうか? (3) useで宣言したら、require encodingされてからimport関数にutf8という引数が渡されるのはわかりました。 これがモジュール側で定義されているというのを確認したいです。 Encoding::encodeは誤りです。正しくはEncode::encodeでした。 Encodeパッケージのencodeモジュールですね。 (4) そんなモジュールはないというエラーですね。 useでパス指定してない場合はどこを参照してるのか疑問です。 /usr/lib/perl5/vendor_perl/5.8.5/あたりを見てるようですけど、 ここ以外にも見てるとも思います。 このパッケージとモジュールの仕組みがわかれば、大きなプログラムを書くときに 必要なことが理解できてくるような気がします。 よろしくお願いします。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

Perl のバージョンによるんだけど, 5.8 以降なら use encode; とかでなんとかするんでしょう. それより前なら最新のものに入れ替えるということで.

noname#17299
質問者

補足

回答ありがとうございます。 おかげさまで、とりあえず文字化けしない方法を発見しました。 でも、まだきちんと理解できていないことがあります。 そもそもパッケージやらモジュールやらがあまりよく理解できていません。 なので、useでモジュールを読み込むのも何を指定しているのか、 自分でよくわからずにいろいろ試してみました。 その結果を下にまとめましたので、それぞれについてどういう状態なのか 教えていただけますでしょうか。 1 --- 失敗(Internal Server Error) ---------- use encode; … $subject = Encording::encode("jis", $str); ------------------------------------------ 2 --- 失敗(Internal Server Error) ---------- use encode; … $subject = encode("jis", $str); ------------------------------------------ 3 --- 失敗(文字化け) ----------------------- use Encode; … $subject = encode("jis", $str); ------------------------------------------ 4 --- 失敗(文字化け) ----------------------- use Encode; … $subject = Encode::encode("jis", $str); ------------------------------------------ 5 --- 失敗(Internal Server Error) ---------- use encoding; … $subject = Encode::encode("jis", $str); ------------------------------------------ 6 --- 失敗(Internal Server Error) ---------- use encoding 'jis'; … $subject = Encode::encode("jis", $str); ------------------------------------------ 7 --- 失敗(Internal Server Error) ---------- use Encode::encoding 'utf8'; … $subject = Encode::encode("jis", $str); ------------------------------------------ 8 --- 失敗(Internal Server Error) ---------- use encoding 'utf8'; … $subject = encode("jis", $str); ------------------------------------------ 9 --- 成功 --------------------------------- use encoding 'utf8'; … $subject = Encode::encode("jis", $str); ------------------------------------------ また、ヘッダ部分はBase64エンコードしないと文字化けするということを どこかのサイトで書いてありましたが、今回はMIME::Base64パッケージは 特に使ってなく、encode_base64($subject)もコメントアウトしています。 でも件名も内容も全く文字化けしていません。これはなぜでしょうか? さらに、次のサイトにUTF-8フラグというものがあります。 これが何なのかもよくわかりません。 http://www.pure.ne.jp/~learner/program/Perl_unicode.html#flg_write わかる範囲でけっこうですのでご教示ください。 よろしくお願いします。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

jcode.plって、Unicodeに対応してないのでは。 文字コード変換に悩むくらいなら、HTML形式のメールにして、UTF-8のまま送っては。 最近のメーラなら大抵対応してるかと。 # 携帯はよくわからないけど。

noname#17299
質問者

補足

Fedora Coreを使っている人はどうされているんでしょう? UTF-8のまま送る方法以外に、何か代わりのよい方法はありませんか? 携帯に送ることを想定しているわけじゃないのです。 せめてOutlookとか一般的なメーラーで受信した時に文字化けしないようにしたいです。

関連するQ&A

  • メールフォームで文字化けが出る

    http://okwave.jp/qa5038084.htmlの引き続きです。(メールフォーム) <meta http-equiv="Content-Type" content="text/html;charset=shift_jis"> &jcode'h2z_sjis(*contenido) &jcode'convert(*subject,'sjis'); &jcode'convert(*infor,'sjis'); &jcode'convert(*contenido,'jis'); &jcode'convert(*res_msg,'jis'); print "Content-type: text/html;charset=shift_jis\n\n"; ↓ sjis関連をutf8に書き換え、jcodeの頭文字をJに書き換え <meta http-equiv="Content-Type" content="text/html;charset=utf8"> &Jcode'h2z_utf8(*contenido) &Jcode'convert(*subject,'utf8'); &Jcode'convert(*infor,'utf8'); &Jcode'convert(*contenido,'utf8'); &Jcode'convert(*res_msg,'utf8'); print "Content-type: text/html;charset=shift_utf8\n\n"; require 'jcode.pl'をuse Jcode;に書き換え ※jcode::" となっている箇所はありません 結果 メールフォームはエラーや文字化けは出なくて成功しましたが、メール受信の際、ThunderbirdPortableメーラーでは全て文字化け(文字エンコーディングは「日本語ISO-2022jp」となっています)、ウェブメールのgmailでは内容は文字化けになっていませんが、タイトルが文字化けになっています。 どこが悪かったのでしょうか? 宜しくお願いします。

    • 締切済み
    • CGI
  • sendmailで本文が文字化けします

    sendmailを使ってメールを送信していますが、下記処理中で、charsetの指定を入れないと本文は文字化けしないのですが、指定を入れると文字化けしてしまいます。 ※ちなみに、OutlookExpressはどの場合でも文字化けしないで受信できました。 どなたかご存知のかた教えていただけないでしょうか。 ソースは以下のような感じです。 require "/XXX/jcode.pl";# 文字列変換 require "/XXX/mimew.pl";# MIME エンコード # メールHEADER作成 $head = "From: $FromUser\n"; $head .= "To: $ToUser\n"; $head .= "Subject: $Subject\n"; $head .= "Mime-Version: 1.0\n"; $head .= "Content-Type: text/plain; charset=\"ISO-2022-JP\"\n"; $head .= "Content-Transfer-Encoding: 7bit\n"; $head .= "\n"; # JISコード変換 $code = &jcode'convert(*head, 'jis'); # エンコード $header = &mimeencode($head); # メール本文作成 $body = "メール送信のテストです\n"; $code = &jcode'convert(*body, 'jis'); if (open(MAIL,"|/usr/lib/sendmail -f $FromUser $ToUser")){ print MAIL $header; print MAIL $body; print MAIL "\n\n"; close(MAIL); }

  • jcode.pmでconvertできない

    UTF-8の文字をエンコードするため、jcode.plでエンコードしたのをjcode.pmに変更しました。 それで、 &Jcode'convert(*subject,'jis'); という記述を Jcode::convert(*subject,'jis','utf8'); にして、sendmailしましたが、文字化けします。 もし、良い対処方法をご存知でしたら、助けてください。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • Perlからメール送信で文字化け

    Perl5.8からsendmailを使ってメール送信しています。 髙や﨑が入ると文字化けします。文字化けしないようにする方法を教えてください。 #!/usr/bin/perl require 'jcode.pl'; require 'mimew.pl'; $sendmail = '/usr/lib/sendmail'; print"Content-type: text/html\n\n test\n"; if (!(open(OUT,"| $sendmail -t -i -f xxxx\@hogehoge.co.jp"))) { ; } print OUT "To: xxxx\@hogehoge.co.jp\n"; print OUT "From: xxxx\@hogehoge.co.jp\n"; print OUT "Reply-To: xxxx\@hogehoge.co.jp\n"; $subject = "サブジェクト 髙﨑"; $subject = &mimeencode($mail_subject); print OUT "Subject: $mail_subject\n"; print OUT "Mime-version: 1.0\n"; print OUT "Content-Type: text/plain\; charset=\"ISO-2022-JP\"\n"; print OUT "Content-Transfer-Encoding: 7bit\n\n"; $honbun = "メール本文 髙﨑"; &jcode'convert(*honbun, 'jis'); print OUT "$honbun\n"; close(OUT);

    • ベストアンサー
    • Perl
  • shift-jisからutf8に変換

    解決に至らなかったので再度お尋ねします。 CGIのコードを見てくださいますか。 http://hotpegasus.bov.jp/mail.txt (必要な部分だけ表示しておりますので、そのままアップしても機能はしません) 改修した箇所は以下のです。 <meta http-equiv="Content-Type" content="text/html;charset=shift_jis"> &jcode'h2z_sjis(*contenido) &jcode'convert(*subject,'sjis'); &jcode'convert(*infor,'sjis'); &jcode'convert(*contenido,'jis'); &jcode'convert(*res_msg,'jis'); print "Content-type: text/html;charset=shift_jis\n\n"; ↓ sjis関連をutf8に書き換え、jcodeの頭文字をJに書き換え <meta http-equiv="Content-Type" content="text/html;charset=utf8"> &Jcode'h2z_utf8(*contenido) &Jcode'convert(*subject,'utf8'); &Jcode'convert(*infor,'utf8'); &Jcode'convert(*contenido,'utf8'); &Jcode'convert(*res_msg,'utf8'); print "Content-type: text/html;charset=shift_utf8\n\n"; require 'jcode.pl'をuse Jcode;に書き換え ※jcode::" となっている箇所はありません 結果 メールフォームはエラーや文字化けは出なくて成功しましたが、メール受信の際、ThunderbirdPortableメーラーでは全て文字化け(文字エンコーディングは「日本語ISO-2022jp」となっています)、ウェブメールのgmailでは内容は文字化けになっていませんが、タイトルが文字化けになっています。 どこが悪かったのでしょうか? 宜しくお願いします。

    • 締切済み
    • CGI
  • jcode.plについて

    次のエラーが発生します。 Undefined subroutine &jcode::convf called at ./jcode.pl line 291. カレントに、jcode.plを置いているだけでは動作するのでしょうか? また、Jcode.pmを使った場合、 &Jcode::convert(\$test_sjis, "sjis"); と大文字にしないといけないのですが、これは仕方ないことでしょうか? てっきり、 require './jcode.pl'と use Jcode.pmの差し替えで済むと思っていました。 #!/usr/bin/perl require './jcode.pl'; my $test = "パソコン結構です。"; #文字化けチェック用 my $test_sjis = $test; my $test_ujis = $test; my $test_jis = $test; &jcode::convert(\$test_sjis, "sjis"); &jcode::convert(\$test_ujis, "ujis"); &jcode::convert(\$test_jis, "jis"); print "\$test_sjis=[$test_sjis]\n"; print "\$test_ujis=[$test_ujis]\n"; print "\$test_jis =[$test_jis]\n"; exit; __END__

    • ベストアンサー
    • Perl
  • sendmailで送信の時に文字化け

    皆さんお世話になります sendmailを使用してメール送信しています 送信はちゃんと出来て、WEB上のメールで見る限り 問題は無いのですが、アウトルックエクスプレスで 受信すると文字化けしてしまいます。 #// メール送信 # print MAIL $mlms; # require './jcode.pl'; jcode'convert(*mlsb, "jis"); jcode'convert(*mail_msg, 'jis'); $mlhd = "From: $mlfr" . "\n" . "To: $mlto" . "\n" . "Subject: $mlsb" . "\n\n"; # Err check $err = 1; if ($mlms cmp "" && $mlfr cmp ""){$err = 0} open(MAIL, "| $mailer -t") or $err = 1; if ($err == 0) { print MAIL $mlhd; print MAIL "\n"; print MAIL "Content-Transfer-Encoding: 7bit\n"; print MAIL 'Content-Type: text/plain; charset=iso-2022-jp' . "\n\n"; print MAIL $mail_msg; print MAIL "\n\n" . "." . "\n"; close(MAIL); プロバイダはwakwakです 何か足りない物があるような気がします よろしくご指導お願いします。

    • ベストアンサー
    • CGI
  • Jcodeで変換できません。。。

    下記のCGI(文字コードはutf-8)を作成したのですが、正常に表示されません。 ~を上手に判定できていないということでしょうか??? また、もし、正しく変換できないのであれば、Jcodeで変換できない文字の一覧などあれば助かります。 分かる方、何卒、宜しくお願い致します。 #!/usr/bin/perl print "Content-type: text/html;charset=Shift_JIS\n\n"; $str = "1~10"; use Jcode; Jcode::convert( \$str,"sjis","utf8"); print $str; 表示された結果 1?10 となりました。

    • ベストアンサー
    • Perl
  • sendmailのFROMに日本語を使う

    CGIからsedmailを呼び出してメールを送信しています。 その時に差出人の部分の日本語が文字化けしてしまいます。 そこで&jcode'convertでjisに変えたのですが、今度は CGIがサーバーエラーになってしまいます。 どうすればよいでしょうか。 スクリプトはこんな感じです。 ----------------------------------------------- $from = '両国'; $subject = 'テスト'; &jcode'convert(*from, 'jis'); &jcode'convert(*subject, 'jis'); &jcode'convert(*msg, 'jis'); $errno = 1 unless open(MAIL, "| /usr/lib/sendmail -t"); return 0 if $errno; print MAIL "To: $MailTo\n"; print MAIL "From: $from\n"; print MAIL "Subject: $subject\n"; print MAIL "Content-Type: text/plain;\n\n"; print MAIL "$msg\n"; $errno = 2 unless close(MAIL); return 0 if $errno;

    • ベストアンサー
    • Perl
  • 文字コードsjisをUTF8に書き換えたい

    CGIの勉強中の者です。 文字コードはSJISで保存しているCGIをUTF8コードに換えるには何が必要でしょうか? HTMLならmeta内をSJISからUTF8に変更し、TeraPadなどのテキストエディタでUTF8に保存すればオッケーなんですが。 CGIの場合はHTMLと違って、換えるには複雑なのでしょうか? CGIプログラムの中では以下の「sjis」を「UTF8」に書き換えし、UTF8で保存しましたけど、文字化けが出てます。 <meta http-equiv="Content-Type" content="text/html;charset=shift_jis"> &jcode'h2z_sjis(*contenido) &jcode'convert(*subject,'sjis'); &jcode'convert(*infor,'sjis'); &jcode'convert(*contenido,'jis'); &jcode'convert(*res_msg,'jis'); print "Content-type: text/html;charset=shift_jis\n\n"; 宜しくお願いします。

    • 締切済み
    • CGI

専門家に質問してみよう