为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕尼黑的夜晚无繁华 2021-05-31 10:29:16
我有一个现有的代码,可以正确下载和处理一些电子邮件。要处理的电子邮件必须有一个或多个 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 并递归获取附件,但我错过了大局。
查看完整描述

1 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

好吧,我通过检查 any 的类解决了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();

    }


}

现在它工作正常。


查看完整回答
反对 回复 2021-06-02
  • 1 回答
  • 0 关注
  • 175 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信