1. 程式人生 > >java mail 搜尋、過濾接收郵件,刪除郵件

java mail 搜尋、過濾接收郵件,刪除郵件

在 JavaMail 中,可以不像上面文章那樣子呼叫 Folder.getMessages() 方法把郵件夾中的所有都返回,而是可以根據給定的一些條件過濾搜尋出我們想要的郵件,之後再對進行獲得的郵件進行操作。現在的郵箱大多都支援郵件搜尋這一功能了。

要使用搜索過濾功能,必須用到 java.mail.search 包中的 SearchTerm 抽象類。在這個包中,我們可以使用其他具有不同組合關係的子類和具有不同搜尋條件的類來進行操作。

1、邏輯組合關係的子類有:AndTerm 類、OrTerm 類、NotTerm 類、ComparisonTerm 類,它們都是 SearchTerm 抽象類的具體子類;

2、具體搜尋條件的類有:DateTerm 類、BodyTerm 類、HeaderTerm 類,這幾個都是抽象類,具體應用時應該由其對應的子類來實現。

看一些 JavaMail 幫助文件中關於 java.mail.search 包中的類集:

程式要求:

搜尋出 [email protected] 郵箱中發件人地址為 [email protected] ,主題為 “測試1”的郵件,並由使用者輸入是否設定刪除標記,在斷開網路連線(即程式執行結束)之後 POP3 伺服器會將設定有刪除標記的郵件刪除掉。而設定刪除標記,需要用到 Message.setFlag() 方法。

程式碼實現:

  1. import
     java.io.BufferedReader;  
  2. import java.io.InputStreamReader;  
  3. import java.util.Properties;  
  4. import javax.mail.Flags;  
  5. import javax.mail.Folder;  
  6. import javax.mail.Message;  
  7. import javax.mail.Session;  
  8. import javax.mail.Store;  
  9. import javax.mail.search.AndTerm;  
  10. import javax.mail.search.FromStringTerm;  
  11. import javax.mail.search.SearchTerm;  
  12. import javax.mail.search.SubjectTerm;  
  13. /**  
  14.  * 使用 java.mail.search 包中的 SearchTerm 類  
  15.  * 在接收郵件時進行組合搜尋、過濾  
  16.  * @author haolloyin  
  17.  */ 
  18. public class SearchMails {  
  19.     public static void main(String[] args) throws Exception {  
  20.         // 連線pop3伺服器的主機名、協議、使用者名稱、密碼  
  21.         String pop3Server = "pop3.126.com";  
  22.         String protocol = "pop3";  
  23.         String user = "testhao";  
  24.         String pwd = "123456";  
  25.         // 建立一個有具體連線資訊的Properties物件  
  26.         Properties props = new Properties();  
  27.         props.setProperty("mail.store.protocol", protocol);  
  28.         props.setProperty("mail.pop3.host", pop3Server);  
  29.         // 使用Properties物件獲得Session物件  
  30.         Session session = Session.getInstance(props);  
  31.         session.setDebug(true);  
  32.         // 利用Session物件獲得Store物件,並連線pop3伺服器  
  33.         Store store = session.getStore();  
  34.         store.connect(pop3Server, user, pwd);  
  35.         // 獲得郵箱內的郵件夾Folder物件,以"讀-寫"開啟  
  36.         Folder folder = store.getFolder("inbox");  
  37.         folder.open(Folder.READ_WRITE);  
  38.         // 搜尋發件人為 [email protected] 和主題為"測試1"的郵件  
  39. SearchTerm st = new AndTerm(  
  40.                 new FromStringTerm("[email protected]"),  
  41.                 new SubjectTerm("測試1"));  
  42. //      // 獲得郵件夾Folder內的所有郵件Message物件  
  43. //      Message [] messages = folder.getMessages();  
  44.         // 不是像上面那樣直接返回所有郵件,而是使用Folder.search()方法  
  45.         Message [] messages = folder.search(st);  
  46.         int mailCounts = messages.length;  
  47.         System.out.println("搜尋過濾到" + mailCounts + " 封符合條件的郵件!");  
  48.         for(int i = 0; i < mailCounts; i++) {  
  49.             String subject = messages[i].getSubject();  
  50.             String from = (messages[i].getFrom()[0]).toString();  
  51.             System.out.println("第 " + (i+1) + "封郵件的主題:" + subject);  
  52.             System.out.println("第 " + (i+1) + "封郵件的發件人地址:" + from);  
  53.             System.out.println("是否刪除該郵件(yes/no)?:");  
  54.             BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
  55.             String input = br.readLine();  
  56.             if("yes".equalsIgnoreCase(input)) {  
  57.                 // 直接輸出到控制檯中  
  58. //              messages[i].writeTo(System.out);  
  59.                 // 設定刪除標記,一定要記得呼叫saveChanges()方法  
  60. messages[i].setFlag(Flags.Flag.DELETED, true);  
  61.                 messages[i].saveChanges();  
  62.                 System.out.println("成功設定了刪除標記!");  
  63.             }             
  64.         }  
  65.         // 關閉連線時設定了刪除標記的郵件才會被真正刪除,相當於"QUIT"命令  
  66.         folder.close(false);  
  67.         store.close();  
  68.     }  

執行過程:

糟糕的是,不同 POP3  伺服器對於郵件的訪問許可權的限制是不同的,在這裡,pop3.126.com 伺服器就不允許修改郵件了。所以,刪除失敗!!!