Как прочитать содержимое электронной почты?

Я разработал простое 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 и вызывает исключение.


person VVB    schedule 29.04.2015    source источник
comment
проверьте этот ответ. stackoverflow.com/a/12736366/3907612 Думаю, у вас похожая проблема   -  person Yantraguru    schedule 29.04.2015
comment
@Kognizant Я не думаю, что ссылка связана с моим вопросом   -  person VVB    schedule 29.04.2015


Ответы (2)


Я сделал несколько изменений в вашем коде, надеюсь, это поможет

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

вам также понадобится jar-файл, содержащий IOUtils, который можно загрузить с http://www.java2s.com/Code/Jar/o/Downloadorgapachecommonsiojar.htm

person Saurabh Jhunjhunwala    schedule 29.04.2015
comment
Спасибо за ответ. Дай мне проверить - person VVB; 29.04.2015
comment
Я попробовал ваше решение, но оно не входит ни в один из блоков if..else. Просто, не читая содержимое электронной почты - person VVB; 29.04.2015
comment
добавить еще System.out.println(Class ::: + mp.getClass()); как последний блок и, пожалуйста, дайте мне знать имя класса - person Saurabh Jhunjhunwala; 29.04.2015
comment
класс com.sun.mail.util.BASE64DecoderStream и класс com.sun.mail.imap.IMAPInputStream, который я получаю после размещения строки выше. - person VVB; 29.04.2015
comment
написать блок else и захватить данные с помощью InputStream fileNme = bp.getInputStream(); StringWriter Writer = новый StringWriter(); IOUtils.copy(fileNme, модуль записи, UTF-8); Строка theString = write.toString(); System.out.println(текст: +строка); - person Saurabh Jhunjhunwala; 29.04.2015
comment
Но когда я пытаюсь преобразовать объект в составной объект, он выдает исключение, тогда как это будет работать? - person VVB; 29.04.2015
comment
Все еще получаю это исключение после попытки с MimeMultipart Exception в потоке main java.lang.ClassCastException: com.sun.mail.imap.IMAPInputStream не может быть приведен к javax.mail.internet.MimeMultipart - person VVB; 29.04.2015
comment
Давайте продолжим обсуждение в чате. - person Saurabh Jhunjhunwala; 29.04.2015

Не уверен, что вы спрашиваете.

В финале вы игнорируете тот факт, что вы уже определили, что это не Multipart (это не удалось instanceof Multipart), но все равно попробуйте и приведите его к Multipart. Конечно провалится.

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

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

person Scott Sosna    schedule 29.04.2015
comment
Вы только что переосмыслили мой вопрос вместо того, чтобы ответить - person VVB; 29.04.2015
comment
Нет, я сказал вам, что вы написали плохой код. Вы спросили, почему он выдал исключение... он выдал исключение, потому что код неверен. API определяет InputStream как тип возвращаемого значения в крайнем случае, и вы не обрабатываете его. Вам нужно, чтобы я написал код? - person Scott Sosna; 29.04.2015