java - Folder.fetch 和 getmessages 之间的区别

标签 java jakarta-mail pop3

我正在尝试编写一个从 POP3 服务器获取电子邮件的应用程序。我最终使用的“策略”是:

  1. 获取单条消息
  2. 检查该消息是否已存在于我的数据库中
  3. 如果没有,插入它,转到1

我知道这并不完美,但是好吧......让我们立即面对一个问题:)

为丑陋的风格道歉,我受过良好的汇编和纯C程序员训练,刚刚开始使用Java,我获取单个消息的代码是(我已经删除了try/catch语句以使其更具可读性)

Properties props = new Properties();
Session session = Session.getDefaultInstance(props, null);
Store store = null;
POP3Folder folder = null;
openStaffLabel: {
    store = session.getStore(exXContainer.accounts[selectedAccount].accountType.toLowerCase());
    store.connect(host, username, password);
    folder =(POP3Folder) store.getFolder("INBOX");
    folder.open(Folder.READ_WRITE);
    int countMsg  = 0;
    countMsg = folder.getMessageCount();
    if (countMsg == 0)
        break openStaffLabel;
    message = folder.getMessages(countMsg - first + 1);
    for(int i = 0;i < messages.length;i++)
    {
        // do some stuffs with messages
    }
} // openStaffLabel:
folder.close(false);
store.close();

这似乎工作正常。然后我在互联网上发现了这段代码( here ),发布者声称该代码效率更高:

URLName url = new URLName("pop3", host, 110, "", user, password);
Session session = Session.getDefaultInstance(System.getProperties(),null);
Store store = session.getStore(url);
store.connect();
POP3Folder inbox = (POP3Folder)store.getFolder("INBOX");
inbox.open(Folder.READ_WRITE);
FetchProfile profile = new FetchProfile();
profile.add(UIDFolder.FetchProfileItem.UID);
Message[] messages = inbox.getMessages();
inbox.fetch(messages,profile);
for(int i = 0;i < messages.length;i++)
{
   // do some stuffs with messages
}

作者声称:“与之前场景的主要区别在于客户端仅下载新电子邮件”

但在他的代码中有一个 inbox.getMessages() ,如果我理解得好的话,实际上会下载所有消息。所以重点是......如果使用 getMessages 我已经获取了所有 header ,那么使用 fetch(messages,profile) 的真正优势是什么? 如果我只想下载UID,我该怎么办?

此外,如果我只想下载前 N 封邮件的 UID...可能吗?

非常感谢任何愿意提供帮助的人,我已经被这个问题困扰了一个星期了。 克里斯蒂亚诺

最佳答案

POP3 并不是最好的协议(protocol),如果您了解 POP3 协议(protocol)的功能,您就会更好地理解这一点。

使用您描述的 fetch 方法将在一次操作中获取邮箱中所有邮件的所有 UID。如果您跟踪您所看到的 UID,则可以确保只获取您未见过的消息的内容。在所有邮件的循环中使用 POP3Folder.getUID 方法来跳过您已经看到的邮件。请注意,getMessage 方法实际上并不获取消息的内容;而是获取消息的内容。在您使用另一种访问内容的方法之前,不会获取该内容。

请注意,POP3 协议(protocol)仅允许您获取单个邮件的 UID,或所有邮件的 UID。

请务必阅读 com.sun.mail.pop3 package 的 javadocs ,以及 JavaMail FAQ ,尤其是关于 common mistakes 的此项.

关于java - Folder.fetch 和 getmessages 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16724408/

相关文章:

JavaMail 获取电子邮件的 URL - Gmail

Javamail问题: cannot send mails through SMTP after checking mails with POP3

perl - MS Exchange POP3 UIDL 命令提供的 UID 真的是唯一的吗?

java - 使用Java流合并一对 `int`数组

java - 模拟代理服务器后面的笔记本电脑

java - 如何将 LocalDate 与绑定(bind)一起使用

java - RMySQL 包无法通过 JRI 接口(interface)加载

java - 关于缺少 javax/mail/mail/1.4/activation.jar 的 Maven 编译错误。怎么修?

unit-testing - 将 .eml 文件加载到 javax.mail.Messages

java - 如何在java中使用imap或pop3获取特定数量的电子邮件?