我使用javamail-1.4.5从gmail(imap)获取邮件。如果Content-Disposition具有不带引号的参数,则方法getDisposition将失败。
消息部分:
Content-Transfer-Encoding: 7bit
Content-Type: message/rfc822
Content-Disposition: attachment;
creation-date=Wed, 11 Feb 2015 10:23:48 GMT;
modification-date=Wed, 11 Feb 2015 10:23:48 GMT
异常:
javax.mail.internet.ParseException: Expected ';', got ","
at javax.mail.internet.ParameterList.<init>(ParameterList.java:289)
at javax.mail.internet.ContentDisposition.<init>(ContentDisposition.java:100)
at javax.mail.internet.MimeBodyPart.getDisposition(MimeBodyPart.java:1076)
UPD1:这是我的代码的一部分。我在方法handlePart,第1行
中遇到错误private void handleMessage(Message message) {
Object content = message.getContent();
if(content instanceof Multipart) {
handleMultipart((Multipart) content);
}
else {
handlePart(message);
}
}
private void handleMultipart(Multipart mp) {
for(int i = 0; i < mp.getCount(); i++) {
Part part = mp.getBodyPart(i);
Object content = part.getContent();
if(content instanceof Multipart) {
handleMultipart((Multipart) content);
}
else {
handlePart(part);
}
}
}
private void handlePart(Part part) {
String disposition = part.getDisposition(); //GETTING ERROR
String contentType = part.getContentType();
if(disposition == null) {
if(contentType.toLowerCase().startsWith("text/html")) {
html = (String) part.getContent();
}
else if(contentType.toLowerCase().startsWith("text/plain")) {
text = (String) part.getContent();
}
else {
handleAttachment(part);
}
}
else if(disposition.equalsIgnoreCase(Part.ATTACHMENT)) {
handleAttachment(part);
}
else if(disposition.equalsIgnoreCase(Part.INLINE)) {
handleAttachment(part);
}
}
答案 0 :(得分:3)
邮件格式不正确。什么程序创建了消息?请将此错误报告给该计划的所有者。
您可以通过将系统属性“mail.mime.parameters.strict”设置为“false”来解决此错误;请参阅javadocs for the javax.mail.internet package和ParameterList类。
答案 1 :(得分:0)
失败,因为存在语法错误。缺乏报价是非法的。除了提交补丁,修补内容处理和内容类型错误之外,关于异常的事情并不多,这是无休止的工作。根据我的经验,Content-Disposition获得的不仅仅是错误的公平份额。我写了至少十几个解决方法(不是针对javamail),每个都有单元测试。这很辛苦,可能不值得。
由于您必须为未指定的C-D提供合适的后备,因此您也可以利用该后备来处理错误和无意义的处置:
String disposition = null;
try {
disposition = part.getDisposition();
} catch(ParseException x) {
// treat Content-Disposition as unspecified if it cannot be parsed
disposition = null;
}
BTW:给自己发一条带有“Content-type:text / plain; utf8”的消息,并检查你是否也处理了该解析异常。