web-dev-qa-db-ja.com

javamailがGmailメッセージを既読にする

注:回答の後に追加:ありがとうございます。ええ、Flag.SEENをtrueにしてsaveChangesを試してみました。メッセージをループするforステートメントで使用してみました。しかし、次のループではとにかくフォルダから再びメッセージを取得しました。フォルダーがライブであると想定していたため、コンテンツを取得し、フィルターを使用してフォルダーからメッセージを再度取得すると、表示されないように機能するはずですが、それでも同じメッセージが表示されました。フォルダを閉じて、マークされているかどうかを確認するためのテストとして再度開くことができます。また、クライアントに移動してメッセージをクリックすると、ループ内でもコードでメッセージが表示されなくなるため、コード内でも同じようにしたいと考えていました。

オリジナル:Gmailアカウントからメールを取得するためにjavamailを使用していますが、うまくいきます。既読のメッセージを受け取ったら、誰かに指示してもらえますか?これが私の現在のコードです:

    Properties props = System.getProperties();
    props.setProperty("mail.store.protocol", "imaps");
    try {
        Session session = Session.getDefaultInstance(props, null);
        Store store = session.getStore("imaps");

        store.connect("imap.gmail.com", eUserName, ePassWord);
        // Get folder
        Folder folder = store.getFolder("INBOX");
        if (folder == null || !folder.exists()) {
            return null;
        }
        folder.open(Folder.READ_ONLY);

        // Only pull unread
        FlagTerm ft = new FlagTerm(new Flags(Flags.Flag.SEEN), false);
        Message messages[]; // = folder.search(ft);

        for(int x = 0; x < timeOutInSeconds; x++) {
            log.reportMessage("looking for emails");
            try {
                folder.getMessages();
                messages = folder.search(ft);

                if (messages.length > 0) {
                    for (Message message : messages) {
                        //log.reportMessage("found message: should not see again, marking read");
                        // want to mark as read

                    }
                }
                Thread.sleep(1000);
            }
            catch(Exception ex) {

            }
        }

        // Close connection
        folder.close(false);
        store.close();
        return null;

    }
    catch (NoSuchProviderException ex) {

        return null;
    }
    catch (MessagingException ex) {

        return null;
    }


}
32
Green

まず、POP3サーバーを使用している場合、メッセージに既読のマークを付けることはできません。POP3プロトコルはそれをサポートしていません。ただし、IMAP v4プロトコルにはあります。

これを行う方法は、メッセージを取得し、_Flags.Flag.SEEN_フラグをtrueに設定してから、message.saveChanges()を呼び出すことであると考えるかもしれません。奇妙なことに、これはそうではありません。

代わりに、JavaMail API設計仕様の第4章「フラグクラス」セクションでは、メッセージのコンテンツが取得されるときにSEENフラグが暗黙的に設定されると述べています。したがって、メッセージを既読としてマークするには、次のコードを使用できます。

_myImapFolder.open(Folder.READ_WRITE);
myImapFolder.getMessage(myMsgID).getContent();
myImapFolder.close(false);
_

または、MimeMessageコピーコンストラクタを使用する方法もあります。

_MimeMessage source = (MimeMessage) folder.getMessage(1)
MimeMessage copy = new MimeMessage(source);
_

コピーを作成すると、sourceによって参照されるメッセージに対して、seenフラグが暗黙的に設定されます。

48
Alon Adler

メッセージ全体をダウンロードせずにそれを行う1つのライナー:

単一のメッセージ:

folder.setFlags(new Message[] {message}, new Flags(Flags.Flag.SEEN), true);

すべてのメッセージ:

folder.setFlags(messages, new Flags(Flags.Flag.SEEN), true);
36
Shloim

この投稿は古いですが、最も簡単な解決策はまだ投稿されていません。

メッセージにアクセスしています。 message.setFlag(Flag.SEEN、true);

2
James Vornhagen
_for (Message message : messages) {
                    message.setFlag(Flags.Flag.SEEN,true);
                }
_

and以下の行を変更

folder.open(Folder.READ_ONLY);

これに

folder.open(Folder.READ_WRITE);

1

Forループを使用してメールを1つずつ読み取るか確認する場合、コードは次のようにしてGmailメッセージを既読にすることができます。

    Message[] unreadMessages = inbox.search(new FlagTerm(new Flags(Flag.SEEN), false));
            for (int q = 0; q < unreadMessages.length; q++) {

              unreadMessages[q].setFlag(Flag.SEEN, true);

            }

このコードが行うことは、1つずつ未読にすることです。

また、フォルダー/受信トレイは、READ_ONLYではなく、READ_WRITEである必要があります。

folder.open(Folder.READ_WRITE);
1
Gerrit-Jan

また、メッセージを読んだら、_public static int max_message_number_を用意し、message[i].getMessageNumber();に格納することもできます。次に、メッセージを読み取る前に、max_message_number < message[i].getmessageNumber()かどうかを確認します。 trueの場合、このメッセージは出力されません(すでに読み取られているため)。

1
Rohit Talwar

これを行う最も簡単な方法は、読み取りまたは書き込みを行うフォルダーを設定することです。このような意味...

    Folder inbox = null;
    inbox.open(Folder.READ_WRITE);      

folderクラスをインポートする必要があります。

0
Nawaf Alluqmani

あなたも試すことができます

gmailの設定に移動>転送とPOP/IMAP

のドロップダウンからPOPを使用してメッセージにアクセスする場合、Gmailのコピーを既読としてマークし、変更を保存します

0
kapil76

message.setFlag(Flag.SEEN、true)「シンボルが見つかりません」を与えるmessage.setFlag(Flags.Flag.SEEN、true)は良いようです。

0
jacques