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

JavaMail 文字化け Body → ○, Subject → ×

投稿者投稿内容
ショウフウ
会議室デビュー日: 2006/02/28
投稿数: 6
投稿日時: 2006-02-28 02:42
JavaMailの文字化けに関する質問です。

Body部分は文字化けされず、Subjectの部分が文字化けしてしまいます。

以前の投稿にてよく文字化けに関することが記載されていたため、それを参考に
いろいろ試してみましたがうまくいきません。

以下は実装したソースの一部を抜粋したものです。

-----
MimeMessage objMsg=new MimeMessage(session);
           :
objMsg.setSubject("メールテスト","ISO-2022-JP");
objMsg.setHeader("Content-Transfer-Encoding", "7bit");
objMsg.setHeader("Content-Type", "text/plain; charset=iso-2022-jp");
           :
-----

SubjectにISO-2022-JPを指定、及び、Headerに"Content-Transfer-Encoding"や、 "Content-Type"を指定しても文字化けしてしまいます。
ちなみに受信した件名は、以下ような文字列になってしまいます。

"メールテスト" → "[eXg"

以下ようなプログラムにてメールを送信しているのですが、何か実装方法が
間違っているのでしょうか?

------ 以下、実装したプログラム ------

public class MailTest {

public static void main(String[] args) {
Properties objPrp=new Properties();
objPrp.put("mail.smtp.host","smtp.nifty.com"); // SMTPサーバ名
objPrp.put("mail.host","smtp.nifty.com"); // 接続するホスト名
objPrp.put("mail.smtp.auth", "true"); // POP Before SMTP 対象
// メールセッションを確立
Session session=Session.getDefaultInstance(objPrp,null);
// 送信メッセージを生成
MimeMessage objMsg=new MimeMessage(session);
try {
// 送信先(TOのほか、CCやBCCも設定可能)
objMsg.setRecipients(Message.RecipientType.TO,"aaaaaaaaa@nifty.com");
// Fromヘッダ
InternetAddress objFrm=new InternetAddress("YYYYYYYY@nifty.com","Y.Yamada");

objMsg.setFrom(objFrm);
// 件名
objMsg.setSubject("メールテスト","ISO-2022-JP");

// 本文
objMsg.setText("こんにちは","ISO-2022-JP");

objMsg.setHeader("Content-Type", "text/plain; charset=iso-2022-jp");
objMsg.setHeader("Content-Transfer-Encoding", "7bit");

// メール送信
Transport transport = session.getTransport("smtp");
transport.connect(
"smtp.nifty.com",
"xxxxxxxx", // userid
"yyyyyyyy" // password
);
transport.sendMessage(objMsg, objMsg.getAllRecipients());
transport.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
れいずん
会議室デビュー日: 2005/11/11
投稿数: 15
投稿日時: 2006-02-28 10:28
mimeMessage.setSubject( MimeUtility.encodeText( "件名だ!!", "ISO-2022-JP", "B");

MimeUtility.encodeText()でググればいいことがあるかも

B:日本語とか
Q:ASCIIのみの場合


Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2006-02-28 10:39
この掲示板にもいくらでも情報がありますが。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=27772&forum=12
しかし、bodyがそのまま通ってるというのが解せない。
Outlookがよけいなことしてるとか、クライアントの自動判別に過ぎないとか、
そういうことないですか?
ショウフウ@hotmail
会議室デビュー日: 2006/02/28
投稿数: 1
投稿日時: 2006-02-28 14:59
> この掲示板にもいくらでも情報がありますが。
> http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=27772&forum=12

はい、すでにそちらも参照しMimeUtilityの方法も試しております。
私の書き方が悪かったです。申し訳ありません。

> objMsg.setSubject("メールテスト","ISO-2022-JP");
          ↓
>mimeMessage.setSubject( MimeUtility.encodeText( "件名だ!!", "ISO-2022-JP", "B");

念のため上記も変更してMimeUtility.encodeTextにしてみたのですが、やはりうまくいきませんでした。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=26756&forum=12

上記掲示板では、以下のような記載が正しいとあるため試したしだいです。

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

ちなみに、session.setDebug(true);を入れログ(自分の場合は
Eclipse コンソール)を参照すると、文字化けしているsubject
は正常に表示され、bodyの部分は文字化けしてでているようです。

-------
subject:件名だ!!
content-type:text/plain; charset=iso-2022-jp
content-transfer-encoding:7bit

$B$3$s$K$A$O
.
250 2.5.0 Ok.
-------

> Outlookがよけいなことしてるとか、クライアントの自動判別に過ぎないとか、
> そういうことないですか?

ちなみに、メールクライアントは、秀丸メール、Outlookで試してみました。
クライアントの自動判別も考慮に入れ調べてみたいと思います。
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2006-02-28 15:28
Content-Typeの設定をしてないからだと思います。
この場合の設定というのは、Headerに対してのものではなく、
SubjectとTextのそれぞれに対するものです。

http://java.sun.com/j2ee/sdk_1.3/ja/techdocs/api/javax/mail/internet/MimeMessage.html#setSubject(java.lang.String,%20java.lang.String)
http://java.sun.com/j2ee/sdk_1.3/ja/techdocs/api/javax/mail/internet/MimeMessage.html#setText(java.lang.String,%20java.lang.String)

テキストを設定するときに、あわせてcharsetも放り込んでみてください。
テキストはもちろんエンコード済みのものを。
coasm
大ベテラン
会議室デビュー日: 2001/11/26
投稿数: 237
投稿日時: 2006-02-28 22:52
引用:

ちなみに受信した件名は、以下ような文字列になってしまいます。

"メールテスト" → "[eXg"



この化け方から判断すると、subjectをShift_JISでエンコードして送信しています。

引用:

subject:件名だ!!
content-type:text/plain; charset=iso-2022-jp
content-transfer-encoding:7bit

$B$3$s$K$A$O



これも明らかに変です。
bodyは、「こんにちは」という文字列が正しくISO-2022-JPでエンコードされていますが、
subjectの方は、プラットホームのデフォールトエンコーディングのままになっています。
見た目とは逆に、正常なのは本文の方で、化けているのはsubjectの方です。

提示されているソースコードから推測される挙動と一致しないので、
ソースとclassファイルの対応がちゃんと取れているか
(修正前のclassファイルを実行してないか)
確認してみましょう。

文字化けに関しては、「読める」「読めない」ではなくて、
「期待されるエンコード」と「実際に送信されるエンコード」から判断しないと、
何をしているか判らなくなってしまいます。
ショウフウ
会議室デビュー日: 2006/02/28
投稿数: 6
投稿日時: 2006-02-28 22:56
何度も質問して申し訳ありません。

> この場合の設定というのは、Headerに対してのものではなく、
> SubjectとTextのそれぞれに対するものです。

ですが、以下のような指定の仕方でしょうか?
※Subjectのみ現状文字化けしているため、setSubjectを記載しております。

 objMsg.setSubject(
   MimeUtility.encodeText( "メールテスト", "ISO-2022-JP", "B"),
   "text/plain; charset=iso-2022-jp"
 );

上記指定の方法が正しいかわかりませんが、変わらず

"メールテスト" → "[eXg"

を件名に表示してしまいます。
ちなみに、"text/plain; charset=iso-2022-jp" を "iso-2022-jp"にしても同様でした。

MimeUtility.encodeTextの出力内容を確かめるべく、以下systemoutにて出力した結果も、"メールテスト"でした。

-----
String subject = MimeUtility.encodeText( "メールテスト", "ISO-2022-JP", "B");
System.out.println("subject = " + subject)
-----

受け取ったメールのプロパティは以下のようなものです。

----------
YYYYYYYY@nifty.com
To: aaaaaaaaa@nifty.com
Subject: [eXg
Date: Tue, 28 Feb 2006 22:44:58 +0900
Return-Path: YYYYYYYY@nifty.com
Received: by mbox55.nifty.com id 440453df172515;
Tue, 28 Feb 2006 22:45:03 +0900
Received: from UUUUUU (TTTTTT.adsl.ppp.infoweb.ne.jp [ZZZ.ZZZ.ZZZ.ZZZ]) (authenticated)
by aaaaaa.nifty.com with ESMTP id aaaaaaaa
for <aaaaaaaaa@nifty.com>; Tue, 28 Feb 2006 22:44:58 +0900
Authentication-Results: userg504.nifty.com from=YYYYYYYY@nifty.com; sender-id=neutral; spf=neutral
DomainKey-Signature: a=rsa-sha1; s=userg504; d=nifty.com; c=simple; q=dns;
b=k+zsm9bAb4/0RQfBaL8c+D47Fig2pKBy/EYP8pbiE2s+B9E2/8TGIejSiKO5o82B8
+OEgPvbUppskwQaJWGusw==
Message-Id: <200602281344.k1SDivfP014809@userg504.nifty.com>
content-type: text/plain; charset=iso-2022-jp
content-transfer-encoding: 7bit
Status: U
X-UIDL: 1141134303.5925.mailbox

こんにちは
----------
ショウフウ
会議室デビュー日: 2006/02/28
投稿数: 6
投稿日時: 2006-02-28 23:13
すみません、行き違いでコメントしていました。
確かめてみます。

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