在许多应用程序中处理电子邮件分发的最佳方法是什么?

时间:2011-07-26 14:04:04

标签: c# email

我在企业环境中有很多应用程序,他们都使用不同的方式发送电子邮件。一些直接通过交换服务器发送,一些在SMTP队列中本地排队,另一些则调用然后发送电子邮件的Web服务。

我正在尝试确定保证发送电子邮件的最佳方式。如果我们的Exchange服务器出现故障,那么直接向其发送的应用程序将无法再发送电子邮件,在停机期间发送的任何电子邮件也无法随时随地发送。我还想实现一个所有应用程序都可以共享的通用模板解决方案。

是否有针对此问题的预先构建的解决方案,或者您是否了解如何处理此问题?

5 个答案:

答案 0 :(得分:2)

我们通过创建发送所有电子邮件的网络服务解决了这个问题。此Web服务使用

System.Net.Mail.SmtpDeliveryMethod.PickupDirectoryFromIis 

设置,基本上将文件保存到磁盘上的某个位置,尝试通过主SMTP服务器发送它们,如果服务器不可用,它们将位于目录中,直到它变为可用。

只要Web服务已启动,即可保证交付。由于我们已经进行了冗余检查,因此这几乎不是问题。如果是,我们将其视为代码中的错误并处理它。

编辑 - 添加

我忘了提到XSS即使在电子邮件中也是一个问题,所以一定要使用类似Microsoft.Security.AntiXss库的东西,其中包含GetSafeHtmlFragment等函数,以便在将html输出到电子邮件之前删除可能存在危险的脚本。

http://msdn.microsoft.com/en-us/security/aa973814.aspx

http://msdn.microsoft.com/en-us/library/aa973813.aspx

答案 1 :(得分:2)

我听说过有关邮戳的好评。也许像这样的服务可以解决,因为它有几个集成点。

http://postmarkapp.com

答案 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的产品经理。)