• ベストアンサー
  • 困ってます

utf-8でメールを送信すると件名が文字化け

Perlでメールフォームを作成しております。 今後のこともあってUTF-8でファイル、HTMLの出力をおこなっております。 なにかとutf-8便利でさくさくと問題なく作成していたのですがメール送信の肝心な部分で問題が出てきました。 送信先はiモードで506iです。 メールのヘッダーを以下のようにして送ると件名の日本語がどうしても文字化けします。本文はしません。アウトルックエクスプレス6.0では文字化けしません。YahooWebメールは文字化けしました。 Reply-To: $adminmail Errors-To: $adminmail To: $user_mail From: $adminmail Subject: $subject content-transfer-encoding: 7bit Content-type: text/plain; charset=utf-8 ・携帯がutf-8に対応していないメーラーなんだろうと思いますがなぜ本文は文字化けしないんでしょうか。 ・件名を文字化けをしないようにする方法はありますでしょうか?(ファイルの保存形式はutf-8を変えずに)

共感・応援の気持ちを伝えよう!

  • CGI
  • 回答数4
  • 閲覧数5746
  • ありがとう数8

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

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

私もサブジェクトが文字化けしてしまい苦しみました。 携帯での文字化けということなので役に立つかわかりませんが、 以下のサイトを参考にして、 http://www.securehtml.jp/utf-8/perl_utf_mail.html メールフォーム用に書き直してみたものです。 <!-- ここから --> ##Perlの冒頭に入れる1行 ##MIME::Base64がインストールされていることが前提 use MIME::Base64; ##送信処理 local($msub,$mbody,$headers); $msub = $_[0]; $mbody = $_[1]; $headers = $_[2]; # メールタイトル $msub = "テスト送信完了通知"; $mbody .= "メール送信テスト\n\n"; $mbody .= "名前:$in{'name'}\n\n"; $msub = $subject; $headers = "From:$email\nMIME-Version: 1.0\nContent-Type: text/plain; charset=utf-8\nContent-Transfer-Encoding: base64\n"; $eol = ""; $msub_b = encode_base64($msub,$eol); $msub_b = "=?utf-8?B?" . $msub_b . "?="; open(MAIL,"| $mailprog -t") || &error("メール送信に失敗しました"); print MAIL $headers; print MAIL "To: $mailto\n"; print MAIL "Subject: $msub_b\n\n"; print MAIL encode_base64($mbody); close(MAIL); <!-- ここまで --> $msubがサブジェクトで、$mbodyが本文です。 $msub_bがエンコードされたサブジェクトということになります。 エンコード対象外(半角英数のみ)の部分を$headersにまとめています。 参考サイトのソース順のまま流用しようとすると文字化けします。

参考URL:
http://www.securehtml.jp/utf-8/perl_utf_mail.html

共感・感謝の気持ちを伝えよう!

その他の回答 (3)

  • 回答No.3

書き忘れ http://www.stackasterisk.jp/tech/program/perl03_03.jsp にperlで漢字を含むタイトルの付いたメールを送る簡単な例が載っています(後半のmimew.pl、jcode.plを使う例)

共感・感謝の気持ちを伝えよう!

  • 回答No.2

