2017-04-15 61 views
10

我已经实现了一个自定义的电子邮件服务器和Web客户端。服务器只是一个使用第三方(sendgrid)发送和接收的REST API(类似于google的gmail API)。电子邮件存储在数据库中。 Web客户端仅与REST客户端进行发送和接收。IMAP服务器外观 - 如何制作一个?

这种做法是在任何地方都不会实现IMAP,这使得它不可能对标准客户端(如Outlook,iphone等)来连接并使用我们的电子邮件API的问题。这限制了客户只使用我们的客户进行电子邮件。

我需要的是某种IMAP服务器“门面”,将管理到客户端的连接,并拨打电话到我的REST API的实际处理请求(获取电子邮件,发送电子邮件等)。

如何实现IMAP门面?有没有办法让现有的邮件服务器,并指出它所有的“事件”来打电话给我的API?

+0

是的,这是可能的。例如,Dovecot允许您插入存储模块。 – arnt

+0

你有语言偏好吗? – vzwick

+0

问题说.net,所以c#ish ...但在C#中没有太多的IMAP服务器代码。客户端,当然,但不是服务器,到目前为止,问题的最大部分是服务于IMAP ... – arnt

回答

2

(这基本上是我的再次发表评论,但阐述了相当多的。)

有些IMAP服务器,最值得注意的是达夫科特,被构造使得文件访问与定义的接口一个单独的模块。 Dovecot不是唯一的,但它是迄今为止最流行的,其后端接口已知是适当的,所以我会采取缺席的具体问题。

已经存在一些非文件模块,如imapc,这证明是可以做到的。当客户端打开由imapc支持的邮箱时,Dovecot解析IMAP命令,调用imapc中的消息访问功能,imapc发布新的IMAP命令,解析服务器响应,将C structs返回给Dovecot,Dovecot时尚新IMAP响应并将它们返回给客户端。

我建议你参考dovecot source,看看src/lib-storage/inbox/index/imapcthat directory的其他后端,并实现一个将您的REST API作为客户端的实现。

2

TL:博士;用Perl编写你的网关;使用Net :: IMAP :: Server;重写Net :: IMAP :: Server :: Mailbox;并使用许多Perl REST客户端之一与您的服务器交谈。

快速这样做,保持代码的安全合理数量的最好的办法,就是用Perl。你需要两个Perl模块。第一个是Net::IMAP::Serverhere是该模块的Github存储库。这是一个符合标准的RFC 3501服务器,专门用于配置邮件存储。您将使用自己的代码覆盖默认的Net :: IMAP :: Server :: Mailbox实现,该代码与您的自定义电子邮件后端进行通信。

对于你的第二个模块,选择自己喜欢的Perl模块(S)使用说话的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++编写的邮件服务器来实现此目的。如果你用一种编译语言快速破解邮件服务器,你的服务器迟早会遇到缓冲区溢出和堆栈粉碎以及互联网干扰邮件服务器的所有其他事情。先安全地工作,然后再进行优化。

+0

有道理。 Perl似乎是处理邮件的理想语言,因为Perl是文本解析和管理的冠军。所以我需要一个Perl专家,因为我非常熟悉Perl,并且没有时间去做这件事...... – richard

1

既然你熟悉.NET,我会建议任何黑客的IMAPv4服务器根据自己的喜好以下实现:

相关问题