我们刚刚将一个应用程序投入生产,但我们的ISP邮件服务器在尝试发送邮件时经常返回“451 spool busy”错误。对于我们来说,两种答案都不好:如果我们向用户返回错误,我们会将基础设施问题传递给他们;如果我们不这样做,他们就无法收到邀请/确认/通知/任何内容,而且没有人知道原因。 相反,我们决定设置delayed_job,并始终通过它发送邮件;它会自动重试,我们可以从数据库中的作业队列表中看到消息是否积累。(设置非常简单,最困难的部分是确保工作线程正在运行,而这只需要在Monit配置中进行简单的添加即可。)(奖励:这里是我编写的一个初始化程序,在生产中延迟邮件发送,但在开发和测试中仍直接发送:http://gist.github.com/178125)
你在邮件的生命周期中很可能会遇到投递错误。 我建议选择以下之一: raise_delivery_errors = true 捕获错误,并向用户提供反馈信息 raise_delivery_errors = false # 不捕获任何错误,忽略发送失败 根据你的邮件发送程序选择其中之一。
你至少应该让用户(和自己)知道出了什么问题,否则他们(和你)将不知道是交付失败还是邮件被卡在垃圾邮件文件夹中。 如果你没有遇到太多错误,可以让500错误通过,尽管这可能对用户来说有点不愉快。更好的方法是捕获并记录异常,让用户重试。