« 同義語検索機能 | Main | unboundをインストールしてみた »

2008.12.15

JavaでMail送信

TeedaとJavaMailと千葉の仕事と にコメントしたメール送信の際の文字コードの件ですが、私のところでは以下のような感じで書いています。もしかしたら完全な対応はできていないかも知れませんが、今のところ問題なく動いているようです(^^;

public MimeMessage getMimeMessage(Session session) {
  MimeMessage mimeMessage = new MimeMessage(session);
  try {
    if (from != null) mimeMessage.addFrom(getAddresses(from));
    if (checkListContainValue(replyTo)) mimeMessage.setReplyTo(getAddresses(replyTo));
    if (checkListContainValue(to)) mimeMessage.setRecipients(RecipientType.TO, getAddresses(to));
    if (checkListContainValue(cc)) mimeMessage.setRecipients(RecipientType.CC, getAddresses(cc));
    if (checkListContainValue(bcc)) mimeMessage.setRecipients(RecipientType.BCC, getAddresses(bcc));
    
    mimeMessage.setSubject(MailUtility.encodeWordJIS(subject));
    String text = body;
    if (text.endsWith("\n")) {
      text = text + "\n";
    }
    mimeMessage.setDataHandler(new DataHandler(new JISDataSource(text)));

    //  文字コードに関するヘッダーを無条件で付加
    mimeMessage.setHeader("Content-Type","text/plain; charset=ISO-2022-JP");
    mimeMessage.setHeader("Content-Transfer-Encoding", "7bit");
    mimeMessage.setSentDate(getDate());
    mimeMessage.saveChanges();
    
    return mimeMessage;
  } catch (MessagingException e) {
    throw new RuntimeException(e);
  }
}

上記メソッドはある自作クラスの一部なので、様々なgetterを呼び出してはいますが、

  • mimeMessage.setSubject(MailUtility.encodeWordJIS(subject));
  • mimeMessage.setDataHandler(new DataHandler(new JISDataSource(text)));

のような感じで文字コードの処理を行っています。ただ、これだけでは上手く受け取れないクライアントがあったので、最終的にたどり着いた部分が

  • mimeMessage.setHeader("Content-Type","text/plain; charset=ISO-2022-JP");mimeMessage.setHeader("Content-Transfer-Encoding", "7bit");
だったような気がします。

|

« 同義語検索機能 | Main | unboundをインストールしてみた »

Java」カテゴリの記事

Comments

こんにちは。お邪魔致します。
すみません!私の記事の説明も不足していたかもしれません。実は受信の際の問題で、受信メールを解析してDBに登録するまでの過程において、なのです。

受信では厳密にRFCやMIMEのルールに沿っていないSubjectやTextも多々ありまして。MIMEで冒頭=?ISO-2022-jp?B?で始めておきながら、実は丸文字(①②)とか㈱((株))といったSJIS外字が混ざっていたりといったケースは、JavaMailやskmail.jarでもなかなか上手く処理できないんです。

とりあえずUNIXサーバなので、nkfを使用するような形で力押し変換していたりするのですが、外部プログラムを使うのはよくないのも100も承知で・・・納得できていません。

しかし、解説して頂いたソースで、何かヒントも得られるかもしれません。本当にありがとうございます!参考にさせて頂きます。

Posted by: たいむ | 2008.12.15 23:26

受信の方でしたか(^^; 早とちりしてしまい申し訳ありません。受信したメールを処理するアプリは残念ながら今のところ縁がなく、作ったことがないんですよね・・・。
Javaで実装されたメールサーバのJAMES( http://james.apache.org/ )を使ってみようかと思ったこともあったのですが、JAMESも、非英語圏においてはおそらく同じような問題が出てくるんでしょうね(結局開発内容の変更に伴い、使う機会はありませんでしたが)。
コメントをしておきながらお役に立てず申し訳ありません。

Posted by: syo | 2008.12.16 06:27

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack


Listed below are links to weblogs that reference JavaでMail送信:

» TeedaとJavaMailと千葉の仕事と [chronosphere [Time's Blog]]
たまには仕事の話も。 いまプロジェクトでは、Teeda、Seasar2という新し [Read More]

Tracked on 2008.12.15 23:28

« 同義語検索機能 | Main | unboundをインストールしてみた »