用JavaMail获取Apache James Server 3中的邮件的UID取不到!但在Telnet下通过UIDL命令可以取到!

赵大仙 发布于 2015/08/18 21:13
阅读 250
收藏 0

我用JavaMail连接邮件服务器,用来获取用户收件箱里的所有邮件的UID列表,以前都是连接微软的Exchange服务器,没有问题。但是当改为连接自己搭建的Apache James Server 3邮件服务器后,却发现取不到UID了!以下是获取UID用的代码:

// 读取收件箱
POP3Folder folder = (POP3Folder) store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
FetchProfile profile = new FetchProfile();
profile.add(UIDFolder.FetchProfileItem.UID);

// 初始化返回结果
List<String> contentList = new ArrayList<String>();
// 获取收件箱信息
Message messages[] = folder.getMessages();
folder.fetch(messages, profile);
// 解析邮件信息
for (int i = 0, n = messages.length; i < n; i++) {
	MimeMessage message = (MimeMessage) messages[i];
	contentList.add(folder.getUID(message));
}

于是,我通过跟踪folder.fetch(messages, profile)方法及folder.getUID(message)的源码发现,POP3Folder类中有一处判断邮件服务器是否支持UIDL命令的语句,此处没有通过(在程序获取到的服务器支持能力列表里,没有UIDL这一项),如图:

而这个capabilities集合的数据来源,是通过调用Protocol类里的capa()方法获取的,如图:

它的原理应该就是调用邮件服务器的CAPA命令来实现的。

于是,我通过telnet连接上邮件服务器,然后执行CAPA命令,却发现它是支持UIDL的,如图:

然后我执行UIDL命令,也能正确返回邮件的UID列表,如图(实际就是有两封邮件):

那么,问题来了。。

为什么在Telnet下通过UIDL命令可以取到邮件的UID(说明James服务器是支持UIDL的),但是通过JavaMail的接口就取不到了呢??求高手指点迷津!不胜感激!!

加载中
返回顶部
顶部