JavaMail - 如何阅读实际的消息内容,而不是" javax.mail.internet.MimeMultipart"

时间:2017-02-16 17:13:29

标签: java email javamail

我创建了一个基本的电子邮件客户端,它从服务器获取电子邮件,并将其显示给用户。

我有比这更多的代码,但这是打印消息的主体:

// retrieve the messages from the folder in an array and print it
        Message[] messages = emailFolder.getMessages();
        System.out.println("messages.length---" + messages.length);

        for (int i = 0, n = messages.length; i < n; i++) {
            String content= messages[i].getContent().toString();
            Message message = messages[i];
            System.out.println("---------------------------------");
            System.out.println("Email Number " + (i + 1));
            System.out.println("Subject: " + message.getSubject());
            System.out.println("From: " + message.getFrom()[0]);
            System.out.println("Text: " + message.getContent().toString());

        }

但是,当我运行程序时,我得到以下输出:

messages.length---4
---------------------------------
Email Number 1
Subject: Access for less secure apps has been turned on
From: Google <no-reply@accounts.google.com>
Text: javax.mail.internet.MimeMultipart@69ea3742
---------------------------------
Email Number 2
Subject: Three tips to get the most out of Gmail
From: Gmail Team <mail-noreply@google.com>
Text: javax.mail.internet.MimeMultipart@71318ec4
---------------------------------
Email Number 3
Subject: Stay more organized with Gmail's inbox
From: Gmail Team <mail-noreply@google.com>
Text: javax.mail.internet.MimeMultipart@21213b92
---------------------------------
Email Number 4
Subject: The best of Gmail, wherever you are
From: Gmail Team <mail-noreply@google.com>
Text: javax.mail.internet.MimeMultipart@a67c67e

Process finished with exit code 0

是否有任何方法可以显示实际消息,而不是mime multipart?例如,如果电子邮件阅读&#34; Hello World!&#34;我想在&#34; Text:&#34;之后打印出来。对于相关的电子邮件消息。

对此的任何帮助都将受到高度赞赏!!

3 个答案:

答案 0 :(得分:0)

MimeMultipart本身的内容可以是MimeMultipart类型。

在这种情况下,您需要编写递归解析方法,直到解析整个正文。

if (bodyPart.getContent() instanceof MimeMultipart){ //Parse body again }

答案 1 :(得分:0)

JavaMail FAQ有以下示例代码,但除非understand how MIME messages work,否则对您没有任何意义。

private boolean textIsHtml = false;

/**
 * Return the primary text content of the message.
 */
private String getText(Part p) throws
            MessagingException, IOException {
    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;
}

答案 2 :(得分:0)

谢谢你的答案!

我找到了一个解决方案 - 而且我不会在这里发布确切的代码,但是我会说出我将来会使用的内容,以防将来有人遇到这个问题。

我基本上创建了一个Multipart对象,并按照建议使用了getContent()方法。

我还创建了一个BodyPart对象,从这个Multipart分支。

然后只是将其打印到系统输出的简单情况。