2008-09-11 261 views
0

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

好的,所以我会显示一条消息,指出邮件没有通过但创建了用户。

因此,系统管理员有2个选项至今:

一)重置用户密码,并希望其他SMTP邮件与自动生成的密码发送。 b)删除并重新创建用户。

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

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

这是要走的路吗?

回答

1

那么,根据你的平台,如果你只是把你的邮件交给本地MTA,它应该处理重试等。您的程序只需排队邮件并继续前进,而不用担心处理超时和重排列表等问题。

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

当然,这在某些系统上可能无法实现,具体取决于未经确认的用户可以做什么 - 这取决于您允许用户在验证电子邮件之前执行的操作。

0

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

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

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

如果可能,请勿要求您的用户发送电子邮件。 Yhe编程的第一条规则应该是:不要惹恼用户。

1

这听起来像你的网络应用程序直接向用户的邮件服务器发送SMTP。 [您的网络应用程序是与用户的MTA(邮件传输代理)交谈的MUA(邮件用户代理)。] 没有说用户的MTA此刻必须可到达或正在工作。你需要运行你自己的MTA,以确保有人提供排队,重试等。

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

在您的应用程序应该是怎样表现的官方答案可以在RFC1123 (Requirements for Internet Hosts - Application and Support)发现:

5.3.1.1发送策略

寄件人SMTP的一般模式是 一个或多个进程即 定期尝试传送 传出邮件。在典型的系统中, 对构成消息 程序有用于请求 为一条新的 传出邮件立即注意一些方法,而不能 立即发送邮件必须是 排队并通过 发件人定期重试。邮件队列条目 不仅包括邮件本身 还包括信封信息。

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

重试继续,直到消息被传送或发送者放弃了 ; 放弃时间一般至少需要4-5天 。重试算法的参数必须为 可配置。

0

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

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

你应该有一个处理邮件发送的后台进程。如果交付给MTA成功,你应该假设一切都很好。除非你被列入垃圾邮件黑名单,否则大多数MTA都会继续重试直到他们通过。如果您实际发生的错误将您的MTA信息删除,那么一定要重试它,或者找出导致失败的原因并修复错误。老实说,这部分应该永远不会失败。

您可能希望监控NDR邮件的返回地址,以便您在确定电子邮件未送达时能够采取某种行动。但是如果用户无法登录到系统,那么没有办法让他们知道发生了什么。也许你可以用一个与电子邮件关联的值设置一个cookie,如果你无法发送邮件,可以在登录页面注册一些东西。