Récupérer tous les e-mails non lus en utilisant 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.
j'ai écrit mon code après avoir fait référence à de nombreux liens. Je donne quelques liens de référence.
Envoyer et recevoir des e-mails via un compte GMail en utilisant Java
code Java pour recevoir du courrier en utilisant JavaMailAPI
pour tester mon code, j'en 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. Qui a montré résultat correct. 4 mails non lus. Toutes les informations étaient affichées (date, expéditeur, contenu, sujet, etc.).)
puis je me suis connecté à mon nouveau compte, j'ai lu un des e-mails et j'ai relu mon application. Le nombre de messages non lus aurait dû être 3, mais il affiche " Non. des 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, "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();
}
}
j'ai cherché sur google, mais j'ai trouvé que vous devriez utiliser des drapeaux.Drapeau.Vu pour lire des e-mails non lus. Mais ça ne donne pas de bons résultats dans mon cas.
Quelqu'un peut-il indiquer où je pourrais faire une erreur?
si vous avez besoin du code entier, je peux modifier mon message.
Note: j'ai modifié ma question pour inclure le code entier au lieu de l'extrait que j'avais posté plus tôt.
6 réponses
votre code devrait fonctionner. Vous pouvez également utiliser le Dossier.la méthode getUnreadMessageCount () si tout ce que vous voulez est le nombre.
JavaMail ne peut vous dire que ce que Gmail lui dit. Peut-être que Gmail pense que tous ces messages ont été lus? Peut-être que L'interface Web Gmail marque ces messages lus? Peut-être avez-vous une autre application qui surveille le dossier pour les nouveaux messages?
essayez de lire un message non lu avec JavaMail et voir si le compte changement.
vous pourriez trouver utile d'activer le débogage de session pour que vous puissiez voir les réponses IMAP que Gmail renvoie; voir la FAQ JavaMail .
changer inbox.open(Folder.READ_ONLY);
en inbox.open(Folder.READ_WRITE);
Il modifiera votre courrier tel que lu dans la boîte de réception.
vous ne pouvez pas récupérer des messages non lus avec POP3. De JavaMail API :
POP3 ne supporte aucun drapeau permanent (voir Dossier.getPermanentFlags ()). Dans en particulier, les Drapeaux.Drapeau.Le drapeau récent ne sera jamais mis pour POP3 message. C'est à l'application de déterminer quels messages dans un Les boîtes aux lettres POP3 sont"nouvelles".
vous pouvez utiliser le protocole IMAP et utiliser le drapeau 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 les dossiers, POP3 obtient seulement la boîte de réception. Plus d'informations à: Comment récupérer gmail sous-dossiers / étiquettes en utilisant POP3?
Flags seen = new Flags(Flags.Flag.RECENT);
FlagTerm unseenFlagTerm = new FlagTerm(seen, false);
messages = inbox.search(unseenFlagTerm);
s'il vous plaît utiliser cette méthode pour obtenir les e-mails non lus
getNewMessageCount ()
voir le lien ci-dessous:
https://javamail.java.net/nonav/docs/api/com/sun/mail/imap/IMAPFolder.html