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

Email 在web应用程序中发送电子邮件,email,transactions,smtp,Email,Transactions,Smtp,我在这里寻找一些意见,我正在构建一个web应用程序,它具有相当标准的功能: 通过填写表格并提交来注册帐户 接收带有确认代码链接的电子邮件 单击链接确认新帐户并登录 当您从web应用程序发送电子邮件时,通常会对持久层进行一些更改。例如: 新用户在您的站点上注册帐户-新用户在数据库中创建,并通过确认链接向他们发送电子邮件 用户将错误或问题分配给其他人-问题将被更新并发送电子邮件通知 如何发送这些电子邮件对应用程序的成功至关重要。您发送电子邮件的方式取决于预期收件人收到电子邮件的重要性 我们将使用示例

我在这里寻找一些意见,我正在构建一个web应用程序,它具有相当标准的功能:

  • 通过填写表格并提交来注册帐户
  • 接收带有确认代码链接的电子邮件
  • 单击链接确认新帐户并登录
  • 当您从web应用程序发送电子邮件时,通常会对持久层进行一些更改。例如:

  • 新用户在您的站点上注册帐户-新用户在数据库中创建,并通过确认链接向他们发送电子邮件
  • 用户将错误或问题分配给其他人-问题将被更新并发送电子邮件通知
  • 如何发送这些电子邮件对应用程序的成功至关重要。您发送电子邮件的方式取决于预期收件人收到电子邮件的重要性

    我们将使用示例1,针对邮件服务器停机的情况,研究以下四种策略

    事务和同步 发送电子邮件失败,用户会收到一条错误消息,说明无法创建其帐户。当应用程序等待连接超时时,应用程序将显得缓慢且无响应。由于事务已回滚,因此未在数据库中创建帐户

    事务和异步 这里的事务性定义是指将电子邮件发送到JMS队列或将其保存在数据库表中,以供另一个后台进程拾取和发送

    用户帐户在数据库中创建,电子邮件被发送到JMS队列以便稍后处理。事务已成功并提交。向用户显示一条消息,说明他们的帐户已创建,并检查他们的电子邮件中的确认链接。在这种情况下,可能由于某些其他错误而从未发送电子邮件,但用户被告知电子邮件已发送给他们。如果必须调用应用程序支持来诊断电子邮件问题,那么向用户发送电子邮件可能会有一些延迟

    非事务&同步 用户是在数据库中创建的,但应用程序在尝试使用确认链接发送电子邮件时会出现超时错误。向用户显示一条错误消息,说明发生了错误。应用程序在等待连接超时时速度慢且无响应

    当邮件服务器恢复正常,用户再次尝试注册时,他们会被告知其帐户已存在,但尚未确认,并可以选择将电子邮件重新发送给他们

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

    我想知道的是其他人在这里做了什么?除了我上面提到的4个解决方案之外,你能推荐其他解决方案吗?解决这个问题的合理方法是什么?我不想过度设计一个系统来处理(希望如此)罕见的邮件服务器宕机的情况

    最简单的方法是同步编码,但是这种方法还有其他缺陷吗?我想我想知道是否有一个最佳实践,我无法通过谷歌搜索找到太多信息。

    我的2美分:

  • 用户注册后,如果发送电子邮件失败,请不要回滚注册。出于简单的商业原因:如果第一次尝试失败,他们可能不会回来或重新注册。而是容忍不完整的注册,并要求用户尽快确认其电子邮件地址

  • 在大多数情况下,当发送电子邮件出错时,您的应用程序无论如何都不会立即收到反馈-有效服务器上不存在的电子邮件地址将延迟发送回“无法送达”消息;如果邮件被垃圾邮件过滤器过滤掉,你将得不到任何反馈;在其他情况下,电子邮件可能需要几分钟(灰色列表)到几天(邮件服务器暂时关闭)才能送达。因此,等待邮件交付的同步方法注定会失败。即使是即时失败(因为用户输入了明显虚假的地址),也不会导致注册回滚

  • 我要做的是,尽可能轻松地创建帐户,在确认之前允许用户访问帐户,然后让他们拼命确认他们的电子邮件(如果必要,在确认之前限制对某些区域的访问)。不过,为了避免混乱,我会阻止使用相同的电子邮件创建第二个帐户


    确保您允许更改电子邮件地址,即使之前的地址尚未确认,并允许用户将确认消息重新请求到其他地址

    好问题,但在我看来有点冗长。可能是的,我想我只是想说清楚:)这个答案需要在硅谷的某个地方刻在石头上,所有需要注册的网站都必须遵守。所以Pekka-你没有评论邮件应该同步还是异步发送,有什么意见吗?@Denise异步地说,我想肯定是这样。您可以立即检查最常见的“立即”错误(地址无效,服务器不存在)。如果这两件事都没有问题,发送电子邮件,继续注册,并唠叨用户,直到他们单击邮件中的“确认”链接。@Denise请确认我理解正确:所谓“同步”是指在注册期间完成发送过程,并且只在过程完成后才继续注册,而不是“异步”放置