1

我有以下代码,我想批量检索(例如:获取前 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_SIZEIS 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);
        }
    }
    
4

1 回答 1

2

与其做inbox.search(new FlagTerm(...)),不如做inbox.search(new FlagTerm(...), getMessages(start, end))。它使用getMessages(int, int)允许您检索当前所有消息的子集的方法Folder

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

因此,也许您可​​以编写一个返回第一50条未读消息的方法,方法是不断获取消息并将它们放入 aList或类似的东西中,直到其中有 50 条消息或到达Folder. 该消息的结果将是“批次”。

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

于 2013-04-08T11:05:34.980 回答