SQLの窓

2018年10月24日


Javamail で IMAP 受信

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());
		}
			
	}

}





posted by lightbox at 2018-10-24 16:29 | java : 通信関連 | このブログの読者になる | 更新情報をチェックする
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり