【问题标题】:How to read email contents?如何阅读电子邮件内容?
【发布时间】:2015-07-08 09:33:09
【问题描述】:

我开发了简单的 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", "usernamexxxxx@gmail.com", "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 块并引发异常。

【问题讨论】:

标签: java email gmail inbox


【解决方案1】:

我对你的代码做了一些修改,希望对你有帮助

 try {
     try {
         imapstore = (IMAPStore) session.getStore("imaps");
     } catch (NoSuchProviderException e1) {
         // TODO Auto-generated catch block
         e1.printStackTrace();
     }
     imapstore.connect("imap.gmail.com", "usernamexxxxx@gmail.com", "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 的 jar,您可以从 http://www.java2s.com/Code/Jar/o/Downloadorgapachecommonsiojar.htm 下载它

【讨论】:

  • 感谢您的回复。让我检查一下
  • 我尝试了您的解决方案,但它没有进入任何 if..else 块。简单地说,不阅读电子邮件内容
  • add else System.out.println("Class ::: " + mp.getClass());作为最后一个块,请告诉我班级名称
  • class com.sun.mail.util.BASE64DecoderStream & class com.sun.mail.imap.IMAPInputStream 我在上面一行之后得到了。
  • 使用 InputStream fileNme = bp.getInputStream() 编写一个 else 块并捕获数据; StringWriter writer = new StringWriter(); IOUtils.copy(fileNme, writer, "UTF-8");字符串 theString = writer.toString(); System.out.println("文本:" +theString);
【解决方案2】:

不知道你在问什么。

在最后的 else 中,您忽略了一个事实,即您已经确定它不是 Multipart(它失败了 instanceof Multipart),但继续尝试将其转换为 Multipart。当然会失败。

既然您知道 ImapInputStream 是一种可能性,那么可以专门为该类(或者更好的是,为 InputStream)添加一个 else-if 并像处理任何其他流一样处理它。更好的是,Java EE docs 说如果流不知道如何处理数据类型,则返回一个流,所以也许这就是你的最终选择。

如果您专门检查流,那么您的最终 else 应该会产生某种错误。

【讨论】:

  • 你只是重新解释了我的问题,而不是回答
  • 不,我告诉过你你写的代码很糟糕。你问为什么它抛出异常......它抛出异常是因为代码不正确。 API 将 InputStream 定义为最后手段的返回类型,您无需处理它。需要我写代码吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-26
  • 2021-11-01
  • 2011-03-21
  • 1970-01-01
  • 2014-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多