1

我正在尝试编写一个从 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();

这似乎工作正常。然后我在网上找到了这个代码(这里),海报声称效率更高:

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 我已经获取了所有标题,那么使用 fetch(messages,profile) 的真正优势是什么?如果我只想下载 UID,我该怎么办?

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

非常感谢任何愿意提供帮助的人,我一周以来一直在这个问题上。克里斯蒂亚诺

4

1 回答 1

1

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

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

请注意,POP3 协议只允许您获取单个消息的 UID,或所有消息的 UID。

请务必阅读com.sun.mail.pop3 包的 javadocs和JavaMail FAQ,尤其是关于常见错误的这一项。

于 2013-05-24T04:30:40.793 回答