使用IMAP(javamail API)访问来自gmail的电子邮件

使用IMAP(javamail API)访问来自gmail的电子邮件,java,gmail,imap,jakarta-mail,Java,Gmail,Imap,Jakarta Mail,我正试图在JavaMail API的帮助下通过IMAP访问Gmail帐户中的电子邮件。我想知道为什么代码适用于一个电子邮件帐户,但不适用于另一个 我可以访问这两个电子邮件帐户的收件箱文件夹。但对于其中一个电子邮件帐户,其他文件夹如SPAM([Gmail]/SPAM)无法访问,它会抛出FolderNotFoundException异常。谁能解释一下出了什么问题吗 先谢谢你 代码如下: import java.io.*; import java.util.*; import javax.mail.*

我正试图在JavaMail API的帮助下通过IMAP访问Gmail帐户中的电子邮件。我想知道为什么代码适用于一个电子邮件帐户,但不适用于另一个

我可以访问这两个电子邮件帐户的
收件箱
文件夹。但对于其中一个电子邮件帐户,其他文件夹如
SPAM([Gmail]/SPAM)
无法访问,它会抛出
FolderNotFoundException
异常。谁能解释一下出了什么问题吗

先谢谢你

代码如下:

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","myemailid@gmail.com", "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(); }
        }

    }



}
import java.io.*;
导入java.util.*;
导入javax.mail.*;
导入javax.mail.Flags.Flag;
导入javax.mail.internet.*;
导入com.sun.mail.imap.IMAPFolder;
导入com.sun.mail.imap.IMAPMessage;
公共类FolderFetchIMAP{
公共静态void main(字符串[]args)抛出MessaginException、IOException{
IMAPFolder文件夹=null;
Store=null;
字符串subject=null;
Flag=null;
尝试
{
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”myemailid@gmail.com“,”密码“);
folder=(IMAPFolder)store.getFolder(“[Gmail]/Spam”);//这不适用于其他电子邮件帐户
//folder=(IMAPFolder)store.getFolder(“收件箱”);这适用于两个电子邮件帐户
如果(!folder.isOpen())
文件夹。打开(文件夹。读写);
Message[]messages=folder.getMessages();
System.out.println(“邮件数:+folder.getMessageCount());
System.out.println(“未读邮件数:+folder.getUnderMessageCount());
System.out.println(messages.length);
for(int i=0;i
有没有可能是使用非英语用户界面的帐户之一

Gmail文件夹名称根据用户本地化设置进行本地化


目前,获取本地化文件夹名称的唯一方法是使用XLIST命令。

我不确定这是否有帮助,但我见过gmail帐户有不同邮箱的实例,例如

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]
Gmail帐户2:-

[[Gmail]]
[[Gmail]/All Mail]
[[Gmail]/Bin]
[[Gmail]/Drafts]
[[Gmail]/Important]
[[Gmail]/Sent Mail]
[[Gmail]/Spam]
[[Gmail]/Starred]
package com.technicalkeeda;
导入java.io.File;
导入java.io.FileInputStream;
导入java.util.Properties;
导入javax.mail.Folder;
导入javax.mail.Message;
导入javax.mail.Session;
导入javax.mail.Store;
公共类Gmail信箱{
公共静态void main(字符串[]args){
gmailbox gmail=新的gmailbox();
gmail.read();
}
公共无效读取(){
Properties props=新属性();
试一试{
加载(新文件输入流(新文件(“C:\\smtp.properties”));
Session Session=Session.getDefaultInstance(props,null);
Store Store=session.getStore(“imaps”);
store.connect(“smtp.gmail.com”,“************@gmail.com”,“您的密码”);
文件夹收件箱=store.getFolder(“收件箱”);
收件箱。打开(文件夹。只读);
int messageCount=inbox.getMessageCount();
System.out.println(“消息总数:-”+messageCount);
Message[]messages=inbox.getMessages();
System.out.println(“-----------------------------------”);
对于(int i=0;i<10;i++){
System.out.println(“邮件主题:-”+消息[i].getSubject());
}
收件箱。关闭(true);
store.close();
}捕获(例外e){
e、 printStackTrace();
}
}
}

您可以尝试以下代码:

private List getResult1(){
试一试{
Properties props=新属性();
props.put(“mail.store.protocol”、“imaps”);
Session Session=Session.getDefaultInstance(props,null);
Store Store=session.getStore(“imaps”);
store.connect(“imap.gmail.com”、“电子邮件Id”、“应用程序密码”);
//如果您想要从指定文件夹发送邮件,只需更改文件夹名称即可
//文件夹收件箱=store.getFolder(“[Gmail]/Drafts”);
文件夹收件箱=store.getFolder(“收件箱”);
收件箱。打开(文件夹。只读);
int messageCount=inbox.getMessageCount();
Log.e(“getFolder”、“getResult1:”+store.getDefaultFolder().list(“*”);
javax.mail.Folder[]folders=store.getDefaultFolder().list(“*”);
for(javax.mail.Folder文件夹:文件夹){
if((folder.getType()&javax.mail.folder.HOLDS_邮件)!=0){
Log.e(“getFolder”、“getResult1:+folder.getName());
}
}
Log.e(“邮件主题:,”邮件总数:-:“+messageCount”);
javax.mail.Message[]messages=inbox.getMessages();
System.out.println(“-----------------------------------”);
Log.e(“邮件主题:”,“消息:+messages.toString());
for(int i=0;ipackage 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();
  }
 }

}
     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", [theMailAccount@gmail.com], [thePasswordOrAppPassword]);

     // You possibly will have to use [Google Mail]/All Mail instead
     Folder inbox = store.getFolder("[Gmail]/All Mail");