IMAP 服务器外观 - 如何制作?

Posted

技术标签:

【中文标题】IMAP 服务器外观 - 如何制作?【英文标题】:IMAP Server Facade - how to make one? 【发布时间】:2017-09-11 20:43:45 【问题描述】:

我已经实现了一个自定义电子邮件服务器和 Web 客户端。服务器只是一个 REST API(类似于 google 的 gmail API),它使用第 3 方(sendgrid)进行发送和接收。电子邮件存储在数据库中。 Web 客户端只是与 REST 客户端进行通信以进行发送和接收。

这种方法的问题是它没有在任何地方实现 IMAP,这使得标准客户端(outlook、iphone 等)无法连接和使用我们的电子邮件 API。这限制了客户只能使用我们的客户端发送电子邮件。

我需要某种 IMAP 服务器“门面”,它将管理与客户端的连接并调用我的 REST API 以实际处理请求(获取电子邮件、发送电子邮件等)。

如何实现 IMAP 外观?有没有一种方法可以获取现有的 MailServer 并将其消化并将其所有“事件”指向我的 API 调用?

【问题讨论】:

是的,这是可能的。例如,Dovecot 可让您插入存储模块。 您有语言偏好吗? 问题是 .net,所以 c#ish... 但是 C# 中没有很多 IMAP 服务器代码。客户端,是的,当然,但不是服务器,到目前为止,问题的最大部分是为 IMAP 提供服务...... @vzwick,我更喜欢 .net,但此时任何语言都可以。 【参考方案1】:

tl:博士;用 Perl 编写你的网关;使用 Net::IMAP::Server;覆盖 Net::IMAP::Server::Mailbox;并使用众多 Perl REST 客户端之一与您的服务器通信。

在保持合理数量的代码安全性的同时快速执行此操作的最佳选择是使用 Perl。您将需要两个 Perl 模块。第一个是Net::IMAP::Server,here 是该模块的 Github 存储库。这是一个符合标准的 RFC 3501 服务器,专门设计用于具有可配置的邮件存储。您将使用您自己的代码覆盖默认的 Net::IMAP::Server::Mailbox 实现,该代码与您的自定义电子邮件后端对话。

对于您的第二个模块,请选择您最喜欢的 Perl 模块以用于与您的 REST 服务器对话。您的选择取决于您希望对 REST 消息的构建和传递进行多少细粒度的控制。

幸运的是,您有很多选择。一种可能是Eixo::REST,它有一个Github 存储库here。 Eixo::REST 似乎可以很好地处理异步与同步 REST API 调用,但它并没有提供对 X509 密钥管理的大量控制。根据您的 API 的 googley 程度,还有 REST::Google 模块。有趣的是,这个系列还有一个 REST::Google::Apps::EmailSettings 模块,专门用于设置 Gmail 特定的时髦,如标签和语言。最后,REST::Consumer 模块似乎封装了很多 https 特有的东西,比如超时和身份验证作为 Perl 对象实例化的参数。

如果您使用这些现有的框架,那么您应该已经完成​​了大约 90% 的必要代码。

不要通过入侵 Dovecot 或任何其他用 C 或 C++ 编写的邮件服务器来做到这一点。如果您使用编译语言快速组合一个邮件服务器,您的服务器迟早会体验到缓冲区溢出和堆栈粉碎以及互联网对邮件服务器所做的所有其他事情的所有乐趣。先让它安全运行,然后再优化。

【讨论】:

有道理。 Perl 似乎是处理邮件的理想语言,因为 Perl 是文本解析和管理方面的冠军。所以我需要一个 Perl 大师,因为我是 Perl 菜鸟,没有时间做这个......【参考方案2】:

(这基本上又是我的评论,但详细说明了很多。)

某些 IMAP 服务器(尤其是 Dovecot)的结构使得文件访问位于具有定义接口的单独模块中。 Dovecot 不是唯一的,但它是迄今为止最受欢迎的,而且它的后端接口被认为是合适的,所以我认为没有具体问题。

已经存在imapc等非文件模块,证明是可以做到的。当客户端打开一个由 imapc 支持的邮箱时,Dovecot 解析 IMAP 命令,调用 imapc 中的消息访问函数,imapc 发出新的 IMAP 命令,解析服务器响应,将 C 结构返回给 Dovecot,Dovecot 形成新的 IMAP 响应并将它们返回给客户端.

我建议您使用dovecot source,查看src/lib-storage/inbox/index/imapc 和that directory 中的其他后端,并实现一个将您的REST API 用作客户端的后端。

【讨论】:

【参考方案3】:

由于您熟悉 .NET,因此我建议您根据自己的喜好破解以下 IMAPv4 服务器的实现:

Lumisoft Mail Server - 确实是一个非常古老的项目(让我们称之为“成熟”吧?)。不要被这个已有十年历史的网站和缺少 github 链接太关闭 - 源在“其他下载”下提供。 McNNTP - 也是一个较旧的项目,主要关注 NNTP(顾名思义),但在 IMAP 组件方面非常接近您想要实现的目标。 Take a look, you'll probably find this a good starting point.

【讨论】:

以上是关于IMAP 服务器外观 - 如何制作?的主要内容,如果未能解决你的问题,请参考以下文章

电子邮件如何从 SMTP 传输到 IMAP?

如何通过 OpenSSL 在 Shell 中与 IMAP 服务器通信

如何在 Gnus 中自动订阅新的 IMAP 文件夹?

如何通过OpenSSL与Shell中的IMAP服务器通信

如何配置 Logstash IMAP 插件以从 SMTP 服务器获取电子邮件

如何在 php.ini 中启用 imap