- PR -

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

投稿者投稿内容
ショウフウ
会議室デビュー日: 2006/02/28
投稿数: 6
投稿日時: 2006-02-28 23:45
うまくいきました(涙

ありがとうございます、coasmさん、Edossonさん。

よくはわかりませんが、activation.jar、mailapi.jarなどのjarファイルを全て最新版(古かったかもしれなかったので)のものにし、再度クラスパスを通してプロジェクトのリビルドしました。
その後実行したところ、件名を日本語表示することができました。

お騒がせしました。

一応最終形のソースをのせておきます。

-----
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);
  session.setDebug(true);
  try {
  // 送信先(TOのほか、CCやBCCも設定可能)
  objMsg.setRecipients(Message.RecipientType.TO,"eeeeeeee@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",
   "aaaaaa", // userid
   "bbbbbb" // password
  );
  transport.sendMessage(objMsg, objMsg.getAllRecipients());
  transport.close();
 } catch (UnsupportedEncodingException e) {
  e.printStackTrace();
 } catch (MessagingException e) {
  e.printStackTrace();
 }
}
coasm
大ベテラン
会議室デビュー日: 2001/11/26
投稿数: 237
投稿日時: 2006-03-01 00:02
残念ながら、それは「たまたま」上手くいっているように見えるだけかもしれません。
メールのプロパティを確認してください。

正しい形は、元データが「メールテスト」なら、

Subject: =?ISO-2022-JP?B?GyRCJWEhPCVrJUYlOSVIGyhC?=

です。

ほとんどのメールサーバはRFCに違反したエンコードのメールでも通してくれるので、
変なエンコードをしていても正しく読める場合がけっこうあります。
テスト環境で正しく読めたからといって安心していると、「送り先によっては化ける」
という事態になります。

繰り返しますが、文字エンコードに関しては「読める」「読めない」ではなくて、
「期待されるエンコード」と「実際に送信されるエンコード」から判断するようにしましょう。



さいくろう
大ベテラン
会議室デビュー日: 2005/11/19
投稿数: 170
お住まい・勤務地: 川崎市
投稿日時: 2006-03-01 00:21
試しにひとつ、表題と本文だけでやってみたら?
ヘッダーには何も入れないの。
ヘッダーにあれやこれや設定を入れるの、このスレでは誰も触れてないし。
ショウフウ
会議室デビュー日: 2006/02/28
投稿数: 6
投稿日時: 2006-03-01 00:28
デバッグ文を確認したところ、以下のようにSubjectがなってました。

Subject: =?iso-2022-jp?B?GyRCJWEhPCVrJUYlOSVIGyhC?=

上手くいっているようです。
重ね重ね、ありがとうございます。

> 試しにひとつ、表題と本文だけでやってみたら?
> ヘッダーには何も入れないの。
> ヘッダーにあれやこれや設定を入れるの、このスレでは誰も触れてないし。

ヘッダーをはずした(以下をコメントアウト)ソースでも、件名、Bodyともに、
受信メールにて日本語表示を確認できました。

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

Eclipse でのデバッグ文 -----

Subject: =?iso-2022-jp?B?GyRCJWEhPCVrJUYlOSVIGyhC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: quoted-printable

=1B$B$3$s$K$A$O
.
250 Mail queued for delivery.
ショウフウ
会議室デビュー日: 2006/02/28
投稿数: 6
投稿日時: 2006-03-02 00:19
原因がおそらくわかりましたので、一応報告しておきます。

geronimo-j2ee_1.4_spec-1.0.jarというjarファイルが関係あるようです。

自分のEclipseプロジェクトのクラスパスに、上記jarファイルが入っていたのですが、ビルドクラスパスの優先順位が、JavaMailのjarファイルよりも高く、MimeUtilityなどのメソッドを使用する際に、geronimo-j2ee_1.4_spec-1.0側のAPIを使用していたようです。

そのため、なぜかうまくエンコードなどが行えてなかったようです。

優先順位を、JavaMailのjarファイルをgeronimo-j2ee_1.4_spec-1.0より高くすると、メールを正常(文字化け?しない)に送ることができました。

一応報告でした。

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