2

String添付ファイル付きのメールが含まれています。

(全体Stringで約2000行あるので、ここでは主要な部分だけを紹介します。)

開始String:

--_002_0BB5B2121E0AF543BC9F9664030EF5991ADD1C89SWBNTSRV26sorec_
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<html xmlns:v=3D"urn:schemas-microsoft-com:vml" xmlns:o=3D"urn:schemas-micr=
osoft-com:office:office" ......

メール本文の終わりと添付ファイルの始まり:

</div>
</body>
</html>

--_002_0BB5B2121E0AF543BC9F9664030EF5991ADD1C89SWBNTSRV26sorec_
Content-Type: image/jpeg; name="IMAG0205.jpg"
Content-Description: IMAG0205.jpg
...
/9j/4TokRXhpZgAATU0AKgAAAAgACAEPAAIAAABcAAAAbgEQAAIAAABcAAAAy... (base64 file)

したがって、メールに添付ファイルがない場合は、これを非常に長い形式で解析Stringするjavax.mail.MultiPartか、そのままにしておく必要があります。注:メールを として直接受け取る機会はありません。これしかありません。String
MultiPartString

これは私がこれまでに持っているものです:

/**
 * Return the primary text content of the message.
 */
private boolean textIsHtml = false;

private String getText(Part p) throws MessagingException, IOException {
    if (p.getContent() instanceof ByteArrayInputStream) {
        ByteArrayInputStream stream = (ByteArrayInputStream) p.getContent(); // This ByteArrayInputStream contains the long String mentioned in this question.
        MimeMessage message = new MimeMessage(session, stream); // here I try to create a MimeMessage from that String, but this doesn't work.
        p = message;
    }
    if (p.isMimeType("text/*")) {
        String s = (String) p.getContent();
        textIsHtml = p.isMimeType("text/html");
        return s;
    }

    if (p.isMimeType("multipart/alternative")) {
        // prefer html text over plain text
        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")) {
                if (text == null) {
                    text = getText(bp);
                }
                continue;
            } else if (bp.isMimeType("text/html")) {
                String s = getText(bp);
                if (s != null) {
                    return s;
                }
            } else {
                return getText(bp);
            }
        }
        return text;
    } else if (p.isMimeType("multipart/*")) {
        Multipart mp = (Multipart) p.getContent();
        for (int i = 0; i < mp.getCount(); i++) {
            String s = getText(mp.getBodyPart(i));
            if (s != null) {
                return s;
            }
        }
    }

    return null;
}

コード例は公式の Oracle FAQ ページObjectのコードですが、提供さgetContent()れた を新しいに変換するために少し変更されていMimeMessageます。作成された の代わりにMimeMessagemime-type があるため、コードは機能しません。そのため、最初の if ブロックの後にこれらの行を実行すると、ClassCastException がスローされます。text/htmlmultipart/*

    if (p.isMimeType("text/*")) {
        String s = (String) p.getContent();
        textIsHtml = p.isMimeType("text/html");
        return s;
    }

String巨大なパーサーを書かずに を解析する方法について賢い考えを持っている人はいますか?
前もって感謝します!

4

2 に答える 2

1

あなたの例の文字列はメッセージ全体ではなく、メッセージのマルチパート本文のみのようです。文字列が常にマルチパートであると仮定すると、DataSource を受け取る MimeMultipart コンストラクターを使用する必要があります。バイトが文字列から取得される InputStream を返す独自の DataSource 実装を作成する必要があります。DataSource 実装は、マルチパート コンテンツの「境界」パラメーターを含む ContentType 文字列を返す必要もあります。または、システム プロパティ「mail.mime.multipart.ignoremissingboundaryparameter」を「true」に設定する必要があります。javax.mail.internet パッケージの javadoc を参照してください。

以上で、JavaMail FAQ のサンプル コードを使用できるはずです。

文字列が常にマルチパートではない場合、元のメッセージの Content-Type ヘッダーにアクセスする必要があります。それがなければ、あなたはかなりめちゃくちゃです。

この時点で、なぜこの文字列を処理するのが非常に困難な方法で取得されているのかを尋ねるのは公正なことです。メッセージの本文だけでなく、元の MIME メッセージの内容全体を保存しないのはなぜですか? そもそも、JavaMail を使用してこの文字列を抽出/保存していますか?

于 2013-11-08T20:10:29.300 に答える