2012-02-13 14 views
20

Próbuję uzyskać dostęp do wiadomości e-mail z kont Gmail za pośrednictwem protokołu IMAP za pomocą interfejsu API JavaMail. Zastanawiam się, dlaczego kod działa dla jednego konta e-mail, ale nie działa dla innego.Uzyskiwanie dostępu do wiadomości e-mail z Gmaila za pomocą protokołu IMAP (javamail API)

Mam dostęp do folderu Inbox obu kont e-mail. Ale dla jednego z kont e-mail nie można uzyskać dostępu do innych folderów, takich jak SPAM([Gmail]/Spam), i powoduje to wyjątek od FolderNotFoundException. Czy ktokolwiek mógłby wyjaśnić, co się dzieje?

Z góry dziękuję.

Oto kod:

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

Wow. To działa! :-) –

+0

Dzięki człowieku. :-) – kukis

Odpowiedz

12

Jest jednym z kont korzystających nieanglojęzycznych UI przypadkiem?

Nazwy folderów Gmaila są lokalizowane w odniesieniu do ustawień lokalizacji użytkownika.

Obecnie jedynym sposobem na uzyskanie nazwy zlokalizowanego folderu jest użycie polecenia XLIST.

+0

@ Pawel Lesnikowski Czy mógłbyś rozwinąć komendę XLIST i jak jej użyć do uzyskania zlokalizowanej nazwy folderu? Dzięki .. – Ragini

+0

XLIST to jedno z rozszerzeń dodanych do protokołu IMAP przez Google. Jest bardzo podobny do polecenia LISTA. Jego odpowiedź obejmuje dodatkowe flagi, które pozwalają klientowi zidentyfikować zamierzony cel folderu. Przykładową odpowiedź można znaleźć tutaj: http://www.limilabs.com/blog/localized-gmail-imap-folders Nie jestem programistą Java, więc nie mogę pokazać, jak wydać to polecenie za pomocą java. mail –

+0

@ Pawel Lesnikowski Jeszcze raz dziękuję. Podany link jest bardzo przydatny .. Mam poprawne foldernames i działają dobrze ... – Ragini

0

Im pewien, czy to pomaga, ale widziałem przypadki kont Gmail mają różne skrzynek tj ..

Konto Gmail 1: -

Konto
[[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

co umieścić w smtp.properties? – vaibhavcool20

Powiązane problemy