>>しかも、将来的に本文の文字化けの危険性を含みます。 >とのことですが、将来的にutfへの流れなのでは? http://www.atmarkit.co.jp/fnetwork/rensai/netpro03/netpro01.html の「●Content-Transfer-Encoding:」の項を読んで下さい。 > 8ビット(8bits)とバイナリ(binary)が定義されている点に注意してほしい。 >最近インターネットメールを8ビット・データに対応させようという動きがあるが、 >その際に8ビットのままで利用するための定義である。しかし、こうした活動は限定 >的なもので、厳密にはこの2つの方法は仕様違反だと思ってほしい。そのため、 >われわれが目にするのはほとんどが7ビットとbase64となるはずだ。 8ビットを通すサーバーが増えてはいますが、全部が8ビットを通す保証がどこにもないので「今は使わない方が望ましい」のです。 もし、将来、RFC規格が変更され「8bitサポートが必須」となり、すべてのサーバーがリプレースされた時が来たら「使っても良い」と言う事ですが、今はそうなっていません。 上記ページの前編と一緒に「MIME~後編」もお読み下さい。 >ヘッダ部の例を書いていただきましたが、実際の書き方がわかりません。 有料またはフリーの変換ルーチンライブラリを入手し、変換の必要がある文字列を順次、変換ルーチンに渡し、変換結果をヘッダに与えて下さい。 変換ルーチンの使い方は、入手したライブラリの説明書やドキュメントに従って下さい。 http://perldoc.jp/docs/modules/MIME-Base64-2.12/Base64.pod http://perldoc.jp/docs/modules/Jcode-0.82/Jcode.pod

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ありがとうございます。 お礼が遅れまして申し訳ございません。 >もし、将来、RFC規格が変更され「8bitサポートが必須」となり、すべてのサーバーがリプレースされた時が来たら >「使っても良い」と言う事ですが、今はそうなっていません。 なるほど、そうですね。 いまはやはりS-jisにやってみます。

  • 回答No.1

