Folder.fetch和getmessages之间的差异

时间:2013-05-23 21:43:41

标签: java javamail pop3

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

  1. 获取单个消息
  2. 检查邮件是否已存在于我的数据库中
  3. 如果没有,请插入,转到1
  4. 我知道这不是完美的,但是好吧......让我们立即面对一个问题:)

    为丑陋的风格道歉,我受过良好的训练,作为汇编和纯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 ......是否可能?

    非常感谢任何有帮助的人,我一周就坚持这个问题了。 克里斯蒂

1 个答案:

答案 0 :(得分:1)

POP3不是最好的协议,如果您了解POP3协议能够做什么,您将更好地理解这一点。

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

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

请务必阅读com.sun.mail.pop3 packageJavaMail FAQ的javadoc,尤其是关于common mistakes的此项。