簡體   English   中英

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

[英]javax.mail: Get nested attachments in EML attachment

我有一個現有的代碼可以正確下載和處理一些電子郵件。

要處理的電子郵件必須有一個或多個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

有什么幫助嗎?

謝謝

好吧,我通過檢查任何MimePart的類來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();
    }

}

現在它工作正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM