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正しく表示されているとしますが、 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);
        }
    }
    
4

1 に答える 1

2

する代わりにinbox.search(new FlagTerm(...))、したいかもしれませんinbox.search(new FlagTerm(...), getMessages(start, end))。現在getMessages(int, int)の .xml 内のすべてのメッセージのサブセットを取得できるメソッドを使用しますFolder

確かgetMessages(start, end)に完全に適用されFolderます。そのメソッドの Javadoc によると、Messageオブジェクトは実際のメッセージへの参照にすぎないため、オブジェクトは軽量であると期待されています。

そのため、5050List件のメッセージが含まれるか、またはFolder. そのメッセージの結果は「バッチ」になります。

その後、メッセージの通常の処理を行うことができます。

于 2013-04-08T11:05:34.980 に答える