javamail官方文檔:https://javaee.github.io/javamail/docs/api/
在 JavaMail 中,可以不像上面文章那樣子調用 Folder.getMessages() 方法把郵件夾中的所有都返回,而是可以根據給定的一些條件過濾搜索出我們想要的郵件,之后再對進行獲得的郵件進行操作。
要使用搜索過濾功能,必須用到 java.mail.search 包中的 SearchTerm 抽象類。在這個包中,我們可以使用其他具有不同組合關系的子類和具有不同搜索條件的類來進行操作。JavaMail在javax.mail.search包中定義了一個用於創建搜索條件的SearchTerm類,應用程序創建SearchTerm類的實例對象后,就可以調用Folder.Search(SearchTerm st)方法搜索郵件夾中符合搜索條件的所有郵件。SearchTerm是一個抽象類,JavaMail提供了22個實現子類以幫助應用程序創建不同的搜索條件,這22個類可分為兩大類型:
1、用於創建邏輯組合關系的類
AND條件(AndTerm類)
OR條件(OrTerm類)
NOT條件(NotTerm類)
Comparison條件(ComparisonTerm類)
都是 SearchTerm 抽象類的具體子類;
2、用於創建具體搜索條件的類
DATE條件(SentDateTerm、ReceivedDateTerm類)
CONTENT條件(BodyTerm類)
HEADER條件(FromStringTerm、RecipientStringTerm、SubjectTerm類等)
DateTerm 類、BodyTerm 類、HeaderTerm 類,這幾個都是抽象類,具體應用時應該由其對應的子類來實現。
下面通過實現來說明以上類的用法及含義:
1、搜索發件人為"BOSS直聘",而且郵件正文包含“Java工程師“的所有郵件
SearchTerm andTerm = new AndTerm( new FromStringTerm("智聯招聘"), new BodyTerm("java工程師"));
Message[] messages = folder.search(andTerm);
2、搜索發件人為“智聯招聘“或主題包含“最新職位信息“的所有郵件
SearchTerm orTerm = new OrTerm( new FromStringTerm("BOSS直聘"), new SubjectTerm("最新職位信息"));
Message[] messages = folder.search(orTerm);
3、搜索周一到今天收到的的所有郵件
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_WEEK, calendar.get(Calendar.DAY_OF_WEEK - (Calendar.DAY_OF_WEEK - 1)) - 1);
Date mondayDate = calendar.getTime();
SearchTerm comparisonTermGe = new SentDateTerm(ComparisonTerm.GE, mondayDate);
SearchTerm comparisonTermLe = new SentDateTerm(ComparisonTerm.LE, new Date());
SearchTerm comparisonAndTerm = new AndTerm(comparisonTermGe, comparisonTermLe);
Message[] messages = folder.search(comparisonAndTerm);
4、搜索大於或等200KB的所有郵件
int mailSize = 1024 * 200; SearchTerm intComparisonTerm = new SizeTerm(IntegerComparisonTerm.GE, mailSize);
Message[] messages = folder.search(intComparisonTerm);
ComparisonTerm類常用於日期和數字比較中,它使用六個常量EQ(=)、GE(>=)、GT(>)、LE(<=)、LT(<)、NE(!=)來表示六種不同的比較操作。
//如果需要在取得郵件數后將郵件置為已讀則這里需要使用READ_WRITE,否則READ_ONLY就可以
inbox.open(Folder.READ_WRITE);
// Message messages[] = inbox.getMessages(); //獲取所有郵件
//建立搜索條件FlagTerm,這里FlagTerm繼承自SearchTerm,也就是說除了獲取未讀郵
//件的條件還有很多其他條件同樣繼承了SearchTerm的條件類,像根據發件人,主題搜索等,
// 還有復雜的邏輯搜索類似:
//
// SearchTerm orTerm = new OrTerm(
// new FromStringTerm(from),
// new SubjectTerm(subject)
// );
//
FlagTerm ft = new FlagTerm(new Flags(Flags.Flag.SEEN), false); //false代表未讀,true代表已讀
/**
* Flag 類型列舉如下
* Flags.Flag.ANSWERED 郵件回復標記,標識郵件是否已回復。
* Flags.Flag.DELETED 郵件刪除標記,標識郵件是否需要刪除。
* Flags.Flag.DRAFT 草稿郵件標記,標識郵件是否為草稿。
* Flags.Flag.FLAGGED 表示郵件是否為回收站中的郵件。
* Flags.Flag.RECENT 新郵件標記,表示郵件是否為新郵件。
* Flags.Flag.SEEN 郵件閱讀標記,標識郵件是否已被閱讀。
* Flags.Flag.USER 底層系統是否支持用戶自定義標記,只讀。
*/