Java 解析';多部分/备选方案';内容类型

Java 解析';多部分/备选方案';内容类型,java,email,jakarta-mail,mime,multipart,Java,Email,Jakarta Mail,Mime,Multipart,我使用javamail api从收件箱文件夹中获取未读邮件,问题是调用Message.getContentType()时,我得到了奇怪的内容类型'multipart/alternative',当我向下转换邮件内容时(从对象)对于classMultipart我在线程“main”java.lang.classCastException:com.sun.mail.imap.IMAPInputStream中得到一个异常异常,无法在……… 我只想获取电子邮件的内容并将其存储在数据库中 su

我使用javamail api从收件箱文件夹中获取未读邮件,问题是调用
Message.getContentType()
时,我得到了奇怪的内容类型
'multipart/alternative'
,当我向下转换邮件内容时(从
对象
)对于class
Multipart
我在线程“main”java.lang.classCastException:com.sun.mail.imap.IMAPInputStream中得到一个异常

异常,无法在………

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

        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();
            }
        }   
subject=messages[j].getSubject();
System.out.println(messages[j].getContentType());
if(消息[j].getContent()多部分实例)
{                                  
多部分mime=(多部分)消息[j].getContent();
对于(int i=0;i

谢谢。

您可能遇到了上述相同的问题


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

multipart/alternative不是奇数;事实上,这很常见。电子邮件客户端通常使用它来创建同一消息的两个版本,一个是纯文本,另一个是HTML。首先,您的电子邮件客户端必须检测到邮件是多部分/可选的,这可以通过在headers部分中查找以下标题来实现:

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--
——一些边界
内容类型:文本/纯文本
…电子邮件的纯文本版本放在这里。。。
--一些边界
内容类型:text/html
…html版本的内容放在这里。。。
--一些边界--

在使用Android JavaMail阅读邮件附件时,我遇到了类似的问题。我通过添加以下代码行修复了此错误。MailCap有点问题,javamail无法找到多部分/混合部分的处理程序,因此需要添加此位。这解决了我的问题。希望它能帮助其他人

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

干杯

可能重复我刚刚发布的答案,我的答案可能是相关的-。