【问题标题】:Java : Using Javamail to read emailJava : 使用 Javamail 阅读电子邮件
【发布时间】:2015-07-30 22:34:03
【问题描述】:

我一直在开发一个程序,假设使用 javamail 来阅读收件箱,如果电子邮件包含特定字符串,则应该打开它。

首先,这是我第一次尝试使用这个 javamail api - 我很确定我的属性都搞砸了 - 谁能给我正确设置 javamail 属性的提示?

其次,我似乎可以通过 API 进行连接,但如果我尝试搜索主题并且主题为空,我会收到空​​指针异常 - 如果我不尝试将主题与“Ordretest”匹配",我没有得到空指针 - 任何提示都会有很大帮助:)

package vildereMail;

import java.util.Properties;

import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.InternetAddress;
import javax.mail.search.FromTerm;
import javax.mail.search.SearchTerm;
import javax.mail.search.SubjectTerm;

public class vildereMail {


    public boolean match(Message message) {
        try {
            if (message.getSubject().contains("Ordretest")) {
                System.out.println("match found");
                return true;
            }
        } catch (MessagingException ex) {
            ex.printStackTrace();
        }
        return false;
    };
        public static void main(String[] args) {
            Properties props = System.getProperties();
        props.setProperty("mail.store.protocol", "imaps");
            props.put("mail.imap-mail.outlook.com.ssl.enable", "true");
            props.put("mail.pop3.host", "outlook.com");
            props.put("mail.pop3.port", "995");
            props.put("mail.pop3.starttls.enable", "true");
            try {
                Session session = Session.getInstance(props, null);
                Store store = session.getStore();
                store.connect("imap-mail.outlook.com", "myEmail@live.dk", "MyPassword");
                session.setDebug(true);
                Folder inbox = store.getFolder("INBOX");
                inbox.open(Folder.READ_ONLY);


                SearchTerm sender = new FromTerm(new InternetAddress("myMail@live.dk"));

                Message[] messages = inbox.search(sender);
                System.out.println(messages);

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

                    System.out.println(messages[i].getSubject());
                    if (messages[i].getSubject().equals(null)) {
                        System.out.println("null in subject");
                        break;
                    }
                    else if (messages[i].getSubject().contains("Ordretest")){
                        System.out.println("1 match found");
                    }
                    else {
                    System.out.println("no match");
                    }
                }
                System.out.println("no more messages");
                store.close();

            } catch (Exception mex) {
                mex.printStackTrace();
            }
        }
    }

【问题讨论】:

  • 你在哪一行得到 NPE?
  • nvm,空指针 :) 我在 if (message.getSubject().contains("Ordretest")) { System.out.println("match found");返回真; }
  • NPE = NullPointerException。你应该有一个堆栈跟踪,它应该引用你的类(包括行号)

标签: java jakarta-mail


【解决方案1】:

不知道你在哪一行得到 NPE(空指针异常)我猜它发生在这里:

if (messages[i].getSubject().equals(null)) 

如果 getSubject() 返回 null 并且您尝试执行 .equals() 它将抛出 NPE(因为您尝试调用方法)。 所以尝试将其重写为(假设您的消息对象不能为空):

if (messages[i].getSubject() == null) 

【讨论】:

  • 好的,这实际上对我有很大帮助 :) 会继续努力 :) 谢谢!
  • 有没有办法在已经打开的 Outlook 应用程序中检查电子邮件,而不使用 api 邮件?就像,在这种情况下,我的用户已经打开了他在后台运行的 Outlook 应用程序 - 有没有办法利用它?比如,当程序在后台启动并运行时,你能搜索他的收件箱吗?
【解决方案2】:

从哪里开始...

你找到JavaMail FAQ了吗?

您可以摆脱所有属性设置,因为它们什么都不做,因为您使用的是“imaps”协议,而不是“pop3”协议。

正如其他人所解释的,getSubject 方法可能会返回 null,因此您需要检查一下。

【讨论】:

    猜你喜欢
    • 2019-02-23
    • 2012-12-28
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 2022-08-23
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多