J'essaie d'accéder aux courriels des comptes Gmail via IMAP avec l'aide de l'API JavaMail. Je me demandais pourquoi le code fonctionne pour un compte de messagerie mais ne fonctionne pas pour un autre.
Je peux accéder au dossier Inbox
des deux comptes de messagerie. Mais pour l'un des comptes de messagerie, il n'est pas possible d'accéder à d'autres dossiers tels que SPAM([Gmail]/Spam)
et une exception FolderNotFoundException
est renvoyée. Quelqu'un pourrait-il s'il vous plaît expliquer ce qui ne va pas?
Merci d'avance.
Voici le code:
import Java.io.*;
import Java.util.*;
import javax.mail.*;
import javax.mail.Flags.Flag;
import javax.mail.internet.*;
import com.Sun.mail.imap.IMAPFolder;
import com.Sun.mail.imap.IMAPMessage;
public class FolderFetchIMAP {
public static void main(String[] args) throws MessagingException, IOException {
IMAPFolder folder = null;
Store store = null;
String subject = null;
Flag flag = null;
try
{
Properties props = System.getProperties();
props.setProperty("mail.store.protocol", "imaps");
Session session = Session.getDefaultInstance(props, null);
store = session.getStore("imaps");
store.connect("imap.googlemail.com","[email protected]", "password");
folder = (IMAPFolder) store.getFolder("[Gmail]/Spam"); // This doesn't work for other email account
//folder = (IMAPFolder) store.getFolder("inbox"); This works for both email account
if(!folder.isOpen())
folder.open(Folder.READ_WRITE);
Message[] messages = folder.getMessages();
System.out.println("No of Messages : " + folder.getMessageCount());
System.out.println("No of Unread Messages : " + folder.getUnreadMessageCount());
System.out.println(messages.length);
for (int i=0; i < messages.length;i++)
{
System.out.println("*****************************************************************************");
System.out.println("MESSAGE " + (i + 1) + ":");
Message msg = messages[i];
//System.out.println(msg.getMessageNumber());
//Object String;
//System.out.println(folder.getUID(msg)
subject = msg.getSubject();
System.out.println("Subject: " + subject);
System.out.println("From: " + msg.getFrom()[0]);
System.out.println("To: "+msg.getAllRecipients()[0]);
System.out.println("Date: "+msg.getReceivedDate());
System.out.println("Size: "+msg.getSize());
System.out.println(msg.getFlags());
System.out.println("Body: \n"+ msg.getContent());
System.out.println(msg.getContentType());
}
}
finally
{
if (folder != null && folder.isOpen()) { folder.close(true); }
if (store != null) { store.close(); }
}
}
}
L'un des comptes utilise-t-il une interface utilisateur non anglaise par hasard?
Les noms de dossiers Gmail sont localisés en fonction des paramètres de localisation de l'utilisateur.
Actuellement, le seul moyen d'obtenir le nom du dossier localisé consiste à utiliser la commande XLIST.
package com.technicalkeeda;
import Java.io.File;
import Java.io.FileInputStream;
import Java.util.Properties;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Store;
public class GmailInbox {
public static void main(String[] args) {
GmailInbox gmail = new GmailInbox();
gmail.read();
}
public void read() {
Properties props = new Properties();
try {
props.load(new FileInputStream(new File("C:\\smtp.properties")));
Session session = Session.getDefaultInstance(props, null);
Store store = session.getStore("imaps");
store.connect("smtp.gmail.com", "*************@gmail.com","your_password");
Folder inbox = store.getFolder("inbox");
inbox.open(Folder.READ_ONLY);
int messageCount = inbox.getMessageCount();
System.out.println("Total Messages:- " + messageCount);
Message[] messages = inbox.getMessages();
System.out.println("------------------------------");
for (int i = 0; i < 10; i++) {
System.out.println("Mail Subject:- " + messages[i].getSubject());
}
inbox.close(true);
store.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Je ne suis pas sûr que cela aide, mais j'ai déjà vu des cas où les comptes Gmail ont des boîtes aux lettres différentes, par exemple ..
Compte Gmail 1: -
[[Google Mail]]
[[Google Mail]/All Mail]
[[Google Mail]/Bin]
[[Google Mail]/Drafts]
[[Google Mail]/Important]
[[Google Mail]/Sent Mail]
[[Google Mail]/Spam]
[[Google Mail]/Starred]
Compte Gmail 2: -
[[Gmail]]
[[Gmail]/All Mail]
[[Gmail]/Bin]
[[Gmail]/Drafts]
[[Gmail]/Important]
[[Gmail]/Sent Mail]
[[Gmail]/Spam]
[[Gmail]/Starred]
liste privée getResulr1 () {
try {
Properties props = new Properties();
props.put("mail.store.protocol","imaps");
Session session = Session.getDefaultInstance(props, null);
Store store = session.getStore("imaps");
store.connect("imap.gmail.com", "Email Id", "App Password");
Folder inbox = store.getFolder("inbox");
//if you want mail from specify floder just change change floder name
//Folder inbox = store.getFolder("[Gmail]/Drafts");
inbox.open(Folder.READ_ONLY);
int messageCount = inbox.getMessageCount();
Log.e("getFloder ", "getResulr1: "+store.getDefaultFolder().list("*") );
javax.mail.Folder[] folders = store.getDefaultFolder().list("*");
for (javax.mail.Folder folder : folders) {
if ((folder.getType() & javax.mail.Folder.HOLDS_MESSAGES) != 0){
Log.e("getFloder ", "getResulr1: "+folder.getName() );
}
}
Log.e("Mail Subject:", "Total Messages:-: "+messageCount );
javax.mail.Message[] messages = inbox.getMessages();
System.out.println("------------------------------");
Log.e("Mail Subject:", "messages: "+messages.toString());
for (int i = 0; i < messages.length; i++) {
Log.e("Mail Subject:", "getResulr1: "+messages[i].getSubject());
}
inbox.close(true);
store.close();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}