当我为我的Web应用程序创建用户时,会向用户发送一封SMTP电子邮件(使用ASP.NET的SmtpClient) 自动生成密码。但是,有时我注意到它会超时,新用户根本不会收到带有密码的电子邮件。
好吧,所以我会显示一条消息,表明邮件没有通过,但用户已经创建。
因此,到目前为止,sys admin有2个选项:
如果未发送smtp,我可以回滚用户创建但是解决此问题的最佳做法是什么?
我想我应该重试发送电子邮件3次,每次超时时间为5秒。所以15秒将是更糟糕的情况。
这是要走的路吗?
答案 0 :(得分:1)
那么,根据您的平台,如果您可以将邮件移交给本地MTA,它应该处理重试等。您的程序可以将邮件排队并继续前进,而不用担心处理超时和灰名单等。
如果仍然无法发送消息,您可以尝试重新发送消息(通过密码重置功能)。如果那也失败了,很可能是电子邮件地址出错,我建议删除该帐户,导致用户重新注册。
当然,这可能在某些系统上是不可能的,这取决于未经证实的用户可以做什么 - 这实际上取决于您在验证电子邮件之前允许用户做什么。
答案 1 :(得分:1)
听起来您的网络应用程序直接向您的用户的邮件服务器说SMTP。 [您的网络应用程序是与用户的MTA(邮件传输代理)通信的MUA(邮件用户代理)。] 没有任何东西说用户的MTA必须是可以访问的或者此刻正在工作。您需要运行自己的MTA,以确保有人提供排队,重试等。
如果你真的想向后弯腰,你可以做你正在做的事情(虽然只有一次尝试),回退到排队消息并继续以较慢的时间表重试至少24小时,并暴露未完成的向用户说明。
关于应用程序应如何表现的官方答案可以在RFC1123 (Requirements for Internet Hosts - Application and Support):
中找到5.3.1.1发送策略
发件人SMTP的一般模型是 一个或多个进程 定期尝试传输 外发邮件。在典型的系统中, 组成消息的程序 有一些请求的方法 立即关注一块新的 外发邮件,而邮件则不能 必须立即传播 排队并定期重试 发件人。邮件队列条目将 不仅包括消息本身 还有信封信息。
发件人必须延迟重试a 一个特定的目的地 尝试失败了。一般来说, 重试间隔应该至少为30 分钟;然而,更复杂 和变量策略将是 发件人 - SMTP可以有益 确定非原因 递送
重试继续,直到消息为止 传送或发送者放弃; 放弃时间通常需要 至少4-5天。参数来 重试算法必须 可配置的。
答案 2 :(得分:0)
恕我直言,你应该通知用户,要求他验证电子邮件,不要重试。
如果用户未验证电子邮件并离开页面,则最好回滚帐户,因为用户无论如何都无法访问该帐户。
大多数超时情况都是由无效的电子邮件帐户引起的。用户犯了错误或者给了你一个不存在的电子邮件地址,以免被垃圾邮件发送。
如果可能,请不要向用户发送电子邮件。编程的第一条规则应该是:不要惹恼用户。
答案 3 :(得分:0)
如果您使用的是ASP.NET和System.Net.Mail类,则可能是通过Web服务器计算机上的IIS实例发送邮件(我不确定,因为您没有指定)。没有一种好方法可以了解您的邮件传输代理(IIS SMTP)发生了什么。它有自己的重试逻辑,默认情况下,可能需要很长时间才能传递消息。
您是如何检测到邮件未送达的?什么是“超时”来自?
您应该有一个处理邮件发送的后台进程。如果交付给MTA成功,你应该假设一切顺利。除非您被列入垃圾邮件列入黑名单,否则大多数MTA将继续重试,直到它们通过。如果您实际上在使用MTA关闭消息时出错,那么一定要重试它,或找出导致失败的原因并修复错误。老实说,这部分永远不会失败。
您可能希望监视NDR邮件的返回地址,以便在确定电子邮件未送达时确定可以采取某种操作。但是如果用户还无法登录系统,那么就没有好办法让他们知道发生了什么。也许您可以使用与电子邮件关联的值设置cookie,如果您无法发送邮件,则可以在登录/注册页面上放置一些内容。