- ベストアンサー
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を変えずに)
- みんなの回答 (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にまとめています。 参考サイトのソース順のまま流用しようとすると文字化けします。
その他の回答 (3)
- chie65536
- ベストアンサー率41% (2512/6032)
書き忘れ http://www.stackasterisk.jp/tech/program/perl03_03.jsp にperlで漢字を含むタイトルの付いたメールを送る簡単な例が載っています(後半のmimew.pl、jcode.plを使う例)
- chie65536
- ベストアンサー率41% (2512/6032)
>>しかも、将来的に本文の文字化けの危険性を含みます。 >とのことですが、将来的に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
- chie65536
- ベストアンサー率41% (2512/6032)
「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への流れなのでは? ヘッダ部の例を書いていただきましたが、実際の書き方がわかりません。 すみません。
お礼
ありがとうございます。 お礼が遅れまして申し訳ございません。 >もし、将来、RFC規格が変更され「8bitサポートが必須」となり、すべてのサーバーがリプレースされた時が来たら >「使っても良い」と言う事ですが、今はそうなっていません。 なるほど、そうですね。 いまはやはりS-jisにやってみます。