https://javaee.github.io/javamail/ マルチパートは、最大3つまでチェックして、2番目か3番目に添付ファイルがあれば保存します。 2番目が HTML メールの場合は、標準出力に出力します。 ヘッダ部分は、メッセージ番号で取得しますが、違った処理を行う為に UID に変換しておいて、本文の取得には UID を使用します。 メッセージボックス(フォルダ) にメッセージをコピーまたは移動している場合は、日付順には並びません。自分でソートする必要があります。
import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Properties; import javax.mail.Address; import javax.mail.Folder; import javax.mail.Message; import javax.mail.Multipart; import javax.mail.Part; import javax.mail.Session; import javax.mail.Store; import javax.mail.UIDFolder; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeUtility; public class Main { public static void main(String[] args) { try { // http://connector.sourceforge.net/doc-files/Properties.html Properties props = System.getProperties(); // セッション Session session = Session.getInstance(props, null); // IMAP で SSL を使用する Store imap4 = session.getStore("imaps"); // 接続 imap4.connect("さくらユーザ.sakura.ne.jp", 993, "ユーザ@さくらユーザ.sakura.ne.jp", "パスワード"); System.out.println(imap4.getURLName().toString()); // https://stackoverflow.com/questions/11435947/how-do-i-uniquely-identify-a-java-mail-message-using-imap Folder folder = imap4.getFolder("INBOX"); UIDFolder uf = (UIDFolder)folder; folder.open(Folder.READ_ONLY); // 全てのメッセージ int totalMessages = folder.getMessageCount(); System.out.println("Total messages = " + totalMessages); // 新しいメッセージ int newMessages = folder.getNewMessageCount(); System.out.println("New messages = " + newMessages); // メッセージの一覧を取得 Message[] msgs = folder.getMessages(); // メッセージがコピー・移動されていると日付順とは限らない for (int i = msgs.length-1; i >= 0; i--) { // UID を取得 Long messageId = uf.getUID(msgs[i]); System.out.println("UID = " + messageId); // From Address[] address = msgs[i].getFrom(); String addressText = ""; if (address != null) { // address[0].toString() のままでは正しく表示されない addressText = MimeUtility.decodeText(address[0].toString()); } System.out.println("Address = " + addressText); // Subject String subjectText = MimeUtility.decodeText(msgs[i].getSubject()); System.out.println("Subject = " + subjectText); // 受信日時 Date date = msgs[i].getSentDate(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); String dateText = sdf.format(date); System.out.println("Date = " + dateText); // 本文( UID より取得 ) Message msg = uf.getMessageByUID(messageId); Part part = msg; String bodyText = ""; if (part.isMimeType("text/plain")) { bodyText = part.getContent().toString(); } else if (part.isMimeType("multipart/*")) { Multipart mp = (Multipart)part.getContent(); // マルチパートの先頭 bodyText = mp.getBodyPart(0).getContent().toString(); if ( mp.getBodyPart(1).isMimeType("text/html") ) { String htmlText = mp.getBodyPart(1).getContent().toString(); System.out.println("HtmlText = " + htmlText); } String filename = ((Part)mp.getBodyPart(1)).getFileName(); // ファイル名があったら保存 if ( filename != null ) { System.out.println("ファイル名 = " + filename); File file = new File(filename); ((MimeBodyPart)mp.getBodyPart(1)).saveFile(file); } // 3つ目がある場合 if ( mp.getCount() > 2 ) { filename = ((Part)mp.getBodyPart(2)).getFileName(); // ファイル名があったら保存 if ( filename != null ) { System.out.println("ファイル名 = " + filename); File file = new File(filename); ((MimeBodyPart)mp.getBodyPart(2)).saveFile(file); } } } System.out.println("Body = " + bodyText); } folder.close(); imap4.close(); } catch (Exception ex) { // handle any errors System.out.println("Exception: " + ex.getMessage()); } } }