IMAP 可扩展性

IMAP 可扩展性

我正在创建一个系统,允许成员通过电子邮件发送内容并立即自动解析。

我问了一个问题关于使用自定义 SMTP 服务器用于拦截邮件。这样做的原因之一是,如果需求增加,很容易扩展(只需设置一个新的邮件服务器)。建议之一是使用 IMAP IDLE 来监控单个邮箱。

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

答案1

解析邮件后您会清除邮件吗?如果是这样,在同一台服务器上拥有多个邮箱可能不会给您带来任何性能优势,因为邮件文件最终可能会存储在同一卷上。

您期望此系统处理多少数量的传入邮件?瓶颈几乎肯定是您的解析代码,而不是邮件服务器本身。没有理由说单个 IMAP 服务器不能每分钟处理数千封邮件。

注意:我们使用单个邮箱处理支持工单,该邮箱每分钟使用 POP3 进行轮询。每条消息都会解析帐号/支持令牌并转储到数据库中,每小时可以轻松处理数千封邮件。

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

答案2

据我所知,您即将编写一个 SMTP 侦听器,该侦听器将根据 RCPT TO: 命令的值接受或拒绝连接。接受连接后,它将解析 DATA 命令附带的数据,解析器的结果将向将使用数据的相关应用程序发出信号,对吗?

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

我不会编写 .NET,但我会这样做:我会让每个应用程序监听一个端口(在向 SMTP 侦听器注册时确定)。然后,当解析器决定要将数据转发到哪里时,处理程序子程序应连接到相关端口并将数据转发给应用程序。在您的情况下,这样的解决方案可能是不可接受的,尤其是如果需要进行重大重写时。

您可能会发现阅读“程序员的互联网邮件指南“即使它的代码示例是用 Visual Basic 编写的。

答案3

有一种称为 LMTP 的类似标准协议(请参阅 RFC 2033),它允许您实现一个邮件处理器,从普通 SMTP 前端接收邮件。前端将为您提供强化功能并进行队列管理。您的 LMTP 服务器将接收邮件并进行解析和通知。

此解决方案的优点是您可以在中间放置一个负载平衡器,并根据需要添加任意数量的运行 LMTP 侦听器的盒子。

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

答案4

您是否考虑过使用两个 SMTP 服务器?首先,将标准 smtpd(如 Postfix)暴露给互联网。将其配置为仅接受发送到正确地址的邮件等。然后让它将消息传递给您编写的 smtpd,该 smtpd 不会暴露给外部。您可以依靠 Postfix 实例进行队列管理、过滤等。由于您的守护进程也只会与受信任的 Postfix 实例通信,因此您不必担心其中的漏洞会被外部利用。(当然,无论如何您都应该编写偏执的代码。)

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

任何一种都应该很容易扩展。您可以使用多个 MX 记录添加额外的代理服务器,并使用另一组 MX 记录和 DNS 轮询(取决于您如何配置 Postfix 来与它们通信)添加额外的后端服务器,或者使用其他方法。

相关内容