
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を変えずに)
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
No.3
- 回答日時:
書き忘れ
http://www.stackasterisk.jp/tech/program/perl03_ …
にperlで漢字を含むタイトルの付いたメールを送る簡単な例が載っています(後半のmimew.pl、jcode.plを使う例)
No.2
- 回答日時:
>>しかも、将来的に本文の文字化けの危険性を含みます。
>とのことですが、将来的にutfへの流れなのでは?
http://www.atmarkit.co.jp/fnetwork/rensai/netpro …
の「●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/ …
http://perldoc.jp/docs/modules/Jcode-0.82/Jcode. …
ありがとうございます。
お礼が遅れまして申し訳ございません。
>もし、将来、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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- PHP Content-Typeが機能していない? 2 2022/07/17 11:10
- Excel(エクセル) 文字化け。メモ帳でUTF-8に変換後、エクセルへ貼り付けたいです。 3 2022/08/14 07:21
- PHP phpのメールフォームの完了画面でメール受信のコードを書いています。 1 2023/05/31 11:39
- HTML・CSS <meta charset="utf-8"><!-- 文字化け防止ユニコード --> ?最近モバイル 1 2022/12/11 04:27
- その他(メールソフト・メールサービス) outlookからの送信された件名が文字化けします 2 2023/04/18 14:29
- UNIX・Linux テキストファイルをページ番号付きでコマンドラインから印刷したい 1 2023/02/22 12:47
- Java VScodeのターミナルの文字化けについて 1 2022/09/27 22:19
- その他(プログラミング・Web制作) Sikulix2.0.5(Jython2.7.3)でcsvを読込WEB検索条件にpasteで文字化け 1 2023/03/31 11:02
- JavaScript HTMLでJavaScriptを使ってパスワードの強化判定のプログラムを作成しています。 一通り作っ 2 2022/10/19 01:41
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQLServerへの出し入れで文字化け
-
utf-8でメールを送信すると件名...
-
10Mバイトて文字数に すると何...
-
UTF-8で5~6バイトになる文字コ...
-
Excel VBA メール作成について ...
-
COBOLのCOMP形式について
-
DataGridViewの特定列に入力さ...
-
char str[256]の256の意味は?
-
Excel 1セル当りの文字数が2...
-
:(コロン)のKeyCode
-
半角、全角の判別方法
-
全角半角を調べるライブラリ関...
-
より高速な画像の表示法
-
【Excel VBA】10進数を2進数に...
-
ピクセル,dpiから容量(バイト...
-
COBOL PICTUREで X,S,Vの意味
-
CreateProcessでの環境変数の設...
-
C++ Builderで文字列をバイトに...
-
エクセルシート名の制限を変更...
-
デバイスコンテキストに書いた...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
utf-8でメールを送信すると件名...
-
SQLServerへの出し入れで文字化け
-
SendMailのsubject文字化け
-
ECUコードのCGIを編集す...
-
入力項目のチェック
-
顧客への返信メールが文字化け...
-
ESC/Pのテキスト印字の制...
-
CGIメールフォームのメールが文...
-
linuxサーバーにUPしたCGIにネ...
-
秀丸でCGIを開いたら文字化...
-
CGIフォームから飛ばすメールが...
-
Yahooの検索結果をエンコードし...
-
CGIで記述した文字が 化け...
-
cgiプログラムについて
-
文字コードsjisをUTF8に書き換...
-
&jcode'convert(しても文字化け...
-
変数に日本語を代入する方法は...
-
文字化けとパスワード変更
-
CGIプログラムを使った申し込み...
-
cgiでの文字化け
おすすめ情報