2015-04-29 4 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", "[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. Конечно, это провалится.

Теперь, когда вы знаете, что ImapInputStream - это возможность, добавьте else-if специально для этого класса (или, лучше, для InputStream) и обработайте его, как и любой другой поток. Еще лучше, Java EE docs говорят, что поток возвращается, если он не знает, что делать с типом данных, так что, возможно, это ваш последний.

Если вы специально проверяете поток, то ваш последний файл должен генерировать ошибку.

+0

Вы только что объяснили мой вопрос, а не ответили – VVB

+0

Нет, я сказал вам что вы написали плохой код. Вы спросили, почему он выбрал исключение ... он выдает исключение, потому что код неверен. API определяет InputStream как возвращаемый тип последней инстанции, и вы не обрабатываете его. Мне нужно написать код? –

0

Я сделал несколько изменений п кода, надеюсь, что это помогает

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

добавить еще System.out.println ("Class :::" + mp.getClass()); как последний блок, и, пожалуйста, дайте мне знать имя класса –

Смежные вопросы