解析通过 imap 接收的 gmail 消息时出现 javamail-1.4.5 错误
javamail-1.4.5 error at parsing gmail message received via imap
我正在使用 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);
}
}
邮件格式不正确。什么程序创建了消息?请向该程序的所有者报告此错误。
您可以通过将系统 属性 "mail.mime.parameters.strict" 设置为 "false" 来解决此错误;请参阅 javadocs for the javax.mail.internet package and the ParameterList class.
它失败了,因为存在语法错误。缺少引用是非法的。除了提交补丁之外,您对异常无能为力,而且围绕内容处置和内容类型错误打补丁是一项永无止境的工作。根据我的经验,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;
}
顺便说一句:用 "Content-type: text/plain; utf8" 向自己发送一条消息,并检查您是否也处理了该解析异常。
我正在使用 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);
}
}
邮件格式不正确。什么程序创建了消息?请向该程序的所有者报告此错误。
您可以通过将系统 属性 "mail.mime.parameters.strict" 设置为 "false" 来解决此错误;请参阅 javadocs for the javax.mail.internet package and the ParameterList class.
它失败了,因为存在语法错误。缺少引用是非法的。除了提交补丁之外,您对异常无能为力,而且围绕内容处置和内容类型错误打补丁是一项永无止境的工作。根据我的经验,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;
}
顺便说一句:用 "Content-type: text/plain; utf8" 向自己发送一条消息,并检查您是否也处理了该解析异常。