簡體   English   中英

在java中解析Multipart /與Multipart / Alternative主體混合

[英]Parsing Multipart/Mixed with Multipart/Alternative body in java

我從客戶端收到電子郵件,他們在multipart / mixed消息中嵌套了multipart / alternative消息。 當我得到消息的正文時,它只返回multipart / alternative級別,而我真正想要的是包含在multipart / alternative中的text / html部分。

我查看了javax.mail的javadocs,我找不到一個簡單的方法來獲取bodypart的主體,它本身是一個multipart或跳過第一個multipart / mixed部分並進入multipart / alternative body來讀取text / html和text / plain pieces。

電子郵件結構如下所示:

...
Content-Type: multipart/mixed; 
    boundary="----=_Part_19487_1145362154.1418138792683"

------=_Part_19487_1145362154.1418138792683
Content-Type: multipart/alternative; 
    boundary="----=_Part_19486_1391901275.1418138792683"

------=_Part_19486_1391901275.1418138792683
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset=ISO-8859-1

...

------=_Part_19486_1391901275.1418138792683
Content-Transfer-Encoding: 7bit
Content-Type: text/html; charset=ISO-8859-1

...

------=_Part_19486_1391901275.1418138792683--

------=_Part_19487_1145362154.1418138792683--

這是用於解析電子郵件的代碼的大綱:

Message [] found = fldr.search(searchCondition);           
for (int i = 0; i < found.length; i++) {
    Message m = found[i];
    Object o = m.getContent();
    if (o instanceof Multipart) {
        log.info("**This is a Multipart Message.  ");
        Multipart mp = (Multipart)o;
        log.info("The Multipart message has " + mp.getCount() + " parts.");
        for (int j = 0; j < mp.getCount(); j++) {
            BodyPart b = mp.getBodyPart(j);

            // Loop if the content type is multipart then get the content that is in that part,
            // make it the new container and restart the loop in that part of the message.
            if (b.getContentType().contains("multipart")) {
                mp = (Multipart)b.getContent();
                j = 0;
                continue;
            }

            log.info("This content type is " + b.getContentType());

            if(!b.getContentType().contains("text/html")) {
                continue;
            }

            Object o2 = b.getContent();
            if (o2 instanceof String) {
                <do things with content here>
            }
        }
    }
}

它似乎繼續停留在第二個邊界,而不是進一步解析任何東西。 在上述消息的情況下,它在boundary =“---- = _ Part_19486_1391901275.1418138792683”處停止,並且永遠不會到達消息的文本。

在這個塊中:

if (b.getContentType().contains("multipart"))
{
    mp = (Multipart)b.getContent();
    j = 0;
    continue;
}

j設置為0並要求循環繼續,希望它將從零開始。 但是增量操作j++將在之前出現,你的循環將從1開始,而不是0。

j設置為-1可以解決您的問題。

if (b.getContentType().contains("multipart"))
{
    mp = (Multipart)b.getContent();
    j = -1;
    continue;
}

我已經測試了你的代碼,但也失敗了。

在我的例子中, b.getContentType()返回所有大寫字符(例如“TEXT / HTML; charset = UTF-8”)。 所以我把它轉換成小寫並且它有效。

String contentType=b.getContentType().toLowerCase(Locale.ENGLISH);

if(!contentType.contains("text/html")) {
   continue;
}

暫無
暫無

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

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