【问题标题】:javamail-1.4.5 error at parsing gmail message received via imap解析通过 imap 收到的 gmail 消息时出现 javamail-1.4.5 错误
【发布时间】:2015-04-17 20:01:15
【问题描述】:

我正在使用 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);
    }
}

【问题讨论】:

  • 请添加您的代码。

标签: java gmail jakarta-mail imap


【解决方案1】:

消息格式不正确。什么程序创建了消息?请将此错误报告给该程序的所有者。

您可以通过将系统属性“mail.mime.parameters.strict”设置为“false”来解决此错误;请参阅 javadocs for the javax.mail.internet packageParameterList 类。

另外,您可能想upgrade to the current 1.5.2 version of JavaMail

【讨论】:

  • 谢谢。将“mail.mime.parameters.strict”设置为“false”可修复该错误
【解决方案2】:

因为语法错误而失败。没有引用是违法的。对于异常,您无能为力,除非提交补丁,而且围绕内容处置和内容类型错误进行修补是永无止境的工作。以我的经验,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”的消息,并检查您是否也处理了该解析异常。

【讨论】:

    猜你喜欢
    • 2016-09-28
    • 2019-01-22
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多