Java : 使用 Javamail 阅读邮件
Java : Using Javamail to read email
我一直在开发一个程序,假设使用 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(空指针异常),我猜它发生在这里:
if (messages[i].getSubject().equals(null))
如果 getSubject() returns null 并且您尝试执行 .equals() 它将抛出 NPE(因为您尝试调用方法)。
所以尝试将其重写为(假设您的消息对象不能为空):
if (messages[i].getSubject() == null)
从哪里开始...
你找到JavaMail FAQ了吗?
您可以删除所有 属性 设置,因为它们什么都不做,因为您使用的是 "imaps" 协议,而不是 "pop3" 协议。
正如其他人所解释的,getSubject 方法可能 return 为空,因此您需要检查一下。
我一直在开发一个程序,假设使用 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(空指针异常),我猜它发生在这里:
if (messages[i].getSubject().equals(null))
如果 getSubject() returns null 并且您尝试执行 .equals() 它将抛出 NPE(因为您尝试调用方法)。 所以尝试将其重写为(假设您的消息对象不能为空):
if (messages[i].getSubject() == null)
从哪里开始...
你找到JavaMail FAQ了吗?
您可以删除所有 属性 设置,因为它们什么都不做,因为您使用的是 "imaps" 协议,而不是 "pop3" 协议。
正如其他人所解释的,getSubject 方法可能 return 为空,因此您需要检查一下。