我有以下代码,我想通过批量检索(例如:获取前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);
}
}
答案 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
的末尾。该消息的结果将是“批处理”。
之后,您可以对消息进行常规处理。