C# 使用.net或SQL表中的触发器发送电子邮件,哪个更好

C# 使用.net或SQL表中的触发器发送电子邮件,哪个更好,c#,.net,sql,sql-server,C#,.net,Sql,Sql Server,我们有这个模块,用户可以在其中注册,他们需要确认他们的电子邮件地址 目前我使用.NET发送电子邮件。因此,在添加记录后,我现在将调用我的电子邮件方法。但我注意到,有时电子邮件功能确实会收到超时错误,并且由于我捕获了所有异常,因此会向用户显示此错误 我想要的是在后台发送电子邮件。如果存在任何邮件连接超时,则电子邮件方法只需重试发送电子邮件一到两分钟。 我正在考虑使用SQL邮件来实现这一点。但我不确定这是否是最好的解决方案 而是管理.net应用程序中的超时。如果触发器中存在问题或超时,则可能无法提交

我们有这个模块,用户可以在其中注册,他们需要确认他们的电子邮件地址

目前我使用.NET发送电子邮件。因此,在添加记录后,我现在将调用我的电子邮件方法。但我注意到,有时电子邮件功能确实会收到超时错误,并且由于我捕获了所有异常,因此会向用户显示此错误

我想要的是在后台发送电子邮件。如果存在任何邮件连接超时,则电子邮件方法只需重试发送电子邮件一到两分钟。
我正在考虑使用SQL邮件来实现这一点。但我不确定这是否是最好的解决方案

而是管理.net应用程序中的超时。如果触发器中存在问题或超时,则可能无法提交数据。而是允许DB完成数据事务,并从.net应用程序检查状态


我不认为有一个明确的答案,但这将是我的首选。

而是在.net应用程序中管理超时。如果触发器中存在问题或超时,则可能无法提交数据。而是允许DB完成数据事务,并从.net应用程序检查状态


我不认为有一个明确的答案,但这将是我的偏好。

您有几个选择:

  • 用于在电子邮件排队和发送过程中执行繁重的工作。应用程序仍将负责构造消息并将其发送到数据库。通过单独的SMTP服务器进行中继(直接在SQL计算机上安装SMTP服务可能不是一个好主意)

  • 从web应用程序中使用,例如
    SmtpMail.SendAsync()
    。这将允许您在不妨碍用户(或与用户交互)的情况下处理错误,但这并不持久。如果web进程重新启动,操作将丢失

  • 使用Windows服务。这将是一个简单、独立的应用程序,它只是监视数据库中的新电子邮件任务和/或从web应用程序发送一条需要执行任务的消息

  • 选项2使用
    SendAsync()
    将是最快的实现方法。根据您的需要,这可能就足够了

    选项1不需要太多的努力。当您需要围绕收件人列表和电子邮件内容实施复杂的业务逻辑时,选项#3真的非常出色。也可以将选项1和选项3结合起来(参见评论中@RemusRusanu和我之间的对话)


    使用选项#1和#3,如果环境停机、服务重新启动或出现错误,您不会丢失任何数据或发送电子邮件失败。

    您有几个选项:

  • 用于在电子邮件排队和发送过程中执行繁重的工作。应用程序仍将负责构造消息并将其发送到数据库。通过单独的SMTP服务器进行中继(直接在SQL计算机上安装SMTP服务可能不是一个好主意)

  • 从web应用程序中使用,例如
    SmtpMail.SendAsync()
    。这将允许您在不妨碍用户(或与用户交互)的情况下处理错误,但这并不持久。如果web进程重新启动,操作将丢失

  • 使用Windows服务。这将是一个简单、独立的应用程序,它只是监视数据库中的新电子邮件任务和/或从web应用程序发送一条需要执行任务的消息

  • 选项2使用
    SendAsync()
    将是最快的实现方法。根据您的需要,这可能就足够了

    选项1不需要太多的努力。当您需要围绕收件人列表和电子邮件内容实施复杂的业务逻辑时,选项#3真的非常出色。也可以将选项1和选项3结合起来(参见评论中@RemusRusanu和我之间的对话)


    使用选项#1和#3,如果环境发生故障、服务重新启动或出现错误,您不会丢失任何数据或发送电子邮件失败。

    我个人会将其排除在数据库之外-这不是数据库问题。可能在一个新线程中启动它,该线程与用户线程分开运行。您是在显示标准的.net错误页还是自定义错误页?如果是这样的话,请检查一下:您认为发送电子邮件应该由.NET处理是正确的。嗯,我使用的是标准错误页面。就我个人而言,我会将其排除在数据库之外——这不是数据库问题。可能在一个新线程中启动它,该线程与用户线程分开运行。您是在显示标准的.net错误页还是自定义错误页?如果是这样的话,请检查一下:您认为发送电子邮件应该由.NET处理是正确的。我使用的是标准错误页面。这是否意味着我将有一个单独的表,用于记录我的服务将按计划扫描的电子邮件通知列表。:)如果你走那条路,是的。不需要太复杂,只需要收件人、内容和指示是否已发送的状态。SQL Server附带,为什么主张编写自己的?@RemusRusanu-问得好。我只使用数据库邮件向特定的、预先配置的电子邮件配置文件发送邮件。我不确定它在多大程度上支持拉入电子邮件地址的动态列表(例如在普通web应用程序中可能遇到的)。我也不确定输出电子邮件的可配置性,例如,您是否可以创建一个定制的电子邮件模板以匹配您的网站。最后,更复杂的服务可能包含业务逻辑。所有这些都可以通过数据库邮件实现——我很想看到一个答案来证明这一点。数据库邮件将处理电子邮件的异步传递(从DB接收电子邮件、连接到SMTP、发送)。它不用于撰写电子邮件(如模板)。composi的工作