All About JAVA javamail的pop3以及IMAP方式读取未读邮件等操作

时间:2022-07-02 15:18:06
/**
* 可以在props下设置认证信息,协议和端口信息,超时等信息,这样在store.connect的时候可以根
* 据props里是否设置了认证信息来选择不带参数的connect()或者如下有参数的connect(...)方法
* store.connect(user, password); store.connect(host, user, password);
*/

Properties props = System.getProperties();
props.setProperty("mail.imap.host", "mail.**.**.cn");
props.setProperty("mail.imap.port", "143"); 具体端口信息由邮件提供商确定
props.setProperty("mail.imap.connectiontimeout", "5000");
props.setProperty("mail.imap.timeout", "5000");

代码正文:

Properties props = System.getProperties();
Store store = null;
// 用来存放邮件中文件夹的,可以简单的使用javax.mail.Folder类型,
// 如果只是取未读邮件数的话Folder类型就够了
IMAPFolder inbox = null;
try {
Session session = Session.getDefaultInstance(props, null);
//如果使用pop3协议这里imap改成pop3,如果使用ssl连接这里应使用imaps
store = session.getStore("imap");
store.connect("mail.**.**.cn", "user","pwd");
System.out.println(store);
inbox = (IMAPFolder)store.getFolder("Inbox"); //取得收件箱对象
//如果需要在取得邮件数后将邮件置为已读则这里需要使用READ_WRITE,否则READ_ONLY就可以
inbox.open(Folder.READ_WRITE);
// Message messages[] = inbox.getMessages(); //获取所有邮件

//建立搜索条件FlagTerm,这里FlagTerm继承自SearchTerm,也就是说除了获取未读邮
//件的条件还有很多其他条件同样继承了SearchTerm的条件类,像根据发件人,主题搜索等,
// 还有复杂的逻辑搜索类似:
//
// SearchTerm orTerm = new OrTerm(
// new FromStringTerm(from),
// new SubjectTerm(subject)
// );
//
// 可以上网搜索SearchTerm获取更多

FlagTerm ft =
new FlagTerm(new Flags(Flags.Flag.SEEN), false); //false代表未读,true代表已读

/**
* Flag 类型列举如下
* Flags.Flag.ANSWERED 邮件回复标记,标识邮件是否已回复。
* Flags.Flag.DELETED 邮件删除标记,标识邮件是否需要删除。
* Flags.Flag.DRAFT 草稿邮件标记,标识邮件是否为草稿。
* Flags.Flag.FLAGGED 表示邮件是否为回收站中的邮件。
* Flags.Flag.RECENT 新邮件标记,表示邮件是否为新邮件。
* Flags.Flag.SEEN 邮件阅读标记,标识邮件是否已被阅读。
* Flags.Flag.USER 底层系统是否支持用户自定义标记,只读。
*/


Message messages[] = inbox.search(ft); //根据设置好的条件获取message

//遍历获取的Message数组获取信息
for (Message message : messages) {
//默认返回Message类型对象,因为我需要获取MessageID所以需要做强制
//转换为IMAPMessage类型
IMAPMessage imes = (IMAPMessage)message;

//我需要获取的邮件都是纯文本的,所以在这简单的做了判断,不是纯文本的直接跳过了。
//如果需要对不固定的邮件进行读取需要使用message.getContentType()获取邮件
//正文类型,然后根据类型进一步处理
//如果返回“text/plain”或”text/html”为纯文本,如果为”multipart/*”则正文里面可
//能还包含图片等信息
if (!(message.getContent() instanceof String))
continue;
Map<String, String> map = new HashMap<String, String>();
map.put("content", (String)message.getContent());
map.put("title", message.getSubject());
//IMAPMessage类型对象可以获取MessageID和UID,两者是有区别的MessageID是
//邮件的唯一标识,不只限于当前邮件系统,UID是当前邮件系统的唯一标识,
//另外获取MessageID需要读取邮件,UID不需要读取邮件所以速度更快。
map.put("messageId", imes.getMessageID());
mailInfoList.add(map); //保存我要获取的信息map列表
mesList.add(message); //保存我将要设置为已读的message列表
}
//将刚才我获取的邮件设置为已读
if (mesList.size() > 0) {
Message[] savedMailMessage = new Message[mesList.size()];
mesList.toArray(savedMailMessage);
inbox.setFlags(savedMailMessage, new Flags(Flags.Flag.SEEN),true);
}

} catch (NoSuchProviderException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (inbox != null) {
inbox.close(false);
inbox = null;
}
if (store != null) {
store.close();
store = null;
}
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}