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ランキング
-
エクセルで集計したい。
-
apacheでPerl CGIが作動せず、5...
-
一番簡単なCGI,掲示板の設置教...
-
/bin/awk '{print $5}'ってどう...
-
チェックボックスでのvalue値の...
-
CGIで得た内容をHTMlページに代入
-
前回はごめんなさい。pythonでc...
-
cgiからsendmailを送信で文字化け
-
フォームを再送信しますか?
-
cgiでのアクセスカウンターの表...
-
3DCG
-
ホームページにメールフォーム...
-
cgi アクセス制限 エラー
-
CGIの記述について教えてくださ...
-
CGIの設置が分かりません・・・
-
ホームページにCGIを設置したの...
-
ホームページにCGIを設置したの...
-
サーバーのエラーでおしえてく...
-
ホームページの事でおしえてく...
-
さくらサーバーにcgiフォームを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
&jcode'convert(しても文字化け...
-
応募フォームなどの住所欄で最...
-
utf-8でメールを送信すると件名...
-
ESC/Pのテキスト印字の制...
-
全角カタカナチェックについて
-
CGIメールフォームのメールが文...
-
フォームメールを受信すると文...
-
SQLServerへの出し入れで文字化け
-
これはなんて文字コードかわか...
-
Window open パラメタについて
-
CGI掲示板の文字化け
-
文字コードsjisをUTF8に書き換...
-
CGIフォームから飛ばすメールが...
-
HttpURLConnection転送で漢字表示
-
PerlのCGIで全角スペースを入れて
-
.cgi でタグが勝手に変換されま...
-
CGI(Perl)の文字化けについて
-
検索窓の設置について
-
JavaScriptからCGI
-
perl cgi のエンコード SHIFT...
おすすめ情報