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

标签 c# asp.net-mvc email msmq

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

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

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

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

你认为哪种方式最好?

最佳答案

使用 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 或纯文本)和原始格式的附件。 当进程运行发送时,从文件中组装消息比通过查询 blob/clob 更快。 由于他们在应用程序上使用文件系统,您可以添加服务器或组件等硬件,或者轻松增加系统的可用性。 也可以添加数据库,但它会花费您更多的数据库软件许可证。 我在发送电子邮件 x 次后添加了测试发送电子邮件,以确保它运行良好;此测试电子邮件发送到我自己或虚拟收件箱和一个应用程序,用于检查与发送和接收的电子邮件相同的测试电子邮件。如果相同,则发送待处理的电子邮件将再次继续

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

关于c# - 使用 C#/.NET 的电子邮件发送策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7695810/

相关文章:

c# - 无法反序列化 json 足球数据

c# - 如何提交包含带有输入元素的多页表格的表单

c# - 无法进入我的解决方案中的本地服务

c# - 在 MVC 中合并来自 2 个数据库的数据

ruby - 无法通过 SMTP 使 ActionMailer 与 MS Exchange 一起工作

iphone - 如何自定义 MFMailComposeViewController 以便我可以将 "to"字段设置为不可编辑?

c# - 无法从 dapr 获取 azure key Vault secret ,因为 daprClient.GetSecretAsync 函数返回错误

c# - 为什么这段代码返回不同的值? (C# 和 VB.NET)

javascript - JSON 响应 Long 被舍入或损坏

r - 安排邮件 R/Knitr 报告