当我为我的Web应用程序创建用户时,通过自动生成的密码将SMTP电子邮件(使用ASP.NET的SMTPClient)发送给用户。然而,有时我注意到它超时了,新用户根本不会收到带有密码的电子邮件。

好的,我将显示一条消息,指示邮件未通过,但用户已创建。

因此,系统管理员到目前为止有两个选择:

  1. 重置用户的密码,并希望使用自动生成的密码发送另一封 SMTP 邮件。
  2. 删除并重新创建用户。

如果未发送 smtp,我可以回滚用户创建,但是解决此问题的最佳实践是什么?

我想我应该重试发送电子邮件 3 次,每次超时时间为 5 秒。所以 15 秒将是最坏的情况。

这是要走的路吗?

有帮助吗?

解决方案

好吧,根据您的平台,如果您可以将邮件交给本地 MTA,它应该处理重试等问题。您的程序可以只对邮件进行排队并继续,而不必担心处理超时和灰名单等。

如果消息仍然无法发送,您可以随时尝试重新发送(通过密码重置功能)。如果也失败,很可能是电子邮件地址有误,我建议删除该帐户,导致用户重新注册。

当然,这在某些系统上可能是不可能的,具体取决于未经确认的用户可以执行的操作 - 这实际上取决于您允许人们在验证电子邮件之前执行的操作。

其他提示

听起来您的 Web 应用程序正在直接与用户的邮件服务器进行 SMTP 通信。您的Web应用程序是MUA(邮件用户代理)与用户的MTA(邮件传输代理)对话。您需要运行自己的 MTA,以便确保有人提供排队、重试等服务。

如果你真的想竭尽全力,你可以做你正在做的事情(尽管只有一次尝试),回退到将消息排队并继续按较慢的时间表重试至少 24 小时,并将未完成的状态暴露给用户。

关于您的应用程序应该如何表现的官方答案可以在 RFC1123(互联网主机要求 - 应用程序和支持):

5.3.1.1 发送策略

发送者SMTP的一般模型是一个或多个过程,该过程定期尝试传输传出邮件。在典型的系统中,撰写消息的程序具有某种方法,可以要求立即关注新的发出邮件,而无法立即发送的邮件必须立即排队并由发件人定期重新进行。邮件队列条目不仅包括消息本身,还包括信封信息。

在一次尝试失败后,发件人必须延迟重试特定目的地。通常,重试时间间隔至少应为30分钟;但是,当发送者SMTP可以确定非交付的原因时,更复杂和可变的策略将是有益的。

重试继续传输消息或发件人放弃;放弃时间通常至少需要4-5天。重试算法的参数必须是可配置的。

如果您使用 ASP.NET 和 System.Net.Mail 类,您可能会通过 Web 服务器计算机上的 IIS 实例发送邮件(我不确定,因为您没有指定)。没有一个好方法可以了解您的邮件传输代理 (IIS SMTP) 的情况。它有自己的重试逻辑,默认情况下,消息可能需要很长时间才能传递。

您如何检测邮件未送达?“超时”是怎么来的?

您应该有一个处理邮件发送的后台进程。如果成功交付到 MTA,您应该假设一切顺利。除非您因垃圾邮件而被列入黑名单,否则大多数 MTA 都会不断重试,直到通过。如果您在使用 MTA 投递邮件时确实遇到错误,那么一定要重试,或者找出导致失败的原因并修复错误。老实说,这部分永远不应该失败。

您可能想要监控 NDR 邮件的返回地址,以便在确定电子邮件未送达的时间时可以采取某种操作。但如果用户还无法登录系统,就没有好方法让他们知道发生了什么。也许您可以设置一个带有与电子邮件关联的值的 cookie,并在无法发送邮件时在登录/注册页面上添加一些内容。

恕我直言,您应该通知用户,要求他验证电子邮件,而无需重试。

如果用户未验证电子邮件并离开页面,您最好回滚帐户,因为用户无论如何都无法访问它。

大多数超时情况是由无效的电子邮件帐户引起的。用户要么犯了错误,要么给了您一个不存在的电子邮件地址,以避免收到垃圾邮件。

如果可能的话,不要询问用户的电子邮件。编程的第一条规则应该是:不要惹恼用户。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top