2015-04-29 101 views
2

我開發了簡單的Java應用程序,它讀取我的Gmail收件箱郵件。我可以閱讀電子郵件從和主題。但是,我無法閱讀電子郵件內容。如何閱讀郵件內容?

當我嘗試讀它,我得到以下異常:

Exception Msg: com.sun.mail.imap.IMAPInputStream cannot be cast to javax.mail.Multipart 

代碼:

import com.sun.mail.imap.IMAPFolder; 
import com.sun.mail.imap.IMAPStore; 

import javax.mail.Address; 
import javax.mail.BodyPart; 
import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.mail.Multipart; 
import javax.mail.Session; 

import java.io.IOException; 
import java.util.List; 
import java.util.Properties; 


public class Read_Mail { 

    static String from; 

    public static void main(String args[]) 
    { 
     Properties props = new Properties(); 
     props.setProperty("mail.store.protocol", "imaps"); 

     Session session = Session.getDefaultInstance(props,null); 

     IMAPStore imapstore = null; 

     try 
     { 
      imapstore = (IMAPStore) session.getStore("imaps"); 
      imapstore.connect("imap.gmail.com", "usernam[email protected]", "passwordxxx"); 

      final IMAPFolder folder = (IMAPFolder) imapstore.getFolder("Inbox"); 

      folder.open(IMAPFolder.READ_ONLY); 

      Message[] messages = folder.getMessages(); 
       for (int i = 0; i < messages.length; i++) { 
        Message message = messages[i]; 
        System.out.println("=============================="); 
        System.out.println("Email #" + (i + 1)); 
        System.out.println("Subject: " + message.getSubject()); 
        System.out.println("From: " + message.getFrom()[0]); 
//     System.out.println("Text: " + message.getContent()); 

        Object mp = (Object) message.getContent(); 

        if (mp instanceof String) 
        { 
         String body = (String)mp; 
         System.out.println("MSG Body : " + body); 
        } 
        else if (mp instanceof Multipart) 
        { 
         Multipart mpp = (Multipart)mp; 
         final BodyPart bp = mpp.getBodyPart(i); 
         System.out.println("Text: " +bp.getContent().toString()); 
        } else { 
         System.out.println("Inside else"); 
         Multipart mpp = (Multipart)mp; 
         final BodyPart bp = mpp.getBodyPart(i); 
         System.out.println("Text: " +bp.getContent().toString()); 
        } 

       } 
     } 
     catch(Exception e) 
     { 
      System.out.println("Exception Msg: " + e.getMessage()); 
     } 
    } 
} 

它總是走了進去else塊和火災例外。

+0

檢查這個答案下載一個罐子。 http://stackoverflow.com/a/12736366/3907612我認爲你有類似的問題 – Yantraguru

+0

@Kognizant我不認爲鏈接與我的問題 – VVB

回答

1

不知道你在問什麼。

在最後,你忽略了一個事實,即你已經確定它不是一個Multipart(它失敗了instanceof Multipart),而是繼續嘗試將它轉換爲一個Multipart。當然,它會失敗。

既然您已經知道ImapInputStream是可能性,那麼請添加一個else(如果專門針對該類(或更好的話,用於InputStream)並像其他任何流一樣處理它。更好的是,Java EE docs表示如果流不知道如何處理數據類型,那麼它將返回一個流,所以也許這就是您的最終選擇。

如果你專門檢查一個流,那麼你的最終else應該會產生某種錯誤。

+0

你剛剛重新解釋我的問題,而不是回答 – VVB

+0

不,我告訴過你你寫錯了代碼。你問爲什麼拋出一個異常......它會拋出異常,因爲代碼不正確。該API將InputStream定義爲最後一個返回類型,並且不處理它。你需要我寫代碼嗎? –

0

我已經做了一些改動n您的代碼,希望它有助於

try { 
    try { 
     imapstore = (IMAPStore) session.getStore("imaps"); 
    } catch (NoSuchProviderException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
    imapstore.connect("imap.gmail.com", "[email protected]", "passwordxxx"); 

    IMAPFolder folder; 
    folder = (IMAPFolder) imapstore.getFolder("Inbox"); 

    folder.open(IMAPFolder.READ_ONLY); 

    Message[] messages; 
    messages = folder.getMessages(); 
    for (int i = 0; i < messages.length; i++) { 
     Message message = messages[i]; 
     System.out.println("=============================="); 
     System.out.println("Email #" + (i + 1)); 
     System.out.println("Subject: " + message.getSubject()); 
     System.out.println("From: " + message.getFrom()[0]); 
     //     System.out.println("Text: " + message.getContent()); 

     Object mp; 
     try{ 
      mp = (Object) message.getContent(); 

      if (mp instanceof String) { 
       String body = (String)mp; 
       System.out.println("MSG Body : " + body); 
      } else if (mp instanceof MimeMultipart) { 
       MimeMultipart mpp = (MimeMultipart)mp; 
       for(int count =0;count<mpp.getCount();count++){ 
        MimeBodyPart bp = (MimeBodyPart)mpp.getBodyPart(count); 
        InputStream fileNme = bp.getInputStream(); 
        StringWriter writer = new StringWriter(); 
        IOUtils.copy(fileNme, writer, "UTF-8"); 
        String theString = writer.toString(); 
        System.out.println("Text: " +theString); 
       } 
      } else if (mp instanceof Multipart) { 
       Multipart mpp = (Multipart)mp; 
       for(int count =0;count<mpp.getCount();count++){ 
        MimeBodyPart bp = (MimeBodyPart)mpp.getBodyPart(count); 
        InputStream fileNme = bp.getInputStream(); 
        StringWriter writer = new StringWriter(); 
        IOUtils.copy(fileNme, writer, "UTF-8"); 
        String theString = writer.toString(); 
        System.out.println("Text: " +theString); 
       } 
      } 
     }catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} catch (MessagingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
} 

,您還需要包含IOUtils,你可以從http://www.java2s.com/Code/Jar/o/Downloadorgapachecommonsiojar.htm

+0

感謝您的回覆。讓我檢查 – VVB

+0

我試過你的解決方案,但它不會進入任何if..else塊。簡單地說,不讀郵件內容 – VVB

+0

add else System.out.println(「Class :::」+ mp.getClass()); 作爲最後一個塊,請讓我知道類名 –