当前位置: 首页 > 知识库问答 >
问题:

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

仇睿
2023-03-14

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

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

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
Filename: postacert.eml
ct: MESSAGE/RFC822; name=postacert.eml

有什么需要帮忙的吗?

谢谢

共有1个答案

孟新知
2023-03-14

我通过检查任何MimePart的类来解决这个问题,我发现嵌套消息的类型是IMAPNestedMessage,因此我递归地调用main方法processMessage:

private void processAttachment(final Multipart multipart) {

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

// BEGIN - Added this part
            System.out.println("CLASS bodyPart: " + bodyPart.getContent().getClass());

            if (bodyPart.getContent() instanceof IMAPNestedMessage) {
                processMessage((IMAPNestedMessage) bodyPart.getContent());
            } else {
// END - Added this part
                if (bodyPart.getContent() instanceof Multipart) {
                    processAttachment((Multipart) bodyPart.getContent());
                } else {
                    final boolean isXml = bodyPart.getFileName() != null && isXmlType(bodyPart.getContentType());
                    if (isXml) {
                        final InputStream inputStream = getReusableInputStream(bodyPart);
                        processXMLAttachment(inputStream);
                    }
                }
            }

        }
    } catch (final Exception e) {
        sendMailService.sendMailForImportINPSFailed("metodo processAttachment()", e);
        e.printStackTrace();
    }

}

现在工作得很好。

 类似资料:
  • 我试图通过检查元数据对象中的Content-Type键来访问不知何故提到的filename属性,但它不在那里。(我假设Tika评估内容类型的关键字不只是通过查看适当的标题,因此缺少所需的文件名) 因此,我的问题是(因为我无法弄清楚)是否有一种方法可以修改Tika源代码,以强制从内容类型头中提取文件名,当内容处置头中缺少适当的文件名属性时?

  • 我正试图从戈朗的一封邮件中得到一个附件。问题是从Gmail读取的base64有效负载给了我错误

  • 我尝试使用uploadAttachemnt方法上传zip文件,得到了一个secureHash作为输出。我试图下载相同的附件,使用hash作为openAttachmnet方法的输入,得到了一个InputStream。当我试图使用BuffeReader读取inputStream的内容时,它被加密了。我意识到我必须解压缩文件并读取它,所以我得到了这个包“import java.util.zip.ZipE

  • 实际上,我希望将文件更改为base64,并附加弹性搜索JSON数据。 下面给出了代码: 当我执行这些查询时,特别是在发布数据时,我会得到以下错误: 这类问题有什么解决办法吗?我试图在附加文件时将数据更改为base64。 帮助?? 甚至,当我给出双引号并执行时: 我得到这个错误 我是不是漏掉了什么?

  • 问题内容: 我有一个电子邮件多部分邮件对象,我想将该电子邮件中的附件转换为python文件对象。这可能吗?如果有可能,我应该考虑使用Python中的哪种方法或类来执行此类任务? 问题答案: 我不太了解“电子邮件多部分邮件对象”的意思。您的意思是属于该类的对象吗? 如果这就是您的意思,那很简单。在多部分消息上,该方法返回消息部分的列表(每个消息部分本身都是对象)。您可以遍历这些部分并检查它们的属性:

  • 我正在尝试检索与一个帖子相关联的所有图像。我能够返回ID并打印该ID,但当我尝试将其与get_posts()的参数一起添加时,它返回一个空数组。如果我不包含post_parent,它会给我媒体库中的所有图像,而不是我正在循环的文章的所有图像。我是不是在正确的水平上循环? 我尝试手动添加ID,但它仍然返回一个空数组。 我在等这篇文章的附件清单。我想从附件中获取一个图像并将其打印到页面。但我总是得到空