「Content-type: text/plain; charset=utf-8」が有効なのは「本文のみ」です。しかも、将来的に本文の文字化けの危険性を含みます。 ヘッダー部分(Subjectを含む)は「必ず7ビットアスキーコード」でなければなりません。 なお、メールを中継するサーバーによっては、本文中の8ビットコードの最上位ビットを落として中継するサーバーもあるので、本文中も7ビットコードにエンコードしないと、文字化けの可能性があります。 つまり、本文をUTF-8で送ると、将来的に、第3者のサーバーが原因で突発的に文字化けする可能性があり、しかも第3者の中継サーバーに起因するので、この文字化けは一度起きると防ぐ事が出来ません。 Subject、Fromの2バイトコードに関しては 1.JISコードに変換する 2.BASE64エンコードする 3.RFC2047の規定に従いMIMEエンコードする(http://tools.ietf.org/html/rfc2047) 4.ヘッダが80文字を超える場合は複数行に分割 と言う変換が必要です。 ヘッダ部の例: 1.『漢字』を「ESC$B<JISコードでの『漢字』>ESC(B」に変換 2.「ESC$B<JISコードでの『漢字』>ESC(B」をBASE64で変換する 3.「=?ISO-2022-JP?B?<BASE64エンコードした文字列>?=」にする 4.「Subject: =?ISO-2022-JP?B?<BASE64エンコードした文字列>?=」でSubjectヘッダに指定 5.「Content-Type: text/plain; charset="iso-2022-jp"」でContent-Typeヘッダに指定 6.「Content-Transfer-Encoding: 7bit」でContent-Transfer-Encodingヘッダに指定 ボディ部(本文)の例 1.『漢字』を「ESC$B<JISコードでの『漢字』>ESC(B」に変換 2.ボディ部を送信

共感・感謝の気持ちを伝えよう!

質問者からのお礼

むむむ... 今までS-jisで書いてきて送信する際もjcode.plを使って簡単に送っていたのでこれほどややこしいとは・・・ >しかも、将来的に本文の文字化けの危険性を含みます。 とのことですが、将来的にutfへの流れなのでは? ヘッダ部の例を書いていただきましたが、実際の書き方がわかりません。 すみません。

関連するQ&A

  • メールの件名が文字化け

    こんにちは。メールの件名が文字化けしてしまいます。エンコードはutf-8です。 ファイルもutf-8で保存しております。 同じソースコードを使用していますが、とあるAサーバーでは文字化けしないのですが、 とあるBサーバーですと文字化けを起こしてしまいます。 (1)現象は下記の通りです。 (文字化けした件名) =?utf-8?B?44GK5ZWP44GE5ZCI44KP44Gb?= (文字化けしていない件名) お問い合わせ (2)ソースコードを抜粋します。 ini_set("mbstring.internal_encoding","UTF-8"); $title = "サービスセンター"; $subject_register = "お問い合わせ"; ・ ・ 省略 ・ ・ $headers1 = "From: =?utf-8?B?". base64_encode($title). "?= <$mail_from>"; $subject = "=?utf-8?B?".base64_encode($subject_register)."?="; ・ ・ 省略 ・ ・ mb_language("uni"); mb_send_mail($mail_to,$subject,$body,$headers1) サーバー環境の問題ですと、php.iniの設定で何か必要なのでしょうか? お気づきの点がありましたら、些細なことでも結構ですので、ご教示して 頂けると助かります。よろしくお願いいたします。

    • 締切済み
    • PHP
  • MT::Mailでメールを送信すると文字化けします。文字コードはUTF

    MT::Mailでメールを送信すると文字化けします。文字コードはUTF-8でMovableType5を使用しています。 MovableTypeオブジェクトリファレンスにあるとおり、 use MT::Mail; my %head = ( To => 'foo@bar.com', Subject => '件名' ); my $body = '本文'; MT::Mail->send(?%head, $body) or die MT::Mail->errstr; と、すると文字化けしたメールが送られてきます。 MySQLからデータを取得して件名、本文に入れ、メールすると文字化けせずに送れます。 my $sample = Sample::Object->load(undef,undef); my $body = $sample->text; my $subject = $sample->name; my %head = ( To => 'foo@bar.com', Subject => $subject ); MT::Mail->send(?%head, $body) or die MT::Mail->errstr; mt-config.cgiには DefaultLanguage ja MailEncoding ISO-2022-JP を追記しています。 mysqlの文字コードはUTF-8になってます。 character_set_client | utf8 character_set_connection | utf8 character_set_database | utf8 character_set_filesystem | binary character_set_results | utf8 character_set_server | utf8 character_set_system | utf8 ファイルに直に書いたときに文字化けしない方法はありますか。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • メール件名の文字化け

    Windows live メールにしてから、MLにメールを送信すると、件名が文字化けしてのります。 本文は文字化けしないのですが、件名が文字化けしないようにするのにはどうしたらいいのでしょうか?

  • UTF-8のサイトからメールリンクの件名や本文が文字化けする

    UTF-8で作ったサイトから mailto:●●@●●.com?subject=タイトル&body=名前%0d%0a電話番号 といったメールのリンクを入れましたが、 クリックし、メーラーが立ち上がると件名や本文が文字化けしてしまいます。 文字列を UTF8/16 の文字コードへ変換など試してみたのですが、うまくいかず、困っています。わかる方いらっしゃいましたら、よろしくお願いいたします。

  • CGIでメール送信で件名文字化け

    CGIにてメールを送信しています。 Beckyや一部のWEBメーラーで見ると、本文も件名も正常表示されますが、一部のWEBメーラー(Chicappa)では件名のみ文字化けします。 例えば件名が「お問い合わせの受付」の場合 「 $B$*Ld$$9g$o$;$N<uIU (B」となります。 困っています。原因を教えてください。 ソースはutf8で保存しています。 use utf8; use MIME::Lite; use Jcode; my $msg = MIME::Lite->new( From => $mail_from, To => $mail_to, Subject => jcode("お問い合わせの受付")->jis, Type => 'multipart/mixed', ); $msg->attach( Type => 'image/jpeg', Path => "./picture.jpg", ); $msg->attach( Type => 'text/plain; charset="iso-2022-jp"', Data => jcode($mail_body)->jis ); $msg->send();

  • Gmailへのメール送信で文字化け

    PHPでフォームメールの作っているのですが、Gmailで送信したメールを受け取ると□□□□□というように文字化けが起こっていまいます。 アウトルック、ホットメールなどは大丈夫なのですが、グーグルのGmailだけ駄目なようです。なぜ文字化けするのでしょうか? mb_language("Ja"); $header = "From: reminder@aaa.com\r\n"; $header .= "MIME-Version: 1.0\r\n"; $header .= "Content-Type: text/plain;charset=ISO-2022-JP\r\n"; $header .= "Content-Transfer-Encoding: base64"; $to = "aaa@gmail.com"; $subject = "送信テスト"; $body = "本文テスト本文テスト"; $subject = base64_encode($subject); $subject = mb_convert_encoding($subject,"ISO-2022-JP"); $subject = "=?ISO-2022-JP?B?" . $subject . "=?="; $body = base64_encode($body); $body = mb_convert_encoding($body,"ISO-2022-JP"); $success = @mail($to,$subject,$body,$header); if($success) print "成功"; else print "失敗";

    • ベストアンサー
    • PHP
  • Perl 文字コードについて

    From: $from To: $mailto CC: $mailcc Subject: $subject Mime-Version: 1.0 Content-type: text/plain;charset=\"UTF-8\" Content-Transfer-Encoding: 8bit この時点で、UTF-8を指定しました。 use Encode; use Encode::Guess; Encode::Guess->set_suspects( qw/ euc-jp shiftjis 7bit-jis / ); $name = encode('UTF-8', decode('Guess', $name)); で本文を、UTF-8に変換して送るようなコードを書きました。 これで一応、パソコン、スマホ共に「本文」は文字化けせず送れるのですが、 今度、別の問題が発生してしまったようで、 「件名」が文字化けしてしまうようになりました。 $subject = encode('UTF-8', decode('cp932', $subject)); 件名も、本文と同じように変換コードをしてみたところ、パソコンでは文字化けしませんでしたが「件名」で文字化けしてしまいます。 調べたところ本文と件名では、内容が違い MIMEエンコードを使用するとのことだったのですが、 実際どのように使うのかわからないです。 $subject = encode('ISO-2022-JP', decode('cp932', $subject)); encode('MIME-Header-ISO_2022_JP', $subject) このように記述するとスマホでは文字化けしないのですが パソコンで文字化けしてしまいます。 そこで、件名がパソコンとスマホで文字化けしないようにし、本文はUTF-8で送るようにするにはどのようにすればいいのでしょうか?

    • ベストアンサー
    • Perl
  • Perl+UTF8で文字化け

    以下の環境にてメール送信プログラムを作成していますが、 ありがちな文字化け、且、ボディーが表示されない不具合が発生しています。 サーバ:linux apache レンタルサーバ ※Encode.pm、Jcode.pm無し。モジュールインストール不可。 Perl version: 5.006001 ソースエンコード:utf-8 自分の解釈としてはutf8で記述しているので、 charset=utf-8にしておけば、 MIMEエンコードさえしてやれば 表示できると考えているのですが、 やはり甘い考えなのでしょうか? また、同サイト質問NO2868794も参考にさせていただきましたが、上手くいきません。 以下ソース(エンコード:utf-8) use utf8; use MIME::Base64; use POSIX; ※アドレス表記はこのサイトの投稿チェックに引っかかるので省略します。 my $to = 'XXXX@XXXX'.XXX; my $from_nm = "送信者名"; my $from_adr = "XXXXX@XXX.XXX"; my $subject = "メール表題"; my $body = "本文"; # 送信者名を MIME エンコード encode_base64($from_nm,""); # subjectを MIME エンコード encode_base64($subject,""); $subject = "=?utf-8?B?" . $subject . "?="; # 本文を MIME エンコード encode_base64($body); my $MailPass = "XXXX/XXXX/XXX"; #SendMail Pass open(MAIL,"| $MailPass -t"); #======================================================== print MAIL <<"EOF_MAIL"; From: $from_nm<$from_adr> To: $to Subject: $subject Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 MIME-Version: 1.0 $body EOF_MAIL #======================================================== close MAIL; その他、色々ググっては見たのですが、自分ではみつけられず、 どうかアドバイスありましたらよろしくお願いいたします。

  • PHPメール送信で文字化け

    PHPでメール送信フォームを用意し、「本文、件名」共に日本語で入力して送ってみたのですが送信結果が文字化けしてしまいます。「あ」と入力して送信すると「??」となってしまいます。 どなたか解決できるようアドバイスをください。 <head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head> <body> <?php $mail_send = "ABCDEFG@y.co.jp"; //宛先 $mail_sub = $_POST["mail_sub"]; //件名 $mail_text= $_POST["mail_text"]; //本文 mb_send_mail($mail_send, $mail_sub, $mail_text); ?>

    • ベストアンサー
    • PHP
  • 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