簡體   English   中英

Gmail工作時無法使用JavaMail讀取Outlook郵件

[英]Can't read Outlook mail with JavaMail, while Gmail works

基本上,我寫了一個從收件箱中讀取電子郵件的應用程序。 我一直在用Gmail發送的電子郵件測試應用程序。 但是現在當我試圖閱讀從Outlook發送的電子郵件時,我沒有收到任何內容。

我從兩封電子郵件中記錄了內容類型:Gmail返回: multipart/alternative; boundary=047d7b342bf2b6847f04d11df78a multipart/alternative; boundary=047d7b342bf2b6847f04d11df78a Outlook返回: text/html; charset=iso-8859-1 text/html; charset=iso-8859-1 注意:這些是相同的電子郵件,只是從不同的郵件客戶端發送的。

來自Gmail的郵件將是Multipart的一個實例。 而Outlook電子郵件將是String的一個實例。

我的代碼:

檢查消息是否為Multipart或String的實例的方法。

public void getContent(Message msg) throws IOException, Exception {

    Object contt = msg.getContent();
    System.out.println("Contenttype: " + msg.getContentType());

    if (contt instanceof Multipart) {
        checkDisposition = true;
        handleMultipart((Multipart) contt);
    } else if (contt instanceof String) {   
       handlePart((Part) msg);
    }
    prepareEmail(mpMessage);
}

如果消息是multipart,則將調用此方法:

public void handleMultipart(Multipart multipart)
        throws MessagingException, IOException, Exception {
    mpMessage = getText(multipart.getBodyPart(0));

    for (int z = 1, n = multipart.getCount(); z < n; z++) {
        handlePart(multipart.getBodyPart(z));

    }
}

如果消息不是,則直接調用:

public void handlePart(Part part)
        throws MessagingException, IOException, Exception {



    Object con = messageCopy.getContent();

    String disposition = part.getDisposition();
    String contentType = part.getContentType();

    if (checkDisposition) {


        if (disposition == null) {

            System.out.println("Disposition is null");

        } else if (disposition.equalsIgnoreCase(Part.ATTACHMENT)) {
            System.out.println("Attachment: " + part.getFileName()
                    + " : " + contentType);
            input = part.getInputStream();
            bytes = IOUtils.toByteArray(input);
        } else if (disposition.equalsIgnoreCase(Part.INLINE)) {
            System.out.println("Inline: "
                    + part.getFileName()
                    + " : " + contentType);
        } else {
            System.out.println("Other: " + disposition);
        }
    }else{
        mpMessage = part.getContent().toString(); //returns nothing



        System.out.println("mpMessage handlePart "+mpMessage); //returns nothing
        System.out.println("mpMessage handlePart "+part.getLineCount()); //returns 0
        System.out.println("mpMessage handlePart "+part.getContentType()); //returns text/html chartset=iso-8859-1
        System.out.println("mpMessage handlePart "+part.getSize()); // returns 22334
        part.writeTo(System.out); //See below

    }

}

從部件返回文本的方法:

private String getText(Part p) throws
        MessagingException, IOException {

    System.out.println("getText contentType "+p.getContentType());

//This part gets called if trying to read an Outlook mail, its not clear for me how to  retrieve the text from the part. Since `p.getContent()` returns nothing
    if (p.isMimeType("text/*")) {
        String s = (String) p.getContent();
        System.out.println();
        return String.valueOf(s);
    }

    if (p.isMimeType("multipart/alternative")) {
        Multipart mp = (Multipart) p.getContent();
        String text = null;
        for (int i = 0; i < mp.getCount(); i++) {
            Part bp = mp.getBodyPart(i);
            if (bp.isMimeType("text/plain")) {
                String s = getText(bp);
                if (s != null) {
                    return s;
                }
            }
        }
        return text;
    }
    return null;
}

part.writeTo(System.out)返回:

收到:來自AMSPRD0710HT005.eurprd07.prod.outlook.com Server(TLS)id 00000; 星期四,2012年12月20日09:28:23 +0000收到:來自AMSPRD0710MB354.eurprd07.prod.outlook.com([00.000.0000])AMSPRD0710HT005.eurprd07.prod.outlook.com([00.000.0000])with mapi id 14.16.0245.002; 星期四,2012年12月20日09:28:05 +0000來自:測試至:支持主題:Verwerkingsverslag Kenmerk:0824496主題 - 主題:Verwerkingsverslag Kenmerk:0824496主題索引:Ac3elFC2qYsSo + SOT2ii4HnbCCqgVw ==日期:星期四,2012年12月20日10: 28:05 +0100消息ID:...

等等。

消息本身的內容將作為HTML代碼返回,而不僅僅是普通文本。

如何從Outlook電子郵件中檢索純文本,而不是HTML代碼? 或者如何在handlePart中檢索部件的內容?

任何幫助表示贊賞,

謝謝!

您似乎假設Outlook使用HTML版本發送純文本,但似乎並非如此。 您從Outlook記錄的電子郵件的MIME類型是text/html ,表示它只是一個HTML格式的文檔。 另一方面,Gmail版本發送了一個multipart/alternative文檔,這可能表明同一文檔中有多個版本的電子郵件(純文本和HTML - 我相信這是Gmail的默認行為)。 因此,如果您獲得HTML編碼版本,您將收到電子郵件的“文本”,就像它發送一樣。

不要求使用純文本版本或實際上使用任何其他格式發送電子郵件。 您可以確保郵件客戶端以您的消費程序可以處理的格式發送電子郵件,或者更改消費程序以處理正在發送的格式。

除上述內容外,您可能還想重新考慮以下內容:

mpMessage = getText(multipart.getBodyPart(0));

這似乎假設多部分消息的第一部分將是純文本文檔和消息的文本。 這可能是一個糟糕的假設。


因此,假設您實際上已收到帶有HTML內容的郵件消息,則getContent()不應返回null或空字符串。 它應該按照MimeBodyPart#getContent()文檔返回一個InputStream 讀取InputStream應該可以生成帶有HTML標記的字符串。

由於您似乎並不關心HTML,而只關心內容,因此只需使用Java HTML解析庫(如Jsoup)即可大大簡化該過程。 基本上,您可以通過將getText()更改為以下內容將其集成到當前代碼中:

private String getText(Part p) throws MessagingException, IOException {
    System.out.println("getText contentType "+p.getContentType());
    if (p.isMimeType("text/plain")) {
        String s = (String) p.getContent();
        System.out.println(s);
        return s;
    } else if (p.isMimeType("text/html")) {
        // the last two parameters of this may need to be modified
        String s = Jsoup.parse(p.getInputStream(), null, null).text();
        System.out.println(s);
        return s;
    } else if (p.isMimeType("multipart/alternative")) {
        Multipart mp = (Multipart) p.getContent();
        String text = "";
        for (int i = 0; i < mp.getCount(); i++) {
            Part bp = mp.getBodyPart(i);
            if (bp.isMimeType("text/*")) {
                String s = getText(bp);
                if (s != null) {
                    text += s;
                }
            }
        }
        return text;
    }
    return null;
}

請注意,這假定電子郵件足夠小,可以在內存中完全讀取和解析。

暫無
暫無

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

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