使用javamail批量阅读电子邮件

时间:2013-04-08 10:53:34

标签: java javamail

我有以下代码,我想通过批量检索(例如:获取前50条消息,处理它然后获取下一条50)。目前它获取所有消息并将其存储在一个数组中.Javamail支持它吗?如果不是如何批量检索?

感谢您的回答。

Properties props = System.getProperties();
props.setProperty("mail.store.protocol", "imaps");

Session session = Session.getDefaultInstance(props, null);
Store store = session.getStore("imaps");
store.connect(host, userName, password);

Folder inbox = null;
inbox = store.getFolder("Inbox");
inbox.open(Folder.READ_WRITE);
Message[] messages = inbox.search(new FlagTerm(
        new Flags(Flag.SEEN), false));
FetchProfile fp = new FetchProfile();
fp.add(FetchProfile.Item.ENVELOPE);
fp.add(FetchProfile.Item.CONTENT_INFO);
inbox.fetch(messages, fp);
for (int i = 0; i < messages.length; i++)
{
    //Process a message
}

更新:

我尝试按照以下方式实现批处理,但它没有按预期工作。

问题是:

  • 假设收件箱中有24封电子邮件,则totalUnread显示正确,但Message[] messages = inbox.search(new FlagTerm(new Flags(Flag.SEEN), false), inbox.getMessages(batchStart, batchEnd));仅返回5条而不是10条记录BATCH_SIZE IS 10。

  • 另一个问题是,在调用getContent()时,处理过的电子邮件未标记为已读取。

    private static final int BATCH_SIZE = 10;
    Properties props = System.getProperties();
    props.setProperty("mail.store.protocol", "imaps");
    AuthenticationService authenticationService = null;
    Session session = Session.getDefaultInstance(props, null);
    Store store = session.getStore("imaps");
    store.connect(host, userName, password);
    Folder inbox = null;
    inbox = store.getFolder("Inbox");
    int totalUnread = inbox.getUnreadMessageCount();
    if (totalUnread != 0)
    {
        inbox.open(Folder.READ_WRITE);
        int batchStart = 1;
        int batchEnd = (totalUnread > BATCH_SIZE ? BATCH_SIZE
                : totalUnread);
        int batchCount = 0;
        while (true)
        {
            processABatch(inbox, batchStart, batchEnd, batchCount);
            batchStart = batchEnd + 1;
            if (batchStart > totalUnread)
            {
                break;
            }
            batchEnd = ((batchEnd + BATCH_SIZE) < totalUnread ? (batchEnd + BATCH_SIZE)
                    : totalUnread);
            batchCount++;
        }
    
    }
    inbox.close(true);
    store.close();
    }
    
    private void processABatch(Folder inbox, int batchStart, int batchEnd, int batchCount)
            throws MessagingException
    {
        Message[] messages = inbox.search(new FlagTerm(new Flags(Flag.SEEN),
                false), inbox.getMessages(batchStart, batchEnd));
        FetchProfile fp = new FetchProfile();
        fp.add(FetchProfile.Item.ENVELOPE);
        fp.add(FetchProfile.Item.CONTENT_INFO);
        inbox.fetch(messages, fp);
        for (int i = 0; i < messages.length; i++)
        {
            processMessage(messages[i], inbox);
        }
    }
    

1 个答案:

答案 0 :(得分:2)

您可能想inbox.search(new FlagTerm(...))而不是inbox.search(new FlagTerm(...), getMessages(start, end))。它使用getMessages(int, int)方法,该方法允许您检索当前Folder中所有邮件的子集。

确实getMessages(start, end)适用于完整的Folder。根据该方法的Javadoc,Message对象应该提供轻量级,因为它们只是对实际消息的引用。

所以也许你可以编写一个返回第一个50未读消息的方法,通过不断获取消息并将它们放入List或类似的内容,直到你有50条消息或者你已到达Folder的末尾。该消息的结果将是“批处理”。

之后,您可以对消息进行常规处理。