版权声明:读书人不经过主人的批准就胡乱借鉴也是偷哦! https://blog.csdn.net/baidu_33320352/article/details/77968726
在使用JavaMail实现imap协议收取各种邮箱服务器的邮件的时候,碰到了几个比较郁闷的问题:
1、使用getMessageByUID方法无论如何也获取不到腾讯企业、个人QQ邮箱的邮件内容(message为null),
而网易、阿里企业邮箱等等的邮箱却能够正常获取到邮件。
在网上搜索了一天多,从以下的链接中找到原因:
http://blog.csdn.net/guanchuanjie/article/details/53817512
在解析腾讯邮箱的时候,要解析的字段是:* 13536 FETCH (UID 13799 ),uid的后面多加了一个空格,
而javamail需要的格式是* 13536 FETCH (UID 13799)。
从以下的链接中找到解决思路:
http://blog.csdn.net/shenshibaoma/article/details/69267295
只是更新Javamail的jar包到最新版本,我更新到1.6.0,原版本是1.40ea;或者自己手动去更改源文件
2、阿里企业邮箱在移动邮件时,某些邮件已经从当前源文件夹擦除,
若是在接下的代码中还是执行把源文件夹下的邮件彻底删除的操作,便会报错
解决思路:
把源文件夹下的邮件彻底删除前先判断改文件是否已经擦除
3、阿里企业邮箱在进行邮件批量移动、删除、彻底删除操作后重新加载当前文件夹下的邮件的时候报错:
javax.mail.MessagingException: Failed to load IMAP envelope
原因是操作后的文件已经不存在了,但客户端重新获取邮件时还把已经进行操作的邮件获取到,
这时候的message对象是不可预获取的,所以在获取对应不存在的文件是就会报错。
解决思路:
获取某个文件夹邮件时直接用try catch 语句处理不存在的邮件
4、搜狐邮箱在批量彻底删除邮件时,关闭folder资源时报错空指针错误
解决思路:
1、使用getMessageByUID方法无论如何也获取不到腾讯企业、个人QQ邮箱的邮件内容(message为null),
而网易、阿里企业邮箱等等的邮箱却能够正常获取到邮件。
在网上搜索了一天多,从以下的链接中找到原因:
http://bbs.csdn.net/topics/390752838?page=1
http://www.tk4479.net/shenshibaoma/article/details/77476977
在解析腾讯邮箱的时候,要解析的字段是:* 13536 FETCH (UID 13799 ),uid的后面多加了一个空格,
而javamail需要的格式是* 13536 FETCH (UID 13799)。
从以下的链接中找到解决思路:
http://blog.csdn.net/shenshibaoma/article/details/69267295
只是更新Javamail的jar包到最新版本,我更新到1.6.0,原版本是1.40ea;或者自己手动去更改源文件
2、阿里企业邮箱在移动邮件时,某些邮件已经从当前源文件夹擦除,
若是在接下的代码中还是执行把源文件夹下的邮件彻底删除的操作,便会报错
解决思路:
把源文件夹下的邮件彻底删除前先判断改文件是否已经擦除
for (Message message : messages) {
// 未擦除邮件
if (message !=null && !message.isExpunged()) {
message.setFlag(Flags.Flag.DELETED, true);
}
}
3、阿里企业邮箱在进行邮件批量移动、删除、彻底删除操作后重新加载当前文件夹下的邮件的时候报错:
javax.mail.MessagingException: Failed to load IMAP envelope
原因是操作后的文件已经不存在了,但客户端重新获取邮件时还把已经进行操作的邮件获取到,
这时候的message对象是不可预获取的,所以在获取对应不存在的文件是就会报错。
解决思路:
获取某个文件夹邮件时直接用try catch 语句处理不存在的邮件
for (int i = 0, length = messages.length; i < length; i++) {
try {
// MimeMessage msg = (MimeMessage) message;
// 千万不要用mimeMessage.getMessageID();这个方法,这个方法会去下载邮件头,是一个很耗时的过程
// ,而且还不是唯一的
// msgId = msg.getMessageID();
// 这样取的UID是不需要下载每一封邮件的这样速度很高,即使是几千封邮件也很快完成,不同文件夹下的id可以相同
// imapFolder = (IMAPFolder) folder;
// mailUid = imapFolder.getUID(message);
uid = Long.toString(((IMAPFolder) folder)
.getUID(messages[i]));
// 获得邮件主题
subject = (messages[i].getSubject() == null ? subject
: messages[i].getSubject());
// 发件人信息
Address[] froms = messages[i].getFrom();
if (froms != null) {
addr = (InternetAddress) froms[0];
fromUser = addr.getPersonal();
fromUserName = addr.getAddress();
}
mailInfo = new MailInfo();
mailInfo.setMailUid(uid);
mailInfo.setFromUser(fromUser);
mailInfo.setFromUserName(fromUserName);
mailInfo.setSubject(subject);
mailInfo.setSentDate(messages[i].getSentDate());
// 已读/未读
if (messages[i].isSet(Flags.Flag.SEEN)) {
mailInfo.setSeen(1);
} else {
mailInfo.setSeen(0);
}
mailInfos.add(mailInfo);
} catch (Exception e) {
System.out.println("第" + (i + 1) + "封邮件获取异常,异常信息:"
+ e.getMessage());
}
}
4、搜狐邮箱在批量彻底删除邮件时,关闭folder资源时报错空指针错误
解决思路:
未知原因,更新到1.6.0版本的Javamail就没问题了。