JavaMail - 如何阅读实际的邮件内容,而不是“javax.mail.internet.MimeMultipart”

Posted

技术标签:

【中文标题】JavaMail - 如何阅读实际的邮件内容,而不是“javax.mail.internet.MimeMultipart”【英文标题】:JavaMail - how to read actual message content, instead of "javax.mail.internet.MimeMultipart" 【发布时间】:2017-07-05 22:52:06 【问题描述】:

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

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

// 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?例如,如果一封电子邮件显示“Hello World!”我希望它在相关电子邮件的“文本:”之后打印。

对此的任何帮助将不胜感激!

【问题讨论】:

您确实应该了解电子邮件是如何构造的。现在很少有消息包含纯文本而没有其他内容。它通常由几个部分组成,基于 MIME 标准,其中每个部分可以是文本、附件、html 等。参见my answer here,它是关于编写消息的,但会帮助您理解结构。 reading body part of a mime multipart的可能重复 您可能想阅读documentation of the getContent method。 【参考方案1】:

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

在这种情况下,您将需要编写一个递归解析方法,直到整个主体都被解析完。

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

【讨论】:

【参考方案2】:

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;

【讨论】:

【参考方案3】:

谢谢大家的回答!

我找到了一个解决方案 - 我不会在这里发布确切的代码,但我会说一下我使用的代码,以防将来有人遇到这个帖子。

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

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

然后这是一个简单的例子,只需将它打印到系统输出。

【讨论】:

以上是关于JavaMail - 如何阅读实际的邮件内容,而不是“javax.mail.internet.MimeMultipart”的主要内容,如果未能解决你的问题,请参考以下文章

javamail 阅读邮件时,有啥理由使用 Message 而不是 MimeMessage 等?

javamail 访问共享邮箱

无法使用 JavaMail 读取 Outlook 邮件,而 Gmail 可以工作

JavaMail入门第五篇 解析邮件

JavaMail入门第五篇 解析邮件

在 JavaMail 中获取 html 电子邮件内容