【问题标题】:Java get unread emailsJava 收到未读邮件
【发布时间】:2014-02-06 02:27:09
【问题描述】:

我正在编写一个代码来读取来自 gmail 的电子邮件。因此,当我第一次启动时,它会读取新电子邮件。没关系。但我希望当我第二次启动它时,它不会收到与以前相同的电子邮件。

例如,如果有 3 封未读电子邮件,当我第一次启动时,它会收到 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();
  }
}

【问题讨论】:

  • @CarlPalsson 不,这是客户选项。它不是 POP3 的基本功能。您可以选择消息是留在服务器上还是从服务器中删除。真正发生的是,如果您选择该选项,客户端会更加麻烦地删除消息。
  • @EJP Ahhh 感谢您的澄清!
  • 从该主机检索 gmail 电子邮件会很棘手

标签: java email pop3


【解决方案1】:

我可以建议将已读的旧邮件退回到“标记为未读”吗?

【讨论】:

  • 是的,但如果我这样做,下次我阅读它们时会收到相同的信息吗?
  • 您的意思是“标记为已读”吗?如果是这样,我怎么知道我的客户是否已经读过一些东西?我的意思是,例如,让雷鸟说,他如何知道服务器上哪些是他的新电子邮件,哪些是旧电子邮件?他是否在本地存储一个 id 或其他东西,然后检查他应该从哪里开始的服务器?
【解决方案2】:
 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", "example@gmail.com", "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();
                    }
             }
        }

【讨论】:

    【解决方案3】:

    我刚刚做了这个丑陋的例子。它起作用了,它检索了所有消息,包括那些已经看到的消息。

    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);
    }
    

    当然,您必须正确检索您需要的邮件,否则如果您有一个旧的电子邮件帐户,此代码将启动一个非常繁重的过程。

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2016-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      • 2015-10-15
      相关资源
      最近更新 更多