java读邮件_javaMail正确读取邮箱内容的⽅式
javaMail收邮件主要有两种协议,⼀种是pop3,⼀种是imap。这两种协议都可以⽤来收邮件,但是在其中的处理上是有区别的。pop3是不⽀持判断邮件是否为已读的,也就是说你不能直接从收件箱⾥⾯取到未读邮件,这需要⾃⼰进⾏判断,然⽽imap就提供了这样的功能,使⽤imap时可以很轻松的判断该邮件是否为已读或未读或其他。
此外收件箱中的每⼀封邮件都对应着⼀个MessageNumber,所以可以通过⼀个MessageNumber拿到对应的那封邮件。如:Message message = Message(messageNumber);这样定时任务每次读邮箱邮件不⽤全量读了。
⼀、imap协议模式下读取
public static void readMail() {
String protocol = "imap";
Properties props = new Properties();
props.setProperty("ansport.protocol", protocol); // 使⽤的协议(JavaMail规范要求)
props.setProperty("mail.smtp.host", host); // 发件⼈的邮箱的 SMTP服务器地址
// 获取连接
Session session = Instance(props);
session.setDebug(false);
// 获取Store对象
Store store = Store(protocol);
IMAPFolder inbox = (Folder("INBOX");
//如果需要在取得邮件数后将邮件置为已读则这⾥需要使⽤READ_WRITE,否则READ_ONLY就可以
inbox.open(Folder.READ_WRITE);
// 全部邮件数
int messageCount = MessageCount();
System.out.println(messageCount);
//UnreadMessageCount() 未读取邮件总数
Message[] messages = MessageCount()-
List mesList=new ArrayList<>();
session如何设置和读取for (int i = 0; i < messages.length; i++) {
Message message = messages[i];
System.out.Subject());
//保存我将要设置为已读的message列表
mesList.add(message);
/
/解析邮件内容(⽹上很多我就不⼀⼀贴代码了)
.......
}
//将刚才我获取的邮件设置为已读
if (mesList.size() > 0) {
Message[] savedMailMessage = new Message[mesList.size()];
inbox.setFlags(savedMailMessage, new Flags(Flags.Flag.SEEN),true);
}
folder.close(true);
store.close();
}
⼆、pop3协议模式下读取
由于pop3是不⽀持判断邮件是否为已读的,不能直接从收件箱⾥⾯取到未读邮件所以⽆法获取未读邮箱数量,但是⽀持Messages(start,end)⽅式获取邮件区间,因此我采⽤redis存储已读邮件位置和每批次读取邮件数量来实现!
public Integer readMail(Integer readNum,Integer size) {
String protocol = "pop3";
Properties props = new Properties();
props.setProperty("ansport.protocol", protocol);
props.setProperty("mail.smtp.host", host);
// 获取连接
Session session = Instance(props);
session.setDebug(false);
// 获取Store对象
Store store = Store(protocol);
Folder folder = Folder("INBOX");
folder.open(Folder.READ_WRITE);
int MessageCount();
log.info("定时器读取邮件总数: {}", mailTotalNum);
Integer endNum;
if(readNum<=mailTotalNum) {
//我在读取redis中的readNum+1了所以这⾥要-1
endNum = readNum + size - 1 > mailTotalNum ? mailTotalNum : readNum + size - 1;
log.info("读取邮件区间:{}-{}", readNum, endNum);
Message[] messages = Messages(readNum, endNum);
//解析邮件内容(⽹上很多我就不⼀⼀贴代码了)
...........
}else {
endNum=readNum-1;
}
folder.close(false);
store.close();
//返回本次读取位置 redis 存储当前读取到多少条
return endNum;
}
三、如何判断发送失败的邮件
由于查询了好久没有⽅法可以直接判断邮件发送状态所以我只能⽤我所遇到的退信格式来判断了,如下图(不同收件邮箱退信格式不同,渣浪的邮箱投递不成功没有退信)
根据上图可以发现退信的邮件主题和⼀般邮件不⼀样所以我采⽤如下代码判断(很挫)
String subject = getSubject(msg);
if (subject.startsWith("未送达")|| subject.startsWith("系统退 信")) {
}
到发送失败的邮箱然后再提取邮件内容中的收件邮箱、发送时间等去更新数据库中邮件的发送状态。
到此成功获取邮件发送后状态了!
Contact
作者:⼩罗
Email:aichiyudemao_lk@126
版权归作者所有,转载请注明出处
Wechat:扫⼀扫关注,⼩罗技术笔记,专注于开发技术的研究与知识分享,第⼀时间送达实⽤⼲货⽂章。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。