Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的IMAP客户端:JavaMail API还是Apache Commons Net?_Java_Email_Imap_Jakarta Mail_Apache Commons - Fatal编程技术网

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

Java中的IMAP客户端:JavaMail API还是Apache Commons Net?,java,email,imap,jakarta-mail,apache-commons,Java,Email,Imap,Jakarta Mail,Apache Commons,我必须用Java实现一个IMAP客户机 使用ApacheCommonsNet库有哪些优点?它是否使实现更加健壮和灵活 我必须如何处理返回值,它总是生成字符串 例如: public static void main(String[] args) throws Exception { IMAPClient client = new IMAPClient(); client.connect(SERVER); client.login(USERNAME, PASSWORD);

我必须用Java实现一个IMAP客户机

使用ApacheCommonsNet库有哪些优点?它是否使实现更加健壮和灵活

我必须如何处理返回值,它总是生成字符串

例如:

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));
但是,我如何才能将文件夹列表作为文件夹实例而不是纯字符串输出

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

如果您真的想使用ApacheCommons库,请查看javadocs,并查看可以传递给
.select()
的其他参数

如何将文件夹列表作为文件夹实例而不是纯字符串输出

看起来ApacheImapClient是一个围绕IMAP协议的低级包装器,所以没有比字符串更奇特的了。对于更高级别的API,您可以查看库:

Session Session=Session.getDefaultInstance(System.getProperties(),null);
Store Store=session.getStore(“imaps”);
store.connect(this.host、this.userName、this.password);
//获取默认文件夹
Folder Folder=store.getDefaultFolder();
//按名称获取任何文件夹
文件夹[]folderList=文件夹.list();

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

如果您的客户端主要关注发送和阅读邮件JavaMail API实际上是一个标准的高级API,编写邮件、添加邮件头和/或附件会简单得多

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

为了完成这个答案,您不应该忘记ApacheCommons电子邮件,根据项目的设计,它是建立在Java邮件API之上的,其目的是简化Java邮件API。它更接近JavaMail,而不是Commons-Net


如果不知道自己想做什么,就很难给出更准确的答案……

我最近找到了一些现代的选择:

  • :支持使用Java Futures的异步IO,但对于检查新邮件等简单用例来说,它的级别较低,可能过于复杂
  • :易于使用的高级API,在下面使用Java Mail,但尚未在Maven central中使用,并且一个大型PR仍然处于打开状态(我正在使用fork)
  • 对于本地测试,我使用轻量级docker映像

    有关IMAP协议的详细介绍(有助于调试),请访问

    更新:最后,使用好的旧文件夹和
    文件夹是最容易的。open()
    是现成的,应该早检查一下…
    还有一个实验性的
    IdleManager
    ,可以通过提供的
    ExecutorService

    监视邮箱中的新邮件。真不敢相信这个问题还没有任何像样的答案。有一个很棒的Apache Commons邮件API,为什么不使用它呢?这个问题应该作为主题关闭,作为推荐请求。Apache Commons电子邮件,建立在JavaMail API之上,它旨在简化它,并且它实际上简化了任何东西吗?@user7610:老实说,我从未使用过它,只是引用了项目主页上写的内容。个人意见:Commons邮件“更简单”因为它的API试图像用户一样看待电子邮件,而JavaMail API公开了故事的MIME方面。从技术上讲,Javamail是一种自然的API。所以在Javamail中“添加附件”意味着从单部分Mime转换为多部分Mime,处理每个部分的头,Q编码这个或那个,以及所有这些。Commons Mail将有一个
    addAttachment
    方法来处理文件名、编码。。。但是当涉及到高级配置时,比如说启用IMAP/SSL和SMTP身份验证,这两种配置都是同等的。在执行方面,两者都有利弊。