我正在尝试编写一个从POP3服务器收到电子邮件的应用程序。我最终使用的“策略”是:
我知道这不是完美的,但是好吧......让我们立即面对一个问题:)
为丑陋的风格道歉,我受过良好的训练,作为汇编和纯C程序员,刚刚开始使用Java,我的代码获取单个消息(我已经删除了try / catch语句以使其更具可读性)< / p>
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我已经获取了所有头文件,那么使用fetch(消息,配置文件)的真正优势是什么? 如果我只想下载UID,我该怎么办?
而且,如果我只想下载前N个邮件的UID ......是否可能?
非常感谢任何有帮助的人,我一周就坚持这个问题了。 克里斯蒂
答案 0 :(得分:1)
POP3不是最好的协议,如果您了解POP3协议能够做什么,您将更好地理解这一点。
使用您描述的fetch方法将在一次操作中获取邮箱中所有邮件的所有UID。如果您跟踪您所看到的UID,则可以确保只获取您未看到的消息内容。在循环中使用POP3Folder.getUID方法覆盖所有消息,以跳过您已经看过的消息。请注意,getMessage方法实际上并不获取消息的内容;在您使用其他访问内容的方法之前,不会提取内容。
请注意,POP3协议只允许您获取单个邮件的UID或所有邮件的UID。
请务必阅读com.sun.mail.pop3 package和JavaMail FAQ的javadoc,尤其是关于common mistakes的此项。