@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

MimeMessageの文字化けについて

1
投稿者投稿内容
田中
ベテラン
会議室デビュー日: 2002/05/08
投稿数: 54
投稿日時: 2005-12-09 21:48
MimeMessageでのメール送信で文字化けがおきて困っています。

メッセージ本文はEUC(msg.setText()の直前にsun.misc.HexDumpEncoderで確認)ですが
これを送信すると受信したメッセージが変な化け方をしています。

半角は「===」を送信すると「=3D=3D=3D」になります。
全角は「有限会社」を送信すると「=CD=AD=B8=C2=B2=F1=BC=D2」とか
「=1B$BM-8B2q<R=1B(B」に化けてます。

色々と試して見ましたが解決できず困っています。
どうかお助け下さい。

【送信テキスト】
========
有限会社



【直前のダンプ】
0000: 3E 20 3D 3D 3D 3D 3D 3D 3D 3D 0D 0A 3E 20 CD AD > ========..> ..
0010: B8 C2 B2 F1 BC D2 20 0D 0A 3E 0D 0A 0A ...... ..>...



【試行1】
String encodedBody = MimeUtility.encodeText(message, "ISO-2022-JP", "B");
msg.setContent(encodedBody, "text/plain; charset=ISO-2022-JP");

【受信メール抜粋】
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit

=?ISO-2022-JP?B?PiA9PT09PT09PQ0KPiAbJEJNLThCMnE8UhsoQiANCj4NCgo=?=

【試行2】
String encodedBody = MimeUtility.encodeText(message, "ISO-2022-JP", "B");
msg.setContent(encodedBody, "text/plain; charset=ISO-2022-JP");
msg.setText(message);

【受信メール抜粋】
Content-Type: text/plain; charset=EUC-JP-LINUX
Content-Transfer-Encoding: quoted-printable

> =3D=3D=3D=3D=3D=3D=3D=3D
> =CD=AD=B8=C2=B2=F1=BC=D2=20

【試行3】
String encodedBody = MimeUtility.encodeText(message, "ISO-2022-JP", "B");
msg.setContent(encodedBody, "text/plain; charset=ISO-2022-JP");
msg.setText(message,"ISO-2022-JP");

【受信メール抜粋】
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: quoted-printable

> =3D=3D=3D=3D=3D=3D=3D=3D
> =1B$BM-8B2q<R=1B(B=20

【試行4】
msg.setText(message,"ISO-2022-JP");


【受信メール抜粋】
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: quoted-printable

> =3D=3D=3D=3D=3D=3D=3D=3D
> =1B$BM-8B2q<R=1B(B=20

coasm
大ベテラン
会議室デビュー日: 2001/11/26
投稿数: 237
投稿日時: 2005-12-10 00:25
結論から言いますと、どれも「文字化け」していません。
すべて、【送信テキスト】を指定した通りにエンコードしたものになっています。

【試行1】
メールの内容は、送信テキストをISO-2022-JPでBエンコードしたものです。
文字化けはありません。
何故にメールの本文をMimeEncodeするのか理解に苦しみますが・・・

【試行2】
setContent()した後で更にsetText()しているのが謎ですが、これは、後で実行したsetText()が有効です。
setText()でエンコードを指定しないと、プラットフォームのデフォールトエンコーディンに
なってしまいます。
メールの内容は、【送信テキスト】をEUCでquoted-printableにエンコードしたものです。
文字化けはありません。

【試行3】
試行2と同様に、setContent()が無駄になっています。
メールの内容は、【送信テキスト】をISO-2022-JPでquoted-printableにエンコードしたものです。
文字化けはありません。

【試行4】
試行3から、無駄なsetContent()を除いたもの。
メールの内容は、【送信テキスト】をISO-2022-JPでquoted-printableにエンコードしたものです。
文字化けはありません。
これは、コーディングとして「正解」です。

特に指定しないと quoted-printable になってしまうのは、javamailの仕様です。
困ったものですが、ある意味では「RFCを正しく実装している」という意見もあるようで・・・

日本語メールの標準 "charset=ISO-2022-JP" "Content-Transfer-Encoding: 7bit" で
送信して欲しければ、そのように指定してやらないといけません。

msg.setText(message,"ISO-2022-JP");
msg.setHeader("Content-Transfer-Encoding", "7bit");

まあ、【試行1】 は論外、【試行2】もメールとしては非標準ですが、
【試行3】【試行4】のメールを正しく表示できないのであれば、
それはメーラの方が悪いと言ってもかまわないでしょう。



田中
ベテラン
会議室デビュー日: 2002/05/08
投稿数: 54
投稿日時: 2005-12-10 16:44
ありがとうございます。
試行の順番(番号)が間違っていました。
最初は試行4だったのですが、受信メールが「=3D...」となっていて
色々なやり方を試してみました。

「=3D...」も正しい形式だったのですね。

教えて頂いた
msg.setText(message,"ISO-2022-JP");
msg.setHeader("Content-Transfer-Encoding", "7bit");
でうまくいきました
1

スキルアップ/キャリアアップ(JOB@IT)