【问题标题】:Reading all new messages from my gmail using javamail使用 javamail 从我的 gmail 中读取所有新消息
【发布时间】:2013-04-01 04:04:43
【问题描述】:

我有一个包含 GUI 的应用程序,它使用 Javamail。当我打开这个Jframe 时,我必须在jTextArea 上看到发送到我的邮件的消息。

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

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

这是我的代码:

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", "mymail@gmail.com");

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("mymail@gmail.com", "mypassword");

    }
});

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

    store.connect("pop.gmail.com", "mymail@gmail.com", "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);
}

【问题讨论】:

    标签: java email jframe jakarta-mail jtextarea


    【解决方案1】:

    您在此处的消息循环中反复将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());
    

    【讨论】:

    • 非常感谢您的回复,因此通过使用您的代码,它会显示消息的日期和主题,但仅显示该行的内容:javax.mail.internet.MimeMultipart@
    • 您在message.getContent 方法上调用toString,但根据Javadoc,如果消息是多部分的,则这不是String。阅读this SO 帖子,了解如何显示多部分消息。
    【解决方案2】:
    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());
    

    【讨论】:

      猜你喜欢
      • 2014-03-06
      • 1970-01-01
      • 2013-02-14
      • 2014-01-17
      • 2011-02-17
      • 2016-10-26
      • 1970-01-01
      • 1970-01-01
      • 2015-04-16
      相关资源
      最近更新 更多