2012-02-13 210 views
20

我試圖通過IMAP藉助JavaMail API從Gmail帳戶訪問電子郵件。我想知道爲什麼代碼適用於一個電子郵件帳戶,但不適用於另一個。使用IMAP(javamail API)從Gmail訪問電子郵件

我可以訪問兩個電子郵件帳戶的Inbox文件夾。但是對於其中一個電子郵件帳戶,其他文件夾(如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","[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(); } 
     } 

    } 



} 
+0

哇。這工作! :-) – 2014-03-25 09:59:32

+0

謝謝你。 :-) – kukis 2014-12-14 10:44:18

回答

12

是使用非英語UI萬一其中一個帳戶?

Gmail文件夾名稱相對於用戶本地化設置進行了本地化。

目前獲取本地化文件夾名稱的唯一方法是使用XLIST命令。

+0

@ Pawel Lesnikowski請您詳細說明什麼是XLIST命令,以及如何使用它來獲取本地化的文件夾名稱?謝謝.. – Ragini 2012-02-14 14:19:44

+0

XLIST是Google爲IMAP協議添加的擴展之一。它與LIST命令非常相似。它的響應包括附加標誌,允許客戶識別文件夾的預期用途。你可以在這裏找到一個示例迴應:http://www.limilabs.com/blog/localized-gmail-imap-folders我不是Java開發人員,所以我不能告訴你如何使用java發出這個命令。 mail – 2012-02-14 15:19:31

+0

@ Pawel Lesnikowski再次感謝您提供的鏈接是非常有用的..我有正確的文件夾名稱,他們工作得很好... – Ragini 2012-02-14 18:01:45

0

林不能確定這是否會有所幫助,但我已經看到了其中的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] 
5
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(); 
    } 
} 

} 
+0

要把什麼放在smtp.properties? – vaibhavcool20 2018-01-19 10:40:12