解析“多部分/替代”内容类型
Posted
技术标签:
【中文标题】解析“多部分/替代”内容类型【英文标题】:Parsing 'multipart/alternative' content-type 【发布时间】:2012-05-11 22:39:46 【问题描述】:我正在使用 javamail api 从收件箱文件夹中获取未读邮件,问题是当我调用 Message.getContentType()
时,我得到了奇怪的内容类型 'multipart/alternative'
。此外,当我向下转换邮件内容时(来自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();
谢谢。
【问题讨论】:
Java mail with attachment: ClassCastException on javax.mail.Multipart的可能重复 我刚刚发布了与我相关的答案 - here。 【参考方案1】:您可能遇到了与here 所述相同的问题。
请注意,multipart/alternative 是一种完全正常的类型,如 here 所述。
【讨论】:
【参考方案2】: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--
【讨论】:
【参考方案3】:我在使用 android JavaMail 阅读邮件附件时遇到了类似的问题。我已通过添加以下代码行来修复此错误。 MailCap有问题,javamail找不到multipart/mixed部分的handler,所以需要加上这个位。这解决了我的问题。希望它可以帮助那里的人。
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);
干杯!
【讨论】:
以上是关于解析“多部分/替代”内容类型的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 中使用 Alamofire 网络进行解析时,如何在请求中发送内容类型?
无法解析请求正文。确保请求正文与指定的内容类型匹配:应用程序/json [重复]
解析并对其进行一些更改后,为多部分电子邮件设置的内容类型应该是啥?