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()); } } }
|
【java : 通信関連の最新記事】
- Java : WEB上のテキストファイルを取得する
- Java11 + Visual Studio Code + JavaMail( with JavaBeans Activation Framework )
- OkHttp v3.8.0 jar( と okio 1.13.0.jar ) を Eclipse のプロジェクトに追加して一般的な POST 送信を行う
- java をコマンドプロンプトからビルドして実行するサンプル。( メール送信が初心者には楽しいはず )
- Eclipse + JFace : HttpURLConnection で GET
- javamail でメール送信と、付属のバッチビルド用のスクリプトの解説
- Java : バッチでテストする Twiiter API の『検索処理』
- google-gson(Java) を使って、JSON を 定義済みクラスのオブジェクトに一括変換する
- Java : RSS(Document) から、item の中の先頭の指定した要素の値を取得するクラス
- google-gson で、JSON 文字列の構成要素の一覧を取り出す処理
- java : Apache commons-net-3.0.1 を使ってごく自然に FTPS(セキュア) でファイルのアップロード/ダウンロード
- javamail 1.4.4 : IMAP で、ユーザから別のユーザへメッセージを全て(範囲指定で)コピーする
- javamail 1.4.4 : IMAP のメール受信イベントでメールを受け取ったら処理を行う
- Java : WEB 上の XML データの内容を取得する