在 Web 应用程序中发送电子邮件

11
我想要一些意见,我正在构建一个具有以下标准功能的 web 应用程序:
  1. 通过填写表单和提交表单来注册账户。
  2. 收到包含确认链接的电子邮件。
  3. 点击链接以确认新帐户并登录。
当你从你的网页应用程序发送电子邮件时,通常情况下会对持久性层进行一些更改,例如:
  1. 在你的网站上注册新用户 - 在数据库中创建新用户并向他们发送包含确认链接的电子邮件。
  2. 用户将 bug 或问题分配给其他人 - 更新问题并发送电子邮件通知。
如何发送这些电子邮件对于您的应用程序的成功非常关键。 如何发送取决于所需的收件人接收电子邮件的重要程度。
我们将针对邮件服务器宕机的情况,使用示例 1 来查看以下四种策略。
事务性和同步性 发送电子邮件失败,用户会看到错误消息,表示无法创建他们的账户。应用程序会变得缓慢和不响应,因为应用程序需要等待连接超时。由于事务回滚,因此不会在数据库中创建帐户。
事务性和异步性 此处的事务性指发送电子邮件到 JMS 队列或保存在数据库表中,供另一个后台进程抓取并发送。
帐户将在数据库中创建,电子邮件将被发送到 JMS 队列以供稍后处理。事务成功提交。用户会看到一条消息,表示他们的帐户已经创建,并要求他们检查电子邮件以获取确认链接。在这种情况下,由于某些其他错误,可能永远不会发送电子邮件,但是向用户告知电子邮件已发送给他们。如果必须调用应用程序支持来诊断电子邮件问题,则可能会延迟向用户发送电子邮件。
非事务性和同步性当用户在数据库中被创建后,应用程序在尝试发送带有确认链接的电子邮件时出现超时错误。用户会收到一个错误消息,提示发生了错误。由于等待连接超时,应用程序变得缓慢且无响应。

当邮件服务器重新启动并且用户再次尝试注册时,他们会被告知他们的帐户已存在但未经确认,并可以选择重新发送电子邮件。

非事务性和异步 与事务性和异步的唯一区别是,如果发送电子邮件到JMS队列或将其保存在数据库中时出现错误,则仍会创建用户帐户,但直到用户再次尝试注册之前,电子邮件才不会被发送。

我想知道其他人在这里做了什么?除了上面提到的4种解决方案外,您还能推荐其他解决方案吗?如何合理地处理这个问题?我不想为处理我的邮件服务器崩溃的(希望很少发生)罕见情况而过度设计系统!

最简单的方法是同步编码,但这种方法还有其他的缺陷吗?我想知道是否有最佳实践,但我在搜索引擎上找不到太多相关信息。


好问题,但在我看来有点冗长。 - Pekka
1
可能是这样,我猜我只是想让它更加清晰明了 :) - JMM
1个回答

10

我的建议:

  1. 一旦用户注册成功,请勿在发送邮件失败时撤销注册。出于简单的商业原因:如果第一次尝试不成功,他们可能不会回来或重新注册。相反,容忍不完整的注册并催促用户尽快确认他们的电子邮件地址。

  2. 在大多数情况下,当发送电子邮件失败时,您的应用程序无法立即收到反馈——有效服务器上不存在的电子邮件地址将以一定延迟发送“无法投递”的消息;如果邮件被垃圾邮件过滤器吃掉,您将得不到任何反馈;在其他情况下,邮件可能需要几分钟(灰名单)到几天(邮件服务器暂时关闭)才能被送达。因此,等待邮件传递的同步方法注定要失败。即使出现立即失败的情况(因为用户输入了显然是假的地址),也绝不应该导致注册被撤销。

我会尽可能地让账户创建变得简单,允许用户在确认之前访问账户,并且在必要时一直提醒他们确认电子邮件(如果需要,限制对某些区域的访问)。但我会防止使用相同电子邮件创建第二个帐户,以避免混乱。

请确保允许更改电子邮件地址,即使先前的地址尚未得到确认,并使用户能够向不同的地址重新请求确认消息。


这个答案需要被刻在硅谷的某个地方,并且被所有需要注册的网站所信奉和遵守。 - MusiGenesis
So Pekka - 你没有评论电子邮件应该同步发送还是异步发送,这里有什么意见吗? - JMM
没错,这就是我所说的同步和异步 :) 顺便问一下,你有什么建议(从技术角度)如何以异步方式实现它? - JMM
通常情况下,人们会将消息传递给在后台运行的另一个脚本。你使用的是什么平台? - Pekka
使用Spring和JPA开发Java Web应用程序,我考虑将电子邮件放入数据库表中,并使用后台进程轮询表格以获取新的电子邮件并发送它们。 - JMM
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接