环境:
- IIS 网络场
- 5 台服务器
- Windows Server 2008 R2
- IIS 7.5
- ASP.NET 3.5 和 4.0 Web 应用程序
我们的 Web 应用与许多应用一样,需要发送邮件。仅发送,不接收。
过去,我们在每个 Web 服务器上启用了 IIS 6 SMTP 服务,并使用 .NET SMTP 类将邮件文件放入拾取文件夹中。运行良好。
为了简化环境并在 Web 服务器上运行更少的服务,我正在考虑仅在一个实用程序 Windows 服务上运行 SMTP 服务,并使用文件共享将拾取目录公开给场中的其余 Web 服务器的可行性。ASP.NET Web 应用程序将简单地将其邮件文件放在共享拾取文件夹中,单个 SMTP 服务将处理所有 Web 服务器的传出邮件流。我并不担心数量或 SMTP 服务的跟进能力,这不是问题。
优点:
- 简化管理和配置
- 降低 Web 服务器的负载并减少攻击媒介
- 如果出现邮件问题,可进行单点故障排除
缺点:
- 单点故障
- 如果我需要重新启动实用程序箱,我将失去出站邮件功能。可以通过对 Web 服务器上的文件共享使用脱机文件夹缓存来缓解这种情况。尚未测试,但 Web 服务器可能在检测到与文件共享没有连接时将其文件放在本地,以便在重新启动时自动同步到 SMTP 服务器。
- 电子邮件文件名冲突 - 需要确保 ASP.NET 在写入 .eml 文件时使用在整个 Web 场中保证唯一的名称。SmtpClient 源代码表明使用 GUID 来命名文件,但 MS 可能会在将来的实施中更改这一点。
这能行吗?
编辑:更多地考虑我对脱机文件的想法,我不确定这是否是最好的方法。脱机文件需要计划任务来安排同步,每次运行时,我都会将所有其他 Web 服务器的邮件文件拉到其他服务器的本地缓存中。也许更好的想法是将文件堆积在本地文件夹中,然后其他一些作业(计划的 robocopy)会在启动时尝试将它们复制到远程文件共享。曾考虑过 DFSR,但同样,我会将所有邮件文件转移到所有 Web 服务器上,这很浪费。
答案1
更好的办法是通过 tcp/ip 使用 SMTP,即监听端口 25(或任何其他端口),然后使用 System.Net.Mail 的 MailMessage 和 SmtpClient。
然后,您可以在 SMTP 服务器前面放置一个负载平衡器,并让每个服务器连接到该负载平衡名称/ip。
答案2
我看不出你的观点。你试图通过引入更多复杂性和安全问题来简化你的设置。
SMTP 是解决您问题的方案。现在您只需寻找一个好的实现。SMTP 具有内置队列处理(无文件名冲突)、抗故障、由于多个 MX 而具有冗余意识,并且是一种古老的经过充分测试的协议。顺便说一下,它独立于操作系统。
您希望将其替换为单点故障、调度程序依赖、操作系统绑定、未记录且未经测试的重新发明轮子的新程序。此外,您还为所有人公开了一个投递箱,而不仅仅是这 5 台服务器。
使用简单的存储转发服务器(如电子邮件中继) 以及邮件转发到的中央 SMTP 服务器。然后,此 SMTP 服务器将用于最终交付。然后,您可以保护中央 SMTP 以仅接受来自这 5 个服务器的连接,并执行基于发件人的拒绝或任何您想要的过滤/阻止,以降低公众的潜在(垃圾邮件)风险。
该解决方案具有透明度(记录+监控)、简单性(一个流程)、一致性(标准互联网协议)和完整性(交付确认)等所有优点。无需自行更换解决方案。