JavaMailでメール受信をしたら、FromやらSubjectやらヘッダ情報がnull
2009年4月 7日(火) 17:48 JST
JDK1.6.0.11とJavaMail1.4.1でPOP受信のコードを書いていたんですが、いくつか特定のメールだけ、SubjectやMessage-ID、Fromまでもが「null」になってしまう現象。
JDKとJavaMailのバージョンを上げたり下げたりしてみても・・・解決せず。
ソースはこちら。
// フォルダーを開きます
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_WRITE);
// メッセージの取得
Message[] planeMessages = null;
planeMessages = folder.getMessages();
// メール内容の取得・格納
Message msg = planeMessages[1];
String subject = msg.getSubject(); ←これがnull
間違えように無いほどにシンプル。
・・・getSubject()してるだけなので、nullが帰ってくるとお手上げです。
JavaMailのソースコードはなんかCVSで公開されてるんで入手がちょっと面倒。
ISO-2022-JPでデコードするのに失敗するケースは良くあるそうなのですが、、、
そういうケースでも=?iso-2022-jp?B?Gy=?=とか生データはゲットできるのが前提です。
nullになってしまっては!!ヌルポ!!
そしてこちらのサイト「JavaMail完全解説」にあったラッパコードを眺めていて、
public SKMessage(InputStream in) throws MessagingException {
super(Session.getDefaultInstance(System.getProperties(), null), in);
}
みたいな、コンストラクタがあって。
なんかインプットストリームからオブジェクト作ってるんだよラッパー
ってところが気になったので、
いろいろ試した結果、結局のところ、なんかインプットストリーム開いてみたよ。
// フォルダーを開きます
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_WRITE);
// メッセージの取得
Message[] planeMessages = null;
planeMessages = folder.getMessages();
// メール内容の取得・格納
Message msg = planeMessages[1];
msg.getInputStream(); ← 開いただけ。
String subject = msg.getSubject();
なぜかヘッダが取れるよ!(笑)
Folderから、getMessage()なりしたタイミングだとまだ内容は取得できていないので、
その後の、getSubject()とかそのあたりの処理のバグっぽい気がする。
Messageオブジェクトと、MimeMessageはキャストして使っちゃ駄目で、
ちゃんとフォルダーから読むときから、MimeMessageとしてnewしないといけなんじゃないかと思う次第。
本当はちゃんとラッパクラス作りたいんだけど、
動くからこれでいいや(笑)