0

基本的に、受信トレイからメールを読み取るアプリケーションを作成しました。私はいつもGmailから送信された電子メールでアプリケーションをテストしてきました。しかし、Outlookから送信された電子メールを読み込もうとすると、コンテンツが返されません。

両方の電子メールからコンテンツタイプを記録しました:Gmailの戻り値:multipart/alternative; boundary=047d7b342bf2b6847f04d11df78a Outlookの戻り値:text/html; charset=iso-8859-1 注:これらは同じ電子メールであり、異なるメールクライアントから送信されたものです。

GmailからのメールはMultipartのインスタンスになります。Outlookの電子メールは文字列のインスタンスになりますが。

私のコード:

メッセージが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);
}

メッセージがマルチパートの場合、このメソッドが呼び出されます。

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サーバー(TLS)ID00000から。2012年12月20日木曜日09:28:23+0000受信:AMSPRD0710MB354.eurprd07.prod.outlook.com([00.000.0000])からAMSPRD0710HT005.eurprd07.prod.outlook.com([00.000.0000])とmapi id 14.16.0245.002; 2012年12月20日木曜日09:28:05+0000差出人:テスト宛先:サポート件名:Verwerkingsverslag Kenmerk:0824496スレッドトピック:Verwerkingsverslagケンメルク:0824496スレッドインデックス:Ac3elFC2qYsSo + SOT2ii4HnbCCqgVw ==日付:2012年12月20日木曜日10: 28:05 +0100メッセージID:..。

等々。

メッセージ自体のコンテンツは、通常のテキストだけでなく、HTMLコードとして返されます。

HTMLコードではなく、Outlookの電子メールからプレーンテキストを取得するにはどうすればよいですか?または、handlePartでパーツのコンテンツを取得するにはどうすればよいですか?

どんな助けでもありがたいです、

ありがとう!

4

1 に答える 1

2

OutlookがHTMLバージョンでプレーンテキストを送信したと想定しているようですが、そうではないようです。Outlookからログに記録した電子メールのMIMEタイプはですtext/html。これは、それが単なるHTML形式のドキュメントであることを示しています。一方、Gmailバージョンはのドキュメントを送信しましたmultipart/alternative。これは、同じドキュメントに複数のバージョンのメールがあることを示している可能性があります(プレーンテキストとHTML-これがGmailのデフォルトの動作だと思います)。したがって、HTMLでエンコードされたバージョンを取得している場合は、送信されたとおりの電子メールの「テキスト」を取得しています。

電子メールをプレーンテキストバージョンで送信する必要はなく、実際、他の形式で送信する必要もありません。メールクライアントが、消費側プログラムが処理できる形式で電子メールを送信していることを確認するか、送信される形式を処理するように消費型プログラムを変更するのはあなた次第です。

上記に加えて、次の行を再検討することをお勧めします。

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

これは、マルチパートメッセージの最初の部分がプレーンテキストドキュメントとメッセージのテキストであると想定しているように見えます。これは悪い仮定かもしれません。


したがって、実際にHTMLコンテンツを含むメールメッセージを受け取ったと仮定すると、返されたり、空の文字列getContent()が返されたりすることはありません。のドキュメントに従って、をnull返す必要があります。を読むと、HTMLタグを使用して文字列を作成できるようになります。InputStreamMimeBodyPart#getContent()InputStream

HTMLではなくコンテンツだけを気にしているように見えるので、JsoupなどのJavaHTML解析ライブラリを使用するだけでプロセスを大幅に簡素化できます。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;
}

これは、電子メールがメモリ内で完全に読み取られて解析されるのに十分小さいことを前提としていることに注意してください。

于 2012-12-20T11:54:09.010 に答える