JAVA Mail MimeUtility.quote 函数抛出 NULL Pointer Exception.
帐前卒今天遇到 JAVA mail MimeUtility.quote 函数抛出 NULL Pointer Exception问题。找这个问题的确废了一番功夫:看栈信息,看源码,debug. 然后终于发现了问题的原因:
在Email里MimeBody中有这样一行:
Content-Type: application/octet-stream; name=""
这句话相当的神奇,让JavaMail抛出NPE.
但是这个问题是JavaMail这个库有问题,还是这封email没有遵循rfc规范?
于是 帐前 卒 找了一下rfc文档,在 rfc 2045 中找到了5.1章,发现如下内容:
value := token / quoted-string
token := 1*<any (US-ASCII) CHAR except SPACE, CTLs,
or tspecials>
tspecials := "(" / ")" / "<" / ">" / "@" /
"," / ";" / ":" / "\" / <">
"/" / "[" / "]" / "?" / "="
; Must be in quoted-string,
; to use within parameter values
这是语法定义。这里说,对于Content-Type header域的词法定义中,明确写了,不应该为空。那么JavaMail在这里发现为空抛出Exception也是理所应当。所以错在发信方。看到这里,那封不能被很好解析的邮件该怎么丢弃就怎么丢弃吧。然后把这个bug反馈给发信方。所以软件开发…还是需要时不时的看看rfc呀…
另外上面的问题是在获取Multipart p后,调用p.getContent(); 或者 p.getDataHandler()或者p.getInputStream()方法时,抛出的Null Pointer Exception.