在使用JavaMail实现imap协议收取各种邮箱服务器的邮件的时候,碰到了几个比较郁闷的问题

在使用JavaMail实现imap协议收取各种邮箱服务器的邮件的时候,碰到了几个比较郁闷的问题:


1、使用getMessageByUID方法无论如何也获取不到腾讯企业、个人QQ邮箱的邮件内容(message为null),
而网易、阿里企业邮箱等等的邮箱却能够正常获取到邮件。



在网上搜索了一天多,从以下的链接中找到原因: 

http://bbs.csdn.net/topics/390752838?page=1 

http://www.tk4479.net/shenshibaoma/article/details/77476977

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、阿里企业邮箱在移动邮件时,某些邮件已经从当前源文件夹擦除,
若是在接下的代码中还是执行把源文件夹下的邮件彻底删除的操作,便会报错



解决思路:
把源文件夹下的邮件彻底删除前先判断改文件是否已经擦除
				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就没问题了。



你可能感兴趣的:(J2EE,javamail)