javax.mail:获取EML附件中的嵌套附件

时间:2018-07-18 14:47:17

标签: java javamail eml

我有一个现有代码,可以正确下载和处理一些电子邮件。

要处理的电子邮件必须具有一个或多个xml作为附件,现在我要该过程从当前标准邮件帐户迁移到经过认证的系统,该系统将该邮件包装为新的电子邮件

因此,我必须解析带有XML(经过认证的邮件)和EML(我应处理的邮件)的电子邮件,而不是带有一个xml附件的普通电子邮件。

简而言之,我的代码如下:

private void processMessage(final Message message) {
    try {
        final String contentType = message.getContentType();
        if (contentType.contains("multipart")) {
            final Multipart multiPart = (Multipart) message.getContent();

            for (int i = 0; i < multiPart.getCount(); i++) {
                final MimeBodyPart part = (MimeBodyPart) multiPart.getBodyPart(i);

                /**************************************************************
                 * HERE I CAN'T GET THE EML (and its attachments) FROM 'part' *
                 **************************************************************/

                if (Part.ATTACHMENT.equalsIgnoreCase(part.getDisposition())) {
                    processAttachment(part);
                }
            }
        }
    } [...cutted...]
}

private void processAttachment(final MimeBodyPart part) throws IOException, MessagingException {
    final InputStream input = getReusableInputStream(part);

    if (part.getFileName() != null && isXmlType(part.getContentType())) {
        processXml(input);
    }
}

我应该对其进行修改,以便解析EML并以递归方式获取附件,但是我没有看到大图景。

更新:我已经修改了processAttachment方法(但仍然无法使用):

private void processAttachment(final Multipart multipart) {

    try {
        for (int i = 0; i < multipart.getCount(); i++) {
            final BodyPart bodyPart = multipart.getBodyPart(i);

            if (bodyPart.getContent() instanceof Multipart) {
                // part-within-a-part, do some recursion...
                extractAttachment((Multipart) bodyPart.getContent());
            }

            System.out.println("Filename: " + bodyPart.getFileName());
            System.out.println("ct: " + bodyPart.getContentType());

            final boolean isXml = bodyPart.getFileName() != null && isXmlType(bodyPart.getContentType());
            if (isXml) {
                final InputStream inputStream = getReusableInputStream(bodyPart);
                processXMLAttachment(inputStream);
            }

        }
    } [cutted]

}

输出为:

Filename: null
ct: TEXT/PLAIN; charset=iso-8859-1
Filename: null
ct: TEXT/HTML; charset=iso-8859-1
Filename: daticert.xml
ct: APPLICATION/XML; name=daticert.xml
Filename: postacert.eml
ct: MESSAGE/RFC822; name=postacert.eml
Filename: smime.p7s
ct: APPLICATION/X-PKCS7-SIGNATURE; name=smime.p7s

从输出中,我可以看到系统仅扫描了第一级附件daticert.xmlpostacert.eml,但没有找到嵌套的附件。

更具体地说,我必须阅读以下内容:

Filename: postacert.eml
ct: MESSAGE/RFC822; name=postacert.eml

有什么帮助吗?

谢谢

1 个答案:

答案 0 :(得分:0)

好吧,我通过检查任何MimePart的类来解决,发现嵌套消息的类型为IMAPNestedMessage,因此在这种对象上我递归调用了主方法{{1} }:

processMessage

现在工作正常。