225
微軟
JavaMail學習筆記(五)、使用IMAP協議接收並解析電子郵件
package org.yangxin.study.jm; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Properties; import javax.mail.Flags.Flag; import javax.mail.Folder; import javax.mail.Message; import javax.mail.Session; import javax.mail.Store; import javax.mail.internet.MimeUtility; import com.sun.mail.imap.IMAPMessage; /** * <b>使用IMAP協議接收郵件</b><br/> * <p>POP3和IMAP協議的區別:</p> * <b>POP3</b>協議允許電子郵件客戶端下載服務器上的郵件,但是在客戶端的操作(如移動郵件、標記已讀等),不會反饋到服務器上,<br/> * 比如通過客戶端收取了郵箱中的3封郵件並移動到其它文件夾,郵箱服務器上的這些郵件是沒有同時被移動的。<br/> * <p><b>IMAP</b>協議提供webmail與電子郵件客戶端之間的雙向通信,客戶端的操作都會同步反應到服務器上,對郵件進行的操作,服務 * 上的郵件也會做相應的動作。比如在客戶端收取了郵箱中的3封郵件,並將其中一封標記為已讀,將另外兩封標記為刪除,這些操作會 * 即時反饋到服務器上。</p> * <p>兩種協議相比,IMAP 整體上為用戶帶來更為便捷和可靠的體驗。POP3更易丟失郵件或多次下載相同的郵件,但IMAP通過郵件客戶端 * 與webmail之間的雙向同步功能很好地避免了這些問題。</p> */ public class IMAPReceiveMailTest { public static void main(String[] args) throws Exception { // 準備連接服務器的會話信息 Properties props = new Properties(); props.setProperty("mail.store.protocol", "imap"); props.setProperty("mail.imap.host", "imap.163.com"); props.setProperty("mail.imap.port", "143"); // 創建Session實例對象 Session session = Session.getInstance(props); // 創建IMAP協議的Store對象 Store store = session.getStore("imap"); // 連接郵件服務器 store.connect("xyang0917@163.com", "123456abc"); // 獲得收件箱 Folder folder = store.getFolder("INBOX"); // 以讀寫模式打開收件箱 folder.open(Folder.READ_WRITE); // 獲得收件箱的郵件列表 Message[] messages = folder.getMessages(); // 打印不同狀態的郵件數量 System.out.println("收件箱中共" + messages.length + "封郵件!"); System.out.println("收件箱中共" + folder.getUnreadMessageCount() + "封未讀郵件!"); System.out.println("收件箱中共" + folder.getNewMessageCount() + "封新郵件!"); System.out.println("收件箱中共" + folder.getDeletedMessageCount() + "封已刪除郵件!"); System.out.println("------------------------開始解析郵件----------------------------------"); // 解析郵件 for (Message message : messages) { IMAPMessage msg = (IMAPMessage) message; String subject = MimeUtility.decodeText(msg.getSubject()); System.out.println("[" + subject + "]未讀,是否需要閱讀此郵件(yes/no)?"); BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String answer = reader.readLine(); if ("yes".equalsIgnoreCase(answer)) { POP3ReceiveMailTest.parseMessage(msg); // 解析郵件 // 第二個參數如果設置為true,則將修改反饋給服務器。false則不反饋給服務器 msg.setFlag(Flag.SEEN, true); //設置已讀標誌 } } // 關閉資源 folder.close(false); store.close(); } }
測試結果:
最後更新:2017-04-02 16:47:41