38

Gmailアカウントにアクセスして、そこからすべての未読メールの情報を取得しようとしています。

多くのリンクを参照した後、コードを記述しました。参考までにいくつかのリンクを示しています。

Javaを使用してGMailアカウントを介してメールを送受信します

JavaMailAPIを使用してメールを受信するJavaコード

コードをテストするために、1つのGmailアカウントを作成しました。その中でGmailから4通のメッセージを受け取りました。メール数を確認してからアプリケーションを実行します。それは正しい結果を示しました。未読メール4通。すべての情報が表示されていました(日付、送信者、コンテンツ、件名など)

次に、新しいアカウントにログインし、電子メールの1つを読んで、アプリケーションを再実行しました。これで、未読メッセージの数は3になっているはずですが、「未読メッセージの数:0」と表示されます。

ここにコードをコピーしています。

public class MailReader

{

    Folder inbox;

    // Constructor of the calss.

    public MailReader() {
        System.out.println("Inside MailReader()...");
        final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";

        /* Set the mail properties */

        Properties props = System.getProperties();
        // Set manual Properties
        props.setProperty("mail.pop3.socketFactory.class", SSL_FACTORY);
        props.setProperty("mail.pop3.socketFactory.fallback", "false");
        props.setProperty("mail.pop3.port", "995");
        props.setProperty("mail.pop3.socketFactory.port", "995");
        props.put("mail.pop3.host", "pop.gmail.com");

        try

        {

            /* Create the session and get the store for read the mail. */

            Session session = Session.getDefaultInstance(
                    System.getProperties(), null);

            Store store = session.getStore("pop3");

            store.connect("pop.gmail.com", 995, "abc@gmail.com",
                    "paasword");

            /* Mention the folder name which you want to read. */

            // inbox = store.getDefaultFolder();
            // inbox = inbox.getFolder("INBOX");
            inbox = store.getFolder("INBOX");

            /* Open the inbox using store. */

            inbox.open(Folder.READ_ONLY);

            /* Get the messages which is unread in the Inbox */

            Message messages[] = inbox.search(new FlagTerm(new Flags(
                    Flags.Flag.SEEN), false));
            System.out.println("No. of Unread Messages : " + messages.length);

            /* Use a suitable FetchProfile */
            FetchProfile fp = new FetchProfile();
            fp.add(FetchProfile.Item.ENVELOPE);

            fp.add(FetchProfile.Item.CONTENT_INFO);

            inbox.fetch(messages, fp);

            try

            {

                printAllMessages(messages);

                inbox.close(true);
                store.close();

            }

            catch (Exception ex)

            {
                System.out.println("Exception arise at the time of read mail");

                ex.printStackTrace();

            }

        }

        catch (MessagingException e)
        {
            System.out.println("Exception while connecting to server: "
                    + e.getLocalizedMessage());
            e.printStackTrace();
            System.exit(2);
        }

    }

    public void printAllMessages(Message[] msgs) throws Exception
    {
        for (int i = 0; i < msgs.length; i++)
        {

            System.out.println("MESSAGE #" + (i + 1) + ":");

            printEnvelope(msgs[i]);
        }

    }

    public void printEnvelope(Message message) throws Exception

    {

        Address[] a;

        // FROM

        if ((a = message.getFrom()) != null) {
            for (int j = 0; j < a.length; j++) {
                System.out.println("FROM: " + a[j].toString());
            }
        }
        // TO
        if ((a = message.getRecipients(Message.RecipientType.TO)) != null) {
            for (int j = 0; j < a.length; j++) {
                System.out.println("TO: " + a[j].toString());
            }
        }
        String subject = message.getSubject();

        Date receivedDate = message.getReceivedDate();
        Date sentDate = message.getSentDate(); // receivedDate is returning
                                                // null. So used getSentDate()

        String content = message.getContent().toString();
        System.out.println("Subject : " + subject);
        if (receivedDate != null) {
            System.out.println("Received Date : " + receivedDate.toString());
        }
        System.out.println("Sent Date : " + sentDate.toString());
        System.out.println("Content : " + content);

        getContent(message);

    }

    public void getContent(Message msg)

