recuperar - Recuperando todos los correos electrónicos no leídos usando javamail con protocolo POP3
leer correos con javamail (6)
Cambie inbox.open(Folder.READ_ONLY);
a inbox.open(Folder.READ_WRITE);
Cambiará su correo como leído en la bandeja de entrada.
Intento acceder a mi cuenta de gmail y recuperar la información de todos los correos electrónicos no leídos.
He escrito mi código después de referir muchos enlaces. Estoy dando algunos enlaces para referencia.
Enviar y recibir correos electrónicos a través de una cuenta de GMail usando Java
Código Java para recibir correo usando JavaMailAPI
Para probar mi código, creé una cuenta de Gmail. Así que recibí 4 mensajes de Gmail. Ejecuto mi aplicación después de verificar la cantidad de correos. Eso mostró el resultado correcto. 4 correos no leídos Toda la información se muestra (por ejemplo, fecha, remitente, contenido, tema, etc.)
Luego, inicié sesión en mi nueva cuenta, leí uno de los correos electrónicos y volví a ejecutar mi aplicación. Ahora el recuento de mensajes no leídos debería haber sido 3, pero muestra "Número de mensajes no leídos: 0"
Estoy copiando el código aquí.
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();
}
}
Busqué en Google, pero encontré que debería usar Flags.Flag.SEEN para leer correos electrónicos no leídos. Pero eso no muestra resultados correctos en mi caso.
¿Puede alguien señalar dónde podría estar cometiendo un error?
Si necesitas un código completo, puedo editar mi publicación.
Nota: edité mi pregunta para incluir el código completo en lugar de un fragmento que había publicado anteriormente.
La bandera correcta para usar es
Flags.Flag.RECENT
No puede recuperar mensajes no leídos con POP3. Desde JavaMail API :
POP3 no admite banderas permanentes (consulte Folder.getPermanentFlags ()). En particular, la bandera Flags.Flag.RECENT nunca se establecerá para los mensajes POP3. Depende de la aplicación determinar qué mensajes en un buzón POP3 son "nuevos".
Puede usar el protocolo IMAP y usar la bandera SEEN de esta manera:
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);
}
Otra cosa para notar es que POP3 no maneja carpetas. IMAP obtiene carpetas, POP3 solo recibe la Bandeja de entrada. Más información en: ¿Cómo recuperar las subcarpetas / etiquetas de Gmail usando POP3?
Tu código debería funcionar También puede usar el método Folder.getUnreadMessageCount () si todo lo que desea es el recuento.
JavaMail solo puede decirte lo que Gmail le dice. ¿Tal vez Gmail piensa que todos esos mensajes han sido leídos? Tal vez la interfaz web de Gmail está marcando esos mensajes leídos? ¿Quizás tienes otra aplicación que monitorea la carpeta de mensajes nuevos?
Intente leer un mensaje no leído con JavaMail y vea si el recuento cambia.
Puede que le resulte útil activar la depuración de la sesión para que pueda ver las respuestas IMAP reales que Gmail está devolviendo; ver las Preguntas frecuentes de JavaMail .
por favor use este método para obtener los correos no leídos
getNewMessageCount ()
consulte el siguiente enlace:
https://javamail.java.net/nonav/docs/api/com/sun/mail/imap/IMAPFolder.html
Flags seen = new Flags(Flags.Flag.RECENT);
FlagTerm unseenFlagTerm = new FlagTerm(seen, false);
messages = inbox.search(unseenFlagTerm);