2014-01-16 71 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); 
} 

当然,你必须正确地获取你需要的邮件,否则,如果你有一个旧的电子邮件帐户,该代码将启动一个非常沉重的过程。

我希望这可能是有帮助的。

相关问题