我正在尝试编写一个从 POP3 服务器获取电子邮件的应用程序。我最终使用的“策略”是:
- 获取单条消息
- 检查消息是否已存在于我的数据库中
- 如果没有,插入它,转到 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……有可能吗?
非常感谢任何愿意提供帮助的人,我一周以来一直在这个问题上。克里斯蒂亚诺