IMAP可扩展性

我创build了一个系统,允许成员通过电子邮件发送内容,并立即自动parsing。

我问了一个关于使用自定义SMTP服务器拦截邮件的问题。 其中一个原因是,如果需求增加,只需设置一个新的邮件服务器就可以轻松扩展。 其中一个build议是使用IMAP IDLE来监视单个邮箱。

我的问题是,这是多大的可扩展性? 如果我有一个带有通配符电子邮件别名的邮箱来捕获所有邮件,那么一次可以处理多less邮件而不会停顿? 如果我要为每个成员创build一个单独的邮箱的路线,那么监控每个成员最好的方法是什么?

一旦你parsing了,你会清理邮件吗? 如果是这样,在同一台服务器上有多个邮箱可能不会给你任何性能上的好处,因为邮件文件可能最终会被存储在同一卷上。

你希望这个系统能处理什么样的传入邮件? 瓶颈几乎肯定是你的parsing代码,而不是邮件服务器本身。 没有理由为什么一个IMAP服务器不应该每分钟处理数千条消息。

注意:我们使用POP3每分钟轮询一个邮箱处理支持票。 每条消息都是针对帐号/支持令牌进行parsing并转储到数据库中的,每小时可轻松处理数千条消息。

你最大的问题可能在于垃圾邮件防范/拒绝和邮件炸弹。

从我所了解的你要写一个SMTP侦听器,这取决于RCPT TO:命令的值将接受或拒绝连接。 在接受连接时,它将parsing伴随着DATA命令的数据,parsing器的结果将向将要使用数据的相关应用程序发出信号,对吗?

为什么你需要任何物理邮箱? 在每次连接时,你的监听器产生一个处理器子代,它parsing并通知注册的应用程序。 根据您的负载,您可能需要也可能不需要在本地维护一个队列(或者向发送者发送一个4xx错误,以便他们重新发送),或者您可能需要为每个已注册的应用程序维护一个队列。 假设每个应用程序有一个邮箱,那么您的想法就像是将每个邮箱用作每个应用程序的单独队列。 使用IMAP来确定邮箱的更改很简单,这意味着您必须编写另一个可以检查邮箱的侦听器(一个IMAP)。 恕我直言,这是不必要的矫枉过正。

我不写.NET,但这是我会做的:我会让每个应用程序监听端口(确定注册与SMTP侦听器)。 然后,当parsing器决定了数据要转发的地方时,处理器子应该连接到相关的端口并将数据转发给应用程序。 在你的情况下,这样的解决scheme可能是不可接受的,特别是如果需要重写的话。

即使其代码示例在Visual Basic中,您也可以阅读“ Internet邮件程序员指南 ” 的有用build议。

有一种称为LMTP的标准协议(参见RFC 2033),允许您实现从普通SMTP前端接收邮件的邮件处理器。 前端将为您提供强化,并将执行队列pipe理。 您的LMTP服务器将收到邮件并进行parsing和通知。

这个解决scheme的优点是你可以在两者之间插入负载平衡器,并根据需要添加尽可能多的boxen运行你的LMTP监听器。

我认为Sendmail和Postfix都支持LMTP。 你最喜欢的服务器可能。

你有没有考虑使用两台SMTP服务器? 首先,将一个标准的smtpd(如Postfix)暴露给互联网。 让它被configuration为只接受邮件到正确的地址,等等。然后让它传递消息给你写的smtpd,而不是暴露在外部。 您可以依靠Postfix实例来执行队列pipe理,过滤等等。由于守护进程也只会与可信的Postfix实例进行交互,因此您不必担心可能会被外部利用的错误。 (当然,你也应该写一些偏执的代码。)

另一个(可能更好)的select是将Postfix传递到您编写的本地进程,该进程使用比SMTP更简单的协议将消息传递到后端服务器。

任何一个都应该很容易扩展。 您可以使用多个MXlogging添加额外的代理服务器,以及额外的后端服务器(具体取决于您如何configurationPostfix与之通话),另一组MXlogging,DNS循环或其他内容。