我在企业环境中有很多应用程序,他们都使用不同的方式发送电子邮件。一些直接通过交换服务器发送,一些在SMTP队列中本地排队,另一些则调用然后发送电子邮件的Web服务。
我正在尝试确定保证发送电子邮件的最佳方式。如果我们的Exchange服务器出现故障,那么直接向其发送的应用程序将无法再发送电子邮件,在停机期间发送的任何电子邮件也无法随时随地发送。我还想实现一个所有应用程序都可以共享的通用模板解决方案。
是否有针对此问题的预先构建的解决方案,或者您是否了解如何处理此问题?
答案 0 :(得分:2)
我们通过创建发送所有电子邮件的网络服务解决了这个问题。此Web服务使用
System.Net.Mail.SmtpDeliveryMethod.PickupDirectoryFromIis
设置,基本上将文件保存到磁盘上的某个位置,尝试通过主SMTP服务器发送它们,如果服务器不可用,它们将位于目录中,直到它变为可用。
只要Web服务已启动,即可保证交付。由于我们已经进行了冗余检查,因此这几乎不是问题。如果是,我们将其视为代码中的错误并处理它。
编辑 - 添加
我忘了提到XSS即使在电子邮件中也是一个问题,所以一定要使用类似Microsoft.Security.AntiXss库的东西,其中包含GetSafeHtmlFragment等函数,以便在将html输出到电子邮件之前删除可能存在危险的脚本。
答案 1 :(得分:2)
我听说过有关邮戳的好评。也许像这样的服务可以解决,因为它有几个集成点。
答案 2 :(得分:0)
我们使用了免费软件的HMailServer(在Windows平台上)。将最大重试次数配置为太多&使用外部smtp来中继电子邮件。我们的应用程序询问HMailServer上的电子邮件,该服务器进一步传递它。如果所有主smtp服务器都关闭,最大重试次数被配置为很多,我们可以确保电子邮件已经发送 - 但是如果主smtp中继服务器的停机时间很长,则没有保证。
答案 3 :(得分:0)
我是通过将电子邮件排队到SQL服务器数据库来完成的。任何符合ACID标准的数据库都可以使用,或者您可以将MongoDB与“安全模式”插入一起使用,但如果确实需要保证,则使用SQL服务器或MySQL。这样,如果您的邮件进入数据库,“保证”不会丢失,您的应用程序不必考虑它。您可以使用Web服务,或者只是在类中使用静态公共方法创建共享程序集,以便将数据库中的电子邮件丢弃。
包含状态列,例如“新”,“已发送”,“收件人邮箱暂时已满”,您可以使用数字值表示该列,并保留TimeToSend列,该列从电子邮件排队的时间开始。数据库中。
然后你有一个邮件应用程序,你可以每分钟运行一次作为Windows计划任务。将其设为控制台应用。当它加载时,它会检查它的实例是否已经运行,如果有的话,它会退出。运行时:
1.尝试将每封邮件传递到邮件服务器。在数据库中查询TimeToSend比现在更旧的所有邮件。
2.如果邮件已发送到邮件服务器,请将其标记为逻辑删除。
3.如果无法发送任何邮件,请将TimeToSend列提前10分钟
4.从表中删除逻辑删除的记录。您可以在应用程序中执行此操作,也可以通过执行sql作业来完成此操作。
答案 4 :(得分:0)
如前所述,您可以使用通常可以POST JSON的Web服务来使用HTTP请求。以下是一系列选择:
他们都有不同的功能集和产品,所以一定要给他们一个旋转,找出你喜欢的。
(完全披露:我是PostageApp的产品经理。)