Java 中的 IMAP 客户端:JavaMail API 还是 Apache Commons Net?
Posted
技术标签:
【中文标题】Java 中的 IMAP 客户端:JavaMail API 还是 Apache Commons Net?【英文标题】:IMAP client in Java: JavaMail API or Apache Commons Net? 【发布时间】:2013-04-18 23:43:19 【问题描述】:我必须用 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));
但是我怎样才能将文件夹列表作为文件夹实例而不是纯字符串输出呢?
【问题讨论】:
不敢相信这个问题没有任何像样的答案。 有一个很棒的 Apache Commons Mail API,为什么不使用它呢? 这个问题应该作为题外话结束,是一个推荐请求。 【参考方案1】:我最近检查了一些现代替代品:
-
Yahoo IMAP client:支持使用 Java Futures 的异步 IO,但级别较低,对于检查新邮件等简单用例来说可能过于复杂。
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
监视邮箱中的新消息。
【讨论】:
【参考方案2】:简短的故事:这取决于您的实际要求。
如果您的客户端主要专注于发送和阅读邮件,JavaMail API 是事实上的标准高级 API,它会更简单撰写邮件,添加标题和/或附件。
另一方面,如果您打算提供 IMAP 协议的所有可能性,较低级别的 Apache Commons Net 库将允许更详细的操作,在简单操作的更多样板代码的成本。
只是为了完成这个答案,你不应该忘记 Apache Commons 电子邮件,根据项目的 home page,它是构建在 Java Mail API 之上的,它的目标是简化。它更接近 JavaMail 而不是 Commons Net。
如果不知道更多人想做什么,很难给出更准确的答案......
【讨论】:
Apache Commons Email,建立在 JavaMail API 之上,旨在简化 它真的能简化任何事情吗? @user7610 : 老实说,我从未使用过它,只引用了项目主页上写的内容。 个人意见:Commons 邮件“更简单”,因为它的 API 尝试将电子邮件视为用户,而 JavaMail API 暴露了故事的 MIME 方面。从技术上讲,Javamail 是一种天然的 API。因此,Javamail 中的“添加附件”意味着从 SinglePart 转换为 Multipart Mime,处理每个部分的标题,Q-Encoding 这个或那个,等等。 Commons Mail 将有一个addAttachment
方法来完成所有这些工作,处理文件名、编码......但是当涉及到高级配置时,比如启用 IMAP/SSL 和 SMTP 身份验证,两者都是平等的。跨度>
我已经在一个系统中实现了它们。在执行方面,两者各有利弊。 github.com/r0hi7/Trashemail【参考方案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();
【讨论】:
【参考方案4】:考虑查看Retrieve UnRead Emails from Gmail - JavaMail API + IMAP
它是使用 JavaMail API 编码的,但在我看来,它的接口比 Apache 公共库要简单得多。
如果您真的想使用 Apache 公共库,请查看 javadocs 并了解您可以将哪些其他参数传递给 .select()
。
【讨论】:
以上是关于Java 中的 IMAP 客户端:JavaMail API 还是 Apache Commons Net?的主要内容,如果未能解决你的问题,请参考以下文章
JavaMail IMAP 消息内容 SSL/NON SSL
Java Mail:如何在没有全局系统属性的情况下使用 SOCKS 进行 IMAP 处理?