使用IMAP(javamail API)访问Gmail电子邮件

26
我正在尝试使用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(); }
        }

    }



}
5个回答

14

是否有一个账户使用非英文界面?

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

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


@ Pawel Lesnikowski,您能否详细说明一下XLIST命令是什么以及如何使用它来获取本地化的文件夹名称?谢谢。 - Ragini
@ Pawel Lesnikowski,再次感谢您。您提供的链接非常有用。我得到了正确的文件夹名称,它们运行良好。 - Ragini
2
请注意,http://code.google.com/p/java-gmail-imap/ 是针对Gmail的JavaMail扩展版本,包括XLIST支持。 - Mark McLaren
4
XLIST已经被弃用,谷歌建议您使用LIST命令代替... - ekawas
我该如何在我的安卓应用中使用XLIST命令来获取文件夹名称? - Napolean
显示剩余3条评论

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

}

2
在smtp.properties文件中应该放什么内容? - vaibhavcool20
你不需要 stmp.properties 文件。无论如何,resources 文件夹是存储 *.properties 文件的好地方。 - dialex

3
您可以尝试以下代码:

private List<String> getResult1(){
  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");

    //if you want mail from specified folder, just change change folder name
    //Folder inbox = store.getFolder("[Gmail]/Drafts");
    Folder inbox = store.getFolder("inbox");

    inbox.open(Folder.READ_ONLY);
    int messageCount = inbox.getMessageCount();
    Log.e("getFolder ", "getResult1: " + 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("getFolder ", "getResult1: " + 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:", "getResult1: " + messages[i].getSubject());
    }
    inbox.close(true);
    store.close();
  } catch (Exception e) {
    e.printStackTrace();
  }
  return null;
}

1
它的工作方式是这样的(看起来它不能与POP3一起使用,但可以与IMAP一起使用):
     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");

1

我不确定这是否有帮助,但我曾看到过 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]

是的,这种情况经常发生,这份文档非常有用。 - Dan Ortega

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接