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 等?