我有一个Web应用程序,在执行特定操作后应从该应用程序发送电子邮件。我有一些替代方法来处理这个我不确定哪一个是最好的。
首先,当用户执行操作时,电子邮件将直接从ASP.NET应用程序发送。但我认为这不是一个真正可靠的系统,因为如果SMTP服务器出现故障或其他情况发生,用户只会得到反馈,说明他的行动无法完成。
作为替代方案,我正在考虑为我的想法实施排队系统:
您认为哪种方式最好?
答案 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窗体应用程序线程现在将发送哪个电子邮件模板。