29

我必须用 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));

但是我怎样才能得到一个文件夹列表作为文件夹实例而不是纯字符串输出呢?

4

4 回答 4

23

短篇小说:这取决于您的实际要求。

如果您的客户端主要专注于发送和阅读邮件,那么JavaMail API是事实上的标准高级 API,编写邮件、添加标题和/或附件会简单得多。

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

只是为了完成这个答案,你不应该忘记Apache Commons Email,根据项目的主页,它是建立在 Java Mail API 之上的,它旨在简化. 它更接近 JavaMail 而不是 Commons Net。

在不知道更多人想要做什么的情况下,很难给出更准确的答案......

于 2014-10-20T21:15:55.440 回答
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();
于 2014-10-20T19:04:03.037 回答
3

考虑查看从 Gmail 中检索未读电子邮件 - JavaMail API + IMAP

它是使用 JavaMail API 编码的,但在我看来,它的接口比 Apache 公共库要简单得多。

如果您真的想使用 Apache 公共库,请查看 javadocs 并查看您可以传递哪些其他参数.select()

于 2013-07-08T16:00:04.750 回答
3

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

  1. 雅虎 IMAP 客户端:支持使用 Java Futures 的异步 IO,但对于检查新邮件等简单用例来说,级别较低且可能过于复杂。
  2. Email4J:易于使用的高级 API,它在下面使用 Java Mail,但尚未在 Maven 中央,并且大型 PR 仍然打开(我正在使用 fork)

对于本地测试,我使用的是轻量级docker-imap-devel docker 镜像。

可以在IMAP 101: Manual IMAP Sessions中找到一个很好的介绍,查看 IMAP 协议的幕后(有助于调试) 。

更新:最后,使用好的旧javax.mail.imap API是最简单的,它Folder.open()开箱即用,应该早点检查一下……还有一个实验IdleManager可以用来观察邮箱中的新消息带有提供的ExecutorService.

于 2019-09-05T13:37:43.260 回答