2017-02-16 405 views
1

我已经创建了一个基本的电子邮件客户端,它从服务器获取电子邮件并将其显示给用户。JavaMail - 如何阅读实际的邮件内容,而不是“javax.mail.internet.MimeMultipart”

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

// 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 <[email protected]> 
Text: [email protected] 
--------------------------------- 
Email Number 2 
Subject: Three tips to get the most out of Gmail 
From: Gmail Team <[email protected]> 
Text: [email protected] 
--------------------------------- 
Email Number 3 
Subject: Stay more organized with Gmail's inbox 
From: Gmail Team <[email protected]> 
Text: [email protected] 
--------------------------------- 
Email Number 4 
Subject: The best of Gmail, wherever you are 
From: Gmail Team <[email protected]> 
Text: [email protected] 

Process finished with exit code 0 

是否有任何方式显示实际的消息,而不是MIME multipart?例如,如果电子邮件读取“Hello World!”我希望它在相关电子邮件的“文本:”之后打印。

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

+1

您真的应该了解电子邮件的构建方式。现在很少有消息会包含纯文本而没有其他东西。它通常由几个部分组成,基于MIME标准,其中每个部分可以是文本,附件,HTML等。请参阅[我的答案](http://stackoverflow.com/a/30945872/4125191)这是关于撰写消息,但会帮助你理解结构。 – RealSkeptic

+0

[读取MIME多部分的正文部分]的可能副本(http://stackoverflow.com/questions/13474705/reading-body-part-of-a-mime-multipart) –

+0

您可能想阅读[文档getContent方法](https://docs.oracle.com/javaee/7/api/javax/mail/Part.html#getContent--)。 – VGR

回答

0

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

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

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

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; 
} 
0

感谢您的答案!

我找到了一个解决方案 - 我不会在这里发布确切的代码,但我会说我以后用什么来防止任何人遇到这个线程。

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

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

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