解析'multipart / alternative'内容类型

时间:2012-05-02 12:44:39

标签: java email javamail mime multipart

我正在使用javamail api从收件箱文件夹中获取未读邮件,问题是当我调用'multipart/alternative'时,我得到奇怪的内容类型Message.getContentType()
当我向下转换时消息内容(从Object)到课程Multipart我收到例外情况

Exception in thread "main" java.lang.classCastException: com.sun.mail.imap.IMAPInputStream cannot be cast to javax.mail.Multipart at............

我只想获取电子邮件的内容并将其存储在数据库中。

        subject  = messages[j].getSubject();                                
        System.out.println(messages[j].getContentType());
        if(messages[j].getContent() instanceof Multipart)
        {                                  
            Multipart mime = (Multipart) messages[j].getContent();

            for (int i = 0; i < mime.getCount(); i++)
            {
                BodyPart part = mime.getBodyPart(i);
                content += part.getContent().toString();
            }
        }   

感谢。

3 个答案:

答案 0 :(得分:1)

Multiplart / alternative不奇怪;事实上,这很常见。它通常由电子邮件客户端用于创建同一消息的两个版本,一个是纯文本,另一个是HTML。首先,您的电子邮件客户端必须检测到邮件是多部分/备用邮件,它可以通过在标题部分中找到这些标题来执行此操作:

MIME-Version: 1.0
Content-Type: multipart/alternative; boundary=some-boundary

其次,它必须解析每个替代正文部分,检查它们的标题以查看它要处理哪一个(或多个),然后执行此操作。

--some-boundary
Content-Type: text/plain

...The plain text version of the email goes here...

--some-boundary
Content-Type: text/html

<html>...The html version of the content goes here...</html>

--some-boundary--

答案 1 :(得分:0)

您可能遇到了here所述的同一问题。

请注意,multipart / alternative是完全正常的类型,如here所述。

答案 2 :(得分:0)

我在使用Android JavaMail阅读邮件附件时遇到了类似的问题。我通过添加以下代码行修复了此错误。 MailCap有问题,javamail找不到multipart / mixed部分的处理程序,所以需要添加这个位。这解决了我的问题。希望它可以帮助那些人。

MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
CommandMap.setDefaultCommandMap(mc);

干杯!