バッチで取得したい次のコードがあります (たとえば、最初の 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
正しく表示されているとしますが、 IS 10Message[] messages = inbox.search(new FlagTerm(new Flags(Flag.SEEN), false), inbox.getMessages(batchStart, batchEnd));
として 10 レコードではなく 5 レコードしか返されません。BATCH_SIZE
別の問題は、処理された電子メールが呼び出されても既読としてマークされないこと
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); } }