我们有这个模块,用户可以在其中注册,他们需要确认他们的电子邮件地址。
目前我使用 .NET 发送电子邮件。因此,添加记录后,我现在将调用我的电子邮件方法。但我注意到有时电子邮件功能确实会收到超时错误,并且由于我捕获了所有异常,因此该错误会呈现给用户。
我想要的是在后台发送电子邮件。如果有任何邮件连接超时,电子邮件方法将重试发送电子邮件可能一两分钟。我正在考虑使用 SQL 邮件来实现这一点。但我不确定它是否是最好的解决方案。
我们有这个模块,用户可以在其中注册,他们需要确认他们的电子邮件地址。
目前我使用 .NET 发送电子邮件。因此,添加记录后,我现在将调用我的电子邮件方法。但我注意到有时电子邮件功能确实会收到超时错误,并且由于我捕获了所有异常,因此该错误会呈现给用户。
我想要的是在后台发送电子邮件。如果有任何邮件连接超时,电子邮件方法将重试发送电子邮件可能一两分钟。我正在考虑使用 SQL 邮件来实现这一点。但我不确定它是否是最好的解决方案。
你有几个选择:
使用SQL Server 数据库邮件来执行有关电子邮件排队和发送的繁重工作。应用程序仍将负责构建消息并将其发送到数据库。通过单独的 SMTP 服务器进行中继(直接在 SQL 机器上安装 SMTP 服务可能不是一个好主意)。
使用来自您的 Web 应用程序的异步电子邮件方法SmtpMail.SendAsync()
,例如. 这将允许您在不阻止用户(或与用户交互)的情况下处理错误,但它并不持久。如果您的 Web 进程重新启动,则操作将丢失。
使用 Windows 服务。这将是一个简单的、独立的应用程序,它只是监视数据库中的新电子邮件任务和/或从 Web 应用程序发送需要执行任务的消息。
使用选项#2SendAsync()
将是最快的实现。根据您的需要,这可能就足够了。
选项#1 不应该需要更多的努力。当您需要围绕收件人列表和电子邮件内容实施复杂的业务逻辑时,选项 #3 真的很出色。也可以将选项 #1 和 #3 组合起来(请参阅评论中@RemusRusanu 和我之间的对话)。
使用选项 #1 和 #3,如果环境出现故障、服务重新启动或发生错误,您将不会丢失任何数据或无法发送电子邮件。
而是管理 .net 应用程序中的超时。如果触发器中存在问题或超时,您的数据可能不会被提交。而是让数据库完成数据事务,并从您的 .net 应用程序中检查状态。
我不认为有一个明确的答案,但这将是我的偏好。