2014-01-16 69 views
6

我正在編寫一個從gmail讀取電子郵件的代碼。所以我第一次啓動時,它會讀取新的電子郵件。沒關係。但是,當我第二次啓動它時,我想要的是它沒有收到它之前得到的同樣的電子郵件。Java獲取未讀電子郵件

例如,如果有3個未讀電子郵件,當我第一次啓動時,它會得到3個。但當我再次啓動時,它什麼也沒有(因爲它已經有3個)。如果有新的電子郵件,我再次啓動它,它應該只獲得最後一個,而不是第一個。

希望我很清楚。

我使用http://alvinalexander.com/java/javamail-search-unseen-unread-messages-mailbox-pop3

package javamailtests; 

import java.io.InputStream; 
import java.util.Calendar; 
import java.util.GregorianCalendar; 
import java.util.Properties; 
import javax.mail.*; 
import javax.mail.internet.*; 
import javax.mail.search.*; 

public class JavaMailSearchInbox { 

    public static void main(String args[]) throws Exception { 

    // mail server info 
    String host = "pop.gmail.com"; 
    String user = "USER"; 
    String password = "PASS"; 

    // connect to my pop3 inbox in read-only mode 
    Properties properties = System.getProperties(); 
    Session session = Session.getDefaultInstance(properties); 
    Store store = session.getStore("pop3"); 
    store.connect(host, user, password); 
    Folder inbox = store.getFolder("inbox"); 
    inbox.open(Folder.READ_ONLY); 

    // search for all "unseen" messages 
    Flags seen = new Flags(Flags.Flag.SEEN); 
    FlagTerm unseenFlagTerm = new FlagTerm(seen, false); 
    Message messages[] = inbox.search(unseenFlagTerm); 

    if (messages.length == 0) System.out.println("No messages found."); 

    for (int i = 0; i < messages.length; i++) { 
     // stop after listing ten messages 
     if (i > 10) { 
     System.exit(0); 
     inbox.close(true); 
     store.close(); 
     } 

     System.out.println("Message " + (i + 1)); 
     System.out.println("From : " + messages[i].getFrom()[0]); 
     System.out.println("Subject : " + messages[i].getSubject()); 
     System.out.println("Sent Date : " + messages[i].getSentDate()); 
     System.out.println(); 
    } 

    inbox.close(true); 
    store.close(); 
    } 
} 
+1

@CarlPalsson號這是一個客戶端選項。這不是POP3的基本特徵。您可以選擇是將消息保留在服務器還是從服務器上刪除。真正發生的事情是,如果您選擇該選項,客戶端會更加麻煩地刪除郵件。 – EJP

+0

@EJP Ahhh謝謝澄清! – 8bitcat

+0

從該主機檢索gmail電子郵件將變得棘手 – Behe

回答

0

我可以建議返回那名讀「標記爲未讀」舊消息的代碼?

+0

是的,但如果我這樣做,下次我閱讀它們時,我會得到相同的消息嗎? – user1700594

+0

你的意思是「標記爲已讀」?如果是這樣,我怎麼知道我的客戶是否已經閱讀過某些東西?我的意思是說,例如,讓我們說雷鳥,他是如何知道服務器上的新電子郵件是什麼和舊的?他是否在本地存儲了一個id或某個東西,然後從他應該從哪裏開始檢查服務器? – user1700594

0
import java.util.*; 
import javax.mail.*; 

    public class ReadingEmail { 
    public static void main(String[] args) { 
    Properties props = new Properties(); 
    props.setProperty("mail.store.protocol", "imaps"); 
    try { 
     Session session = Session.getInstance(props, null); 
     Store store = session.getStore(); 
    store.connect("imap.gmail.com", "[email protected]", "Password"); 

     Folder inbox = store.getFolder("INBOX"); 
     inbox.open(Folder.READ_ONLY); 
     Message msg = inbox.getMessage(inbox.getMessageCount()); 
     Address[] in = msg.getFrom(); 
     for (Address address : in) { 
      System.out.println("FROM:" + address.toString()); 
     } 
     Multipart mp = (Multipart) msg.getContent(); 
     BodyPart bp = mp.getBodyPart(0); 
     System.out.println("SENT DATE:" + msg.getSentDate()); 
     System.out.println("SUBJECT:" + msg.getSubject()); 
     System.out.println("CONTENT:" + bp.getContent()); 
      } catch (Exception mex) 
     mex.printStackTrace(); 
        } 
      } 
     } 
1

我剛剛做出了這個醜陋的例子。它的工作,它檢索所有的消息,包括那些已經看到。

Properties props = System.getProperties(); 
props.setProperty("mail.store.protocol", "imaps"); 
Session session = Session.getDefaultInstance(props, null); 

try { 
    Store store = App.session.getStore("imaps"); 
    store.connect("imap-mail.outlook.com", "email", "password"); 

    Folder folder = App.store.getFolder("Inbox"); 
    folder.open(Folder.READ_ONLY); 
    Message[] msgs = folder.getMessages(); 

    for (Message msg : msgs) { 
     System.out.println(msg.getSubject()); 
    } 
}catch(MessagingException e) { 
    System.out.println(e); 
} 

當然,你必須正確地獲取你需要的郵件,否則,如果你有一箇舊的電子郵件帳戶,該代碼將啓動一個非常沉重的過程。

我希望這可能是有幫助的。

相關問題