JavaMailでメール受信をしたら、FromやらSubjectやらヘッダ情報がnull

2018年5月7日

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しないといけなんじゃないかと思う次第。

本当はちゃんとラッパクラス作りたいんだけど、
動くからこれでいいや(笑)