处理跨多个应用程序的电子邮件分发的最佳方法是什么?
本文关键字:最佳 方法 是什么 电子邮件 应用程序 处理 | 更新日期: 2023-09-27 18:03:27
我在一个企业环境中有许多应用程序,它们都使用不同的方法发送电子邮件。有些直接通过交换服务器发送,有些在本地SMTP队列中排队,还有一些调用web服务,然后发送电子邮件。
我想确定保证邮件发送的最好方法。如果我们的Exchange服务器宕机,那么直接发送到它的应用程序就不能再发送电子邮件了,而且在宕机期间发送的任何电子邮件都不会到达任何地方。我还想实现一个通用的模板解决方案,所有的应用程序都可以共享。
对于这个问题是否有预先构建的解决方案,或者您对如何处理这个问题有什么见解?
我们通过创建一个发送所有电子邮件的web服务来解决这个问题。这个web服务使用
System.Net.Mail.SmtpDeliveryMethod.PickupDirectoryFromIis
设置,它将文件保存到磁盘上的一个位置,并尝试通过主SMTP服务器发送它们,如果服务器不可用,它们将保存在目录中,直到它可用为止。
保证交付,只要web服务启动。由于我们有冗余检查,这几乎从来都不是问题。如果是,我们将其作为代码错误处理。
edit - added
我忘了说XSS甚至在电子邮件中也是一个问题,所以一定要使用像Microsoft.Security.AntiXss库这样的东西,它包含像GetSafeHtmlFragment这样的函数,可以在将html输出到电子邮件之前剥离潜在的危险脚本。
http://msdn.microsoft.com/en-us/security/aa973814.aspx http://msdn.microsoft.com/en-us/library/aa973813.aspx我听到了关于邮戳的很好的反馈。也许这样的服务是一个解决方案,因为它有几个集成点。
http://postmarkapp.com我们使用了免费的HMailServer(在windows平台上)。将最大重试次数设置为太多&使用外部SMTP转发邮件。我们的应用程序在HMailServer上查询电子邮件,该服务器将其进一步转发。与最大重试配置为许多,如果在所有的主要SMTP服务器都关闭,我们可以确保电子邮件被传递-但没有保证,如果有巨大的停机时间与主要SMTP中继服务器
我通过将电子邮件排队发送到SQL server数据库来做到这一点。任何ACID兼容的数据库都可以工作,或者你可以使用MongoDB的"安全模式"插入,但如果你真的需要保证,那么使用SQL服务器或MySQL。这样,如果你的邮件进入数据库,它"保证"不会丢失,你的应用程序不必考虑它。你可以使用web服务,或者在类中创建一个带有静态公共方法的共享程序集,为你在数据库中删除你的电子邮件。
包括一个列的状态,如'new', 'delivered', '收件人邮箱暂时满',你可以用数值表示,并保留一个TimeToSend列,它开始作为电子邮件在数据库中排队的时间。
然后你有一个邮件应用程序,你可以每分钟运行一次作为windows计划任务。让它成为一个控制台应用程序。当它加载时,它会检查它的一个实例是否已经运行,如果有,它就退出。运行时:1. 尝试将每封邮件发送到邮件服务器。查询TimeToSend时间早于now的所有邮件。
2. 如果邮件发送到邮件服务器,将其标记为逻辑已删除。3.如果有邮件无法投递,将他们的TimeToSend列提前10分钟。
4. 从表中删除逻辑删除的记录。你可以在应用程序中完成,也可以通过sql作业完成。
如前所述,您可以利用通常可以POST JSON的web服务来使用HTTP请求。这里有一些选择:
- PostageApp(我们)
- SendGrid
- PostmarkApp 亚马逊SES
它们都有不同的功能集和产品,所以一定要给它们一个旋转,找出你更喜欢的。
(全面披露:我是PostageApp的产品经理)