我正在创建一个系统,允许成员通过电子邮件发送内容并立即自动解析。
我问了一个问题关于使用自定义 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 来与它们通信)添加额外的后端服务器,或者使用其他方法。