    {
        try {
            String contentType = msg.getContentType();
            System.out.println("Content Type : " + contentType);
            Multipart mp = (Multipart) msg.getContent();
            int count = mp.getCount();
            for (int i = 0; i < count; i++) {
                dumpPart(mp.getBodyPart(i));
            }
        } catch (Exception ex) {
            System.out.println("Exception arise at get Content");
            ex.printStackTrace();
        }
    }

    public void dumpPart(Part p) throws Exception {
        // Dump input stream ..
        InputStream is = p.getInputStream();
        // If "is" is not already buffered, wrap a BufferedInputStream
        // around it.
        if (!(is instanceof BufferedInputStream)) {
            is = new BufferedInputStream(is);
        }
        int c;
        System.out.println("Message : ");
        while ((c = is.read()) != -1) {
            System.out.write(c);
        }
    }

    public static void main(String args[]) {
        new MailReader();
    }
}

Googleで検索しましたが、未読のメールを読むにはFlags.Flag.SEENを使用する必要があることがわかりました。しかし、私の場合、それは正しい結果を示していません。

誰かが私がどこで間違いをしているのか指摘できますか?

コード全体が必要な場合は、投稿を編集できます。

注:以前に投稿したスニペットではなく、コード全体を含めるように質問を編集しました。

4

6 に答える 6

15

コードは機能するはずです。カウントだけが必要な場合は、Folder.getUnreadMessageCount()メソッドを使用することもできます。

JavaMailは、Gmailが伝えていることしか伝えられません。おそらくGmailはそれらのメッセージがすべて読まれたと考えているのでしょうか。おそらく、Gmailのウェブインターフェースはそれらのメッセージを既読としてマークしていますか?おそらく、新しいメッセージがないかフォルダを監視している別のアプリケーションがありますか?

JavaMailで未読メッセージを読んで、カウントが変わるかどうかを確認してください。

Gmailが返す実際のIMAP応答を確認できるように、セッションのデバッグをオンにすると便利な場合があります。JavaMailFAQを参照してください。

于 2012-10-30T18:33:24.017 に答える
11

POP3では未読メッセージを取得できません。JavaMail APIから:

POP3は永続的なフラグをサポートしていません(Folder.getPermanentFlags()を参照)。特に、Flags.Flag.RECENTフラグがPOP3メッセージに設定されることはありません。POP3メールボックス内のどのメッセージが「新規」であるかを判断するのはアプリケーション次第です。

IMAPプロトコルを使用して、次のようにSEENフラグを使用できます。

public Message[] fetchMessages(String host, String user, String password, boolean read) {
    Properties properties = new Properties();
    properties.put("mail.store.protocol", "imaps");

    Session emailSession = Session.getDefaultInstance(properties);
    Store store = emailSession.getStore();
    store.connect(host, user, password);

    Folder emailFolder = store.getFolder("INBOX");
    // use READ_ONLY if you don't wish the messages
    // to be marked as read after retrieving its content
    emailFolder.open(Folder.READ_WRITE);

    // search for all "unseen" messages
    Flags seen = new Flags(Flags.Flag.SEEN);
    FlagTerm unseenFlagTerm = new FlagTerm(seen, read);
    return emailFolder.search(unseenFlagTerm);
}

もう1つの注意点は、POP3がフォルダを処理しないことです。IMAPはフォルダを取得し、POP3は受信トレイのみを取得します。詳細:POP3を使用してGmailのサブフォルダ/ラベルを取得する方法は?

于 2015-07-26T14:50:03.980 に答える
8

[変更]に変更inbox.open(Folder.READ_ONLY);するinbox.open(Folder.READ_WRITE); と、受信トレイで読み取られるメールが変更されます。

于 2013-07-29T05:51:26.220 に答える
4
Flags seen = new Flags(Flags.Flag.RECENT);
FlagTerm unseenFlagTerm = new FlagTerm(seen, false);
messages = inbox.search(unseenFlagTerm);
于 2014-07-22T14:42:09.497 に答える
1

使用する正しいフラグは

Flags.Flag.RECENT
于 2014-06-05T18:47:32.123 に答える
-1

未読メールを取得するには、この方法を使用してください

getNewMessageCount()

以下のリンクを参照してください。

https://javamail.java.net/nonav/docs/api/com/sun/mail/imap/IMAPFolder.html

于 2014-12-22T05:25:35.950 に答える