使用C#/ .NET发送电子邮件策略

时间:2011-10-08 09:03:54

标签: c# asp.net-mvc email msmq

我有一个Web应用程序,在执行特定操作后应从该应用程序发送电子邮件。我有一些替代方法来处理这个我不确定哪一个是最好的。

首先,当用户执行操作时,电子邮件将直接从ASP.NET应用程序发送。但我认为这不是一个真正可靠的系统,因为如果SMTP服务器出现故障或其他情况发生,用户只会得到反馈,说明他的行动无法完成。

作为替代方案,我正在考虑为我的想法实施排队系统:

  • 推送电子邮件发送到数据库表,服务应用程序定期检查新消息,然后发送。成功发送后,它标记了电子邮件任务已完成。
  • 使用MSMQ进行排队。在这种情况下,整个电子邮件可以作为消息传递;或者另一种方法是将带有附件的消息存储到db表中,并仅传递查询db表并发送消息所需的数据。在这种情况下,我不必处理MSMQ的大小限制(因为附件)。
  • 其他内容,例如用于通知服务的本地WCF服务

您认为哪种方式最好?

2 个答案:

答案 0 :(得分:5)

使用MSMQ不是一个好的解决方案,因为每个大小限制为4 MB。 http://blogs.msdn.com/b/johnbreakwell/archive/2007/08/22/why-is-there-a-4mb-limit-on-msmq-messages.aspx 更糟糕的情况是,如果MSMQ失败,就像它处理抛出错误或突然关闭一样,它将丢失许多消息。在我的情况下,当硬件和软件在几乎理想的情况下被安装时,这个解决方案很好。

使用数据库和窗口服务更好,因为它很简单,不需要太多努力。

我通常使用数据库和文件的组合。数据库包含用于保存标头信息的表和消息已被操作的标志(成功或错误或其他)和文件包含消息(html或plain)和原始格式的附件。 当运行进程发送时,从文件组装消息比从查询blob / clob更快。 由于他们在应用程序上使用文件系统,因此您可以添加服务器或组件等硬件,或者轻松添加系统的可用性。 数据库也可以添加,但在数据库软件中会花费更多的许可证。 我在x次发送电子邮件后添加测试发送电子邮件,以确保它运行良好;此测试电子邮件将发送到我自己或虚拟收件箱和应用程序,以检查测试电子邮件是否与发送和接收的电子邮件相同。如果相同,则发送待处理的电子邮件将再次继续

如果您使用的是MS Exchange,则可以通过利用其Web服务来排队发送来使用消息队列。这是一种简单的方法,但您需要许可证。 您可以在MSDN库上看到如何使用MS Exchange Web服务。

答案 1 :(得分:-1)

您可以使用像hmail这样的电子邮件服务器。为了将电子邮件推送到队列中,您可以将它们推送到邮件服务器。为此,您可以编写一个Windows窗体应用程序,该应用程序具有一个计时器对象,用于检查电子邮件表中具有状态0(未发送)的每一行。当线程将其发送到邮件服务器时,它将被标记为1(已发送)。

如果您使用数据库,也可以对电子邮件进行分类。不同的动作可以发送不同的电子邮件您也可以将此信息存储在数据库中,以便您的Windows窗体应用程序线程现在将发送哪个电子邮件模板。