java JavaMail - 解析电子邮件内容,似乎无法让它工作!(Message.getContent())
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/5628395/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
JavaMail - Parsing email content, can't seem to get it to work! (Message.getContent())
提问by Rhys12341111
For a few weeks I have been developing a email client for android, I have been ignoring parsing email content for a while as I have never been able to get it to work. Thus, the time has come to ask for help!
几个星期以来,我一直在为 android 开发电子邮件客户端,我一直忽略解析电子邮件内容有一段时间,因为我一直无法让它工作。因此,是时候寻求帮助了!
I have been looking around and I have come across a few methods I have tried but never had much success with! Currently my closest attempt would have to be:
我一直在环顾四周,发现了一些我尝试过但从未取得太大成功的方法!目前我最接近的尝试必须是:
private String parseContent(Message m) throws Exception
{
//Multipart mp = (Multipart)c;
//int j = mp.getCount();
/*for (int i = 0; i < mp.getCount(); i++)
{
Part part = mp.getBodyPart(i);
System.out.println(((MimeMessage)m).getContent());
content = content + part.toString();
//System.out.println((String)part.getContent());
}*/
Object content = m.getContent();
String contentReturn = null;
if (content instanceof String)
{
contentReturn = (String) content;
}
else if (content instanceof Multipart)
{
Multipart multipart = (Multipart) content;
BodyPart part = multipart.getBodyPart(0);
part.toString();
contentReturn = part.getContent().toString();
}
return contentReturn;
}
But it does not work and I get gibberish such as "javax.mail.internet.MimeMultipart@44f12450".
但它不起作用,我得到了诸如“javax.mail.internet.MimeMultipart@44f12450”之类的胡言乱语。
Can anyone see where I am going wrong?
谁能看到我哪里出错了?
Thanks, Rhys
谢谢,里斯
回答by Aneesh Vijendran
None of the above suggestions is valid. You don't need to do anything complex here. Mimemessage has got message.writeTo(outputStream);
以上建议均无效。你不需要在这里做任何复杂的事情。Mimemessage 有message.writeTo(outputStream);
All you need to print the message is:
打印消息所需的全部内容是:
message.writeTo(System.out);
The above code will print the actual mime message to the console (or you can use any logger).
上面的代码会将实际的 mime 消息打印到控制台(或者您可以使用任何记录器)。
Save the content to .emland you can open it in outlook. Simple as that!
将内容保存为.eml,您可以在 Outlook 中打开它。就那么简单!
回答by DiTime4Tea
Multipart multipart = (Multipart) content;
BodyPart part = multipart.getBodyPart(0);
part.toString();
contentReturn = part.getContent().toString();
When you have BodyPart part, you should keep testing
当你有 BodyPart 部分时,你应该继续测试
if(part.getContent() instanceof String){ ... }
if(part.getContent() instanceof String){ ... }
回答by NoNaMe
I also got the same error any tried almost every thing, but the solution worked for me is
我也遇到了同样的错误,几乎所有的事情都尝试过,但对我有用的解决方案是
private String getFinalContent(Part p) throws MessagingException,
IOException {
String finalContents = "";
if (p.getContent() instanceof String) {
finalContents = (String) p.getContent();
} else {
Multipart mp = (Multipart) p.getContent();
if (mp.getCount() > 0) {
Part bp = mp.getBodyPart(0);
try {
finalContents = dumpPart(bp);
} catch (Exception e) {
e.printStackTrace();
}
}
}
return finalContents.trim();
}
private String dumpPart(Part p) throws Exception {
InputStream is = p.getInputStream();
// If "is" is not already buffered, wrap a BufferedInputStream
// around it.
if (!(is instanceof BufferedInputStream)) {
is = new BufferedInputStream(is);
}
return getStringFromInputStream(is);
}
private String getStringFromInputStream(InputStream is) {
BufferedReader br = null;
StringBuilder sb = new StringBuilder();
String line;
try {
br = new BufferedReader(new InputStreamReader(is));
while ((line = br.readLine()) != null) {
sb.append(line);
sb.append("\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return sb.toString();
}
Hope this will help someone.
希望这会帮助某人。
回答by Shahbaz sultan
I had the same issues while parsing Message of javax mail. In my workaround i found a weird thing. Listing mail from POP3 was not giving me Mail body content. So used IMAP which worked for me. Now i'm able to parse Text/plainas well as Text/Htmland read the body. To parse the same i used following method.
我在解析 javax 邮件的消息时遇到了同样的问题。在我的解决方法中,我发现了一件奇怪的事情。列出来自 POP3 的邮件并没有给我邮件正文内容。所以使用了对我有用的 IMAP。现在我可以解析Text/plain以及Text/Html并阅读正文。为了解析相同的内容,我使用了以下方法。
public String printMessage(Message message) {
String myMail = "";
try {
// Get the header information
String from = ((InternetAddress) message.getFrom()[0])
.getPersonal();
if (from == null)
from = ((InternetAddress) message.getFrom()[0]).getAddress();
System.out.println("FROM: " + from);
String subject = message.getSubject();
System.out.println("SUBJECT: " + subject);
// -- Get the message part (i.e. the message itself) --
Part messagePart = message;
Object content = messagePart.getContent();
// -- or its first body part if it is a multipart message --
if (content instanceof Multipart) {
messagePart = ((Multipart) content).getBodyPart(0);
System.out.println("[ Multipart Message ]");
}
// -- Get the content type --
String contentType = messagePart.getContentType();
// -- If the content is plain text, we can print it --
System.out.println("CONTENT:" + contentType);
if (contentType.startsWith("TEXT/PLAIN")
|| contentType.startsWith("TEXT/HTML")) {
InputStream is = messagePart.getInputStream();
BufferedReader reader = new BufferedReader(
new InputStreamReader(is));
String thisLine = reader.readLine();
while (thisLine != null) {
System.out.println(thisLine);
myMail = myMail + thisLine;
thisLine = reader.readLine();
}
}
System.out.println("-----------------------------");
} catch (Exception ex) {
ex.printStackTrace();
}
return myMail;
}
Hope it helps someone.
希望它可以帮助某人。
回答by Femi
Not entirely sure, but what it sounds like is you want to convert a MimeMessage into a String. Strictly speaking, there is no "standard" translation for MimeMessage to String, but here is a chunk of code that I wrote a couple of years back that attempts to generate one such translation. Only tested on English messages, so i18n will have to be something you think about yourself.
不完全确定,但听起来您想将 MimeMessage 转换为字符串。严格来说,MimeMessage 到 String 没有“标准”翻译,但这里有一段我几年前写的代码,试图生成一个这样的翻译。仅对英文消息进行了测试,因此 i18n 必须是您对自己的看法。
Unfortunately SO's stupid filter seems to think that my code sample is an image and won't let me post it: take a look at the class at http://pastebin.com/pi9u5Egq: the code is doing a bunch of otherwise unnecessary things (it was spitting it out into HTML that was rendered using flying saucer), and also requires Jakarta Commons Lang, javamail and activation libraries, but it works for me. You would invoke it like this:
不幸的是,SO 的愚蠢过滤器似乎认为我的代码示例是一个图像,并且不会让我发布它:看看http://pastebin.com/pi9u5Egq上的类:代码正在做一堆其他不必要的事情(它把它吐到使用飞碟渲染的 HTML 中),并且还需要 Jakarta Commons Lang、javamail 和激活库,但它对我有用。你会像这样调用它:
fetchText(message, null, false, false);
To get a text string. Try that out for size.
获取文本字符串。试试这个尺寸。