Java中的IMAP客户端:JavaMail API或Apache Commons Net?

30

我需要用Java实现一个IMAP客户端。

使用Apache Commons Net库有哪些优点?它会使实现更加健壮和灵活吗?

我该如何处理返回值,因为它总是生成字符串?

例如:

public static void main(String[] args) throws Exception {
    IMAPClient client = new IMAPClient();
    client.connect(SERVER);
    client.login(USERNAME, PASSWORD);
    client.select("INBOX");
    client.fetch("1", "body[header]");
}

我们可以通过以下方式将输出定向到字符串:

client.addProtocolCommandListener(new PrintCommandListener(System.out, true));

但是我如何获取文件夹实例的列表,而不是纯字符串输出?


1
真不敢相信这个问题还没有得到任何像样的答案。 - JohnMerlino
有一个很棒的Apache Commons Mail API,为什么不使用它呢? - msrd0
2
这个问题应该被关闭,因为它是一个寻求推荐的离题问题。 - user207421
4个回答

23

短故事:这取决于您的实际需求。

如果您的客户主要关注发送和阅读邮件,那么JavaMail API是一种事实上的标准高级API,它将更简单地组合邮件、添加标题和/或附件。

另一方面,如果您打算提供IMAP协议的所有可能性,则较低级别的Apache Commons Net库将允许更详细的操作,但对于简单操作需要更多的样板代码。

为了完善这个答案,您不应忘记Apache Commons Email,根据该项目的home page,它建立在Java Mail API之上,旨在简化它。它比Commons Net更接近JavaMail。

如果不知道更多想要做什么的情况下,很难给出更精确的答案...


Apache Commons Email是建立在JavaMail API之上的,旨在简化电子邮件处理。它是否真正简化了任何事情呢? - user7610
@user7610:说实话,我从来没有使用过它,只是引用了项目主页上的内容。 - Serge Ballesta
6
个人观点:Commons Mail在API设计上更“简单”,因为它尝试像用户一样思考电子邮件,而JavaMail API则暴露了MIME方面的细节。 技术上来说,Javamail是一种自然的API。因此,在Javamail中“添加附件”意味着从SinglePart转换为Multipart Mime,并处理每个部分的头信息,Q-Encoding等等。而Commons Mail将有一个addAttachment方法,会处理所有这些问题,包括文件名和编码方式等等。但是,当涉及到高级配置时,比如启用IMAP / SSL和SMTP身份验证,两者都同样重要。 - GPI
我已经在一个系统中实现了它们两个。就实现而言,它们都有优缺点。https://github.com/r0hi7/Trashemail - Rohit Sehgal

3
我该如何获取文件夹实例而非纯字符串输出的文件夹列表?
看起来Apache IMAPClient是IMAP协议的低级封装器,因此提供的只有字符串而已。如果需要更高级的API,可以考虑使用JavaMail库:
Session session = Session.getDefaultInstance(System.getProperties(),null);
Store store = session.getStore("imaps");
store.connect(this.host, this.userName, this.password);

// Get default folder
Folder folder = store.getDefaultFolder();

// Get any folder by name
Folder[] folderList = folder.list();

3

我最近查看了一些现代的替代品:

  1. Yahoo IMAP客户端:使用Java Futures支持异步IO,但对于简单的用例(如检查新邮件)来说可能过于低级和复杂。
  2. Email4J:易于使用的高级API,使用Java Mail在底层,但目前还未在Maven中心发布,并且仍有一个大型PR保持开放状态(我正在使用分叉版本)。

对于本地测试,我正在使用轻量级的docker-imap-devel Docker映像。

有关IMAP协议背后的介绍(有助于调试),可以在IMAP 101: Manual IMAP Sessions找到。

更新:最后,使用老牌的javax.mail.imap APIFolder.open()是最简单的方法,它可以直接使用,应该更早地检查这个……还有一个实验性的IdleManager,可以用来使用提供的ExecutorService观察邮箱中的新邮件。


3
请参考使用JavaMail API + IMAP从Gmail中检索未读电子邮件。虽然这是使用JavaMail API编写的,但在我看来,与Apache commons库相比,其接口要简单得多。
如果你真的想使用Apache commons库,请查看javadocs并查看可以传递给.select()的其他参数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接