2013-04-09 190 views
2

我有一个包含GUI的应用程序,它使用Javamail。当我打开这个Jframe我必须看到邮件发送到我的邮件jTextArea使用javamail从我的Gmail中读取所有新邮件

问题是,当我写我的代码它只显示最后发送的消息。

如何在收件箱中显示所有新消息?

这是我的代码:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 

Properties props = new Properties(); 

props.put("mail.pop3.host", "pop.gmail.com"); 

props.put("mail.pop3.user", "[email protected]"); 

props.put("mail.pop3.socketFactory", 995); 

props.put("mail.pop3.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 

props.put("mail.pop3.port", 995); 

Session session = Session.getDefaultInstance(props, new Authenticator() { 
    @Override 
    protected PasswordAuthentication getPasswordAuthentication() { 
     return new PasswordAuthentication("[email protected]", "mypassword"); 

    } 
}); 

try { 
    Store store = session.getStore("pop3"); 

    store.connect("pop.gmail.com", "[email protected]", "mypaswword"); 

    Folder fldr = store.getFolder("INBOX"); 

    fldr.open(Folder.READ_ONLY); 

    Message[] msg = fldr.getMessages(); 

    Address[] address; 


    for (int i = 0; i < msg.length; i++) { 

     jTextArea1.setText("SentDate : " + msg[i].getSentDate() + "\n" + "From : " + msg[i].getFrom()[0] + "\n" + "Subject : " + msg[i].getSubject() + "\n" + "Message : " + "\n" + msg[i].getContent().toString()); 

    } 

    fldr.close(true); 

    store.close(); 

} catch (Exception e) { 
    System.out.println(e); 
} 

回答

0

你反复设置jTextArea1为相同内容的文字在你的循环中的邮件这里:

for (int i = 0; i < msg.length; i++) { 

    jTextArea1.setText("SentDate : " + msg[i].getSentDate() + "\n" + "From : " + msg[i].getFrom()[0] + "\n" + "Subject : " + msg[i].getSubject() + "\n" + "Message : " + "\n" + msg[i].getContent().toString()); 

} 

你应该建立一个StringBuilder与所有的消息然后设置内容jTextArea1

final StringBuilder sb = new StringBuilder(); 
for (int i = 0; i < msg.length; i++) { 

    sb.append("SentDate : " + msg[i].getSentDate() + "\n" + "From : " + msg[i].getFrom()[0] + "\n" + "Subject : " + msg[i].getSubject() + "\n" + "Message : " + "\n" + msg[i].getContent().toString()); 

} 
jTextArea1.setText(sb.toString()); 

然后,您可以通过使用增强的for循环并使用StringBuilderappend方法使其更清晰易读。

final StringBuilder sb = new StringBuilder(); 
for (Message message : msg) { 

    sb.append("SentDate : "). 
      append(message.getSentDate()). 
      append("\n"). 
      append("From : "). 
      append(message.getFrom()[0]). 
      append("\n").append("Subject : "). 
      append(message.getSubject()). 
      append("\n"). 
      append("Message : "). 
      append("\n"). 
      append(message.getContent().toString()); 

} 
jTextArea1.setText(sb.toString()); 
+0

非常感谢你对你的反应, 所以用你的代码,它显示日期和邮件的主题,但只显示一行部份内容: javax.mail。 internet.MimeMultipart @ – wael 2013-04-09 16:26:27

+0

您正在'message.getContent'方法中调用'toString',但根据[Javadoc](http://docs.oracle.com/javaee/6/api/javax/mail/Part。 html#getContent())如果消息是多段,这不是'String'。阅读[this](http://stackoverflow.com/a/13013066/2071828)SO帖子,了解如何显示多部分消息。 – 2013-04-09 16:40:41

+0

好吧再次感谢:) – wael 2013-04-09 17:00:48

0
final StringBuilder sb = new StringBuilder(); 
for (Message message : msg) { 

    sb.append("SentDate : "). 
     append(message.getSentDate()). 
     append("\n"). 
     append("From : "). 
     append(message.getFrom()[0]). 
     append("\n").append("Subject : "). 
     append(message.getSubject()). 
     append("\n"). 
     append("Message : "). 
     append("\n"). 
     append(message.getContent().toString()); 

} 
jTextArea1.setText(sb.toString()); 
相关问题