web-dev-qa-db-fra.com

Récupération de tous les e-mails non lus à l'aide de javamail avec le protocole POP3

J'essaie d'accéder à mon compte Gmail et de récupérer les informations de tous les e-mails non lus à partir de cela.

J'ai écrit mon code après avoir référé de nombreux liens. Je donne quelques liens pour référence.

Envoyer et recevoir des e-mails via un compte GMail en utilisant Java

Code Java pour recevoir du courrier à l'aide de JavaMailAPI

Pour tester mon code, j'ai créé un compte Gmail. J'ai donc reçu 4 messages de Gmail. Je lance mon application après avoir vérifié le nombre de mails. Cela a montré un résultat correct. 4 mails non lus. Toutes les informations étaient affichées (par exemple, date, expéditeur, contenu, sujet, etc.)

Ensuite, je me suis connecté à mon nouveau compte, j'ai lu l'un des e-mails et relancé mon application. Maintenant, le nombre de messages non lus aurait dû être de 3, mais il affiche "Nombre de messages non lus: 0"

Je copie le code ici.

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, "[email protected]",
                    "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();
    }
}

J'ai cherché sur google, mais j'ai trouvé que vous devriez utiliser Flags.Flag.SEEN pour lire les e-mails non lus. Mais cela ne montre pas de résultats corrects dans mon cas.

Quelqu'un peut-il indiquer où je pourrais faire une erreur?

Si vous avez besoin de tout le code, je peux modifier mon message.

Remarque: J'ai modifié ma question pour inclure le code entier au lieu de l'extrait de code que j'avais publié plus tôt.

33
MysticMagicϡ

Votre code devrait fonctionner. Vous pouvez également utiliser la méthode Folder.getUnreadMessageCount () si tout ce que vous voulez est le nombre.

JavaMail ne peut que vous dire ce que Gmail lui dit. Peut-être que Gmail pense que tous ces messages ont été lus? Peut-être que l'interface Web de Gmail marque la lecture de ces messages? Vous avez peut-être une autre application qui surveille le dossier pour les nouveaux messages?

Essayez de lire un message non lu avec JavaMail et voyez si le nombre change.

Il peut être utile d'activer le débogage de session afin de voir les réponses IMAP réelles que Gmail renvoie; voir JavaMail FAQ .

13
Bill Shannon

Vous ne pouvez pas récupérer les messages non lus avec POP3. De API JavaMail :

POP3 ne prend en charge aucun indicateur permanent (voir Folder.getPermanentFlags ()). En particulier, l'indicateur Flags.Flag.RECENT ne sera jamais défini pour les messages POP3. C'est à l'application de déterminer quels messages dans une boîte aux lettres POP3 sont "nouveaux".

Vous pouvez utiliser le protocole IMAP et utiliser l'indicateur SEEN comme ceci:

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);
}

Une autre chose à noter est que POP3 ne gère pas les dossiers. IMAP obtient des dossiers, POP3 ne reçoit que la boîte de réception. Plus d'informations sur: Comment récupérer les sous-dossiers/labels gmail en utilisant POP3?

7
Technotronic

Changez inbox.open(Folder.READ_ONLY); en inbox.open(Folder.READ_WRITE); Cela changera votre courrier comme lu dans la boîte de réception.

7
user1791574
Flags seen = new Flags(Flags.Flag.RECENT);
FlagTerm unseenFlagTerm = new FlagTerm(seen, false);
messages = inbox.search(unseenFlagTerm);
3
ibrahimKiraz

Le drapeau correct à utiliser est

Flags.Flag.RECENT
1
user1397305