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

JMM*_*JMM 11 email smtp transactions

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

  1. 填写表格并提交,注册一个帐户.
  2. 接收带有确认码链接的电子邮件
  3. 单击链接以确认新帐户并登录

当您从Web应用程序发送电子邮件时,通常(通常)会对持久层进行一些更改.例如:

  1. 新用户在您的站点上注册一个帐户 - 在数据库中创建新用户,并通过确认链接向他们发送电子邮件
  2. 用户将错误或问题分配给其他人 - 问题已更新并发送电子邮件通知.

如何发送这些电子邮件对于您的应用程序的成功至关重要.您如何发送它们取决于预期收件人收到电子邮件的重要程度.

我们将使用示例1来查看与邮件服务器关闭的情况相关的以下四种策略.

TRANSACTIONAL&SYNCHRONOUS发送电子邮件失败,并向用户显示一条错误消息,指出无法创建其帐户.当应用程序等待连接超时时,应用程序将显得缓慢且无响应.由于事务已回滚,因此未在数据库中创建该帐户.

TRANSACTIONAL&ASYNCHRONOUS这里的事务定义是指将电子邮件发送到JMS队列或将其保存在数据库表中,以便另一个后台进程进行提取和发送.

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

非事务性和同步性用户是在数据库中创建的,但是当应用程序尝试使用确认链接发送电子邮件时,应用程序会收到超时错误.将向用户显示一条错误消息,指出存在错误.应用程序缓慢且无响应,因为它等待连接超时

当邮件服务器恢复生命并且用户再次尝试注册时,会告诉他们他们的帐户已经存在但尚未确认,并且可以选择将电子邮件重新发送给他们.

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

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

最简单的方法是同步编码,但这种方法还有其他缺陷吗?我想我想知道是否有最好的做法,我用谷歌搜索找不到多少.

Pek*_*ica 10

我的2美分:

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

  2. 在大多数情况下,当发送电子邮件出错时,您的应用程序无论如何都不会得到即时反馈 - 有效服务器上不存在的电子邮件地址会发送一条"无法投递"的消息,但会有一些延迟; 如果邮件被垃圾邮件过滤器吃掉,你根本就得不到任何反馈; 在其他情况下,可能需要几分钟(灰名单)到几天(邮件服务器暂时关闭)才能发送电子邮件.因此,等待邮件传递的同步方法注定要失败.即使立即失败(因为用户输入一个明显的假地址)应该永远不会导致注册得到回滚.

我要做的是,尽可能简化帐户创建,允许用户确认帐户之前访问该帐户,然后唠叨他们以确认他们的电子邮件(如有必要,限制访问某些区域,直到确认).但是,我会阻止使用相同的电子邮件创建第二个帐户,以防止混乱.

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