質問

質問者:bakusui 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を変えずに)
質問投稿日時:07/03/27 00:41
質問番号:2868794
この質問に対する回答は締め切られました。
最新から表示回答順に表示良回答のみ表示

回答

良回答20pt

回答者:kuzumiHK 私もサブジェクトが文字化けしてしまい苦しみました。
携帯での文字化けということなので役に立つかわかりませんが、

以下のサイトを参考にして、
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にまとめています。
参考サイトのソース順のまま流用しようとすると文字化けします。
種類:回答
どんな人:経験者
自信:自信あり
回答日時:07/05/04 13:37
回答番号:No.4
参考URL: http://www.securehtml.jp/utf-8/perl_utf_mail.html
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

良回答10pt

回答者:chie65536 >>しかも、将来的に本文の文字化けの危険性を含みます。
>とのことですが、将来的に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
種類:回答
どんな人:一般人
自信:参考意見
回答日時:07/03/28 01:23
回答番号:No.2
この回答へのお礼ありがとうございます。
お礼が遅れまして申し訳ございません。

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