IMAP服务器门面模式 - 如何创建一个?

11

我已经实现了一个自定义的邮件服务器和Web客户端。该服务器只是一个REST API(类似于Google的Gmail API),它使用第三方工具(SendGrid)来发送和接收电子邮件,并将电子邮件存储在数据库中。Web客户端只需与REST客户端通信以进行发送和接收。

这种方法的问题在于它没有实现IMAP,这使得标准客户端(Outlook、iPhone等)无法连接和使用我们的邮件API。这限制了客户仅能使用我们的客户端进行电子邮件。

我需要的是一种IMAP服务器“外观”,它将管理到客户端的连接并调用我的REST API来处理请求(获取邮件、发送邮件等)。

如何实现IMAP外观?也许有一种方法可以采取现有的邮件服务器并将其所有“事件”指向调用我的API?


是的,这是可能的。例如,Dovecot允许您插入存储模块。 - arnt
您有语言偏好吗? - vzwick
问题中提到了 .net,所以应该使用类似 C# 的语言……但是在 C# 中并没有太多 IMAP 服务器代码。客户端可以,当然可以,但是服务器端的实现远比客户端复杂,而且最大的问题在于如何提供 IMAP 服务…… - arnt
@vzwick,我更喜欢.NET,但现在任何编程语言都可以。 - richard
3个回答

4

简述:使用Perl编写网关,使用Net::IMAP::Server模块,重写Net::IMAP::Server::Mailbox并使用Perl REST客户端之一与服务器通信。

为了快速完成此任务并保持代码的合理安全性,您最好使用Perl。您需要两个Perl模块。第一个是Net::IMAP::Server这里是该模块的Github存储库。这是一个符合标准的RFC 3501服务器,旨在具有可配置的邮件存储。您将使用自己的代码覆盖默认的Net::IMAP::Server::Mailbox实现,以与您的自定义电子邮件后端进行通信。

对于第二个模块,选择您喜欢的Perl模块之一来与REST服务器通信。您的选择取决于您希望对REST消息的构建和传递拥有多少细粒度控制。

幸运的是,在这里你有很多选择。一种可能性是Eixo::REST,它有一个Github存储库在这里。Eixo::REST似乎很好地处理了异步与同步REST API调用,但它并不能提供对X509密钥管理的很多控制。根据你的API的谷歌程度,还有REST::Google模块。有趣的是,这个家族还有一个REST::Google::Apps::EmailSettings模块,专门用于设置Gmail特定的标签和语言等花哨功能。最后,REST::Consumer模块似乎将许多https特定的事情封装为Perl对象实例化的参数,例如超时和身份验证。

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

不要通过黑客方式攻击Dovecot或任何其他用C或C++编写的邮件服务器。如果你使用编译语言快速拼凑出一个邮件服务器,你的服务器迟早会遭受缓冲区溢出、栈破坏和其他网络攻击的痛苦。先确保安全运行,再进行优化。

很有道理。而且Perl似乎是处理邮件的理想语言,因为Perl在文本解析和管理方面非常出色。所以我需要一个Perl大师,因为我对Perl很陌生,也没有时间去做这个... - richard

2

这基本上是我的评论,但更详细地阐述了一些问题。

一些IMAP服务器,尤其是Dovecot,结构化使得文件访问在一个定义良好的接口中。 Dovecot并不是唯一的选择,但它是最流行的选择,其后端接口被认为是合适的,因此在没有具体问题的情况下,我会采用它。

已经存在非文件模块,例如imapc,证明可以完成此操作。当客户端打开由imapc支持的邮箱时,Dovecot解析IMAP命令,在imapc中调用消息访问函数,imapc发出新的IMAP命令,解析服务器响应,将C结构返回给Dovecot,Dovecot形成新的IMAP响应并将其返回给客户端。

我建议您获取dovecot源代码,查看src/lib-storage/inbox/index/imapc以及该目录中的其他后端,并实现一个作为客户端讲解您的REST API的后端。


1

既然您熟悉.NET,我建议您尝试修改以下两个IMAPv4服务器的实现:


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