使用 Postmarkapp 在 Rails 应用程序中处理电子邮件异常的最佳方法是啥?
Posted
技术标签:
【中文标题】使用 Postmarkapp 在 Rails 应用程序中处理电子邮件异常的最佳方法是啥?【英文标题】:What is the best way to handle Email exceptions in a Rails app using Postmarkapp?使用 Postmarkapp 在 Rails 应用程序中处理电子邮件异常的最佳方法是什么? 【发布时间】:2011-11-30 08:31:53 【问题描述】:我正在使用 Postmark 处理我的 Rails 3 应用程序中的所有电子邮件,使用 postmark-rails gem。
有时,用户会输入错误的电子邮件或不存在的电子邮件,最终会给出硬退回邮件。 Postmark 会引发 Postmark::InvalidMessageError
错误来处理此问题,我的用户会收到非描述性 500 错误。
我想在我的响应式界面中处理这些错误,我想知道什么是最好的策略。我现在已经有几个邮件程序,其中有几十个,所以我不想在所有这些方法中添加begin-raise
块。将这个 begin-raise 添加到控制器似乎也不是最优雅的解决方案。
我一直在阅读有关将rescue_from
块添加到我的ApplicationController
的内容,但是我不知道如何在界面中处理这个问题(可能是通过调用使用errors
方法的方法?)
我想在安装管道之前听听您的想法。
有什么想法吗?
【问题讨论】:
【参考方案1】:我们不得不在 Beanstalk 中处理同样的问题。首先,我们在生产中关闭了“raise_delivery_errors”,然后我们为 ActionMailer::Base 实现了一个覆盖方法,它允许我们为特定的交付动态更改该设置。像这样:
AccountMailer.raise_errors do
AccountMailer.deliver_welcome_email(@account)
end
这使我们能够控制我们希望何时出现交付异常,并避免在此类错误破坏了它们不应该破坏的东西时出现问题。通常只有一两个地方需要覆盖。在我们的例子中,它是忘记密码和邀请用户功能,当让用户知道他们的密码重置电子邮件/邀请未送达至关重要时。在后台运行的作业中出现交付异常对任何人都没有帮助。
完成之后,我们向 ApplicationController 添加了一个 rescue_from 来设置 flash[:alert] 并重定向回来。
def postmark_delivery_error(exception)
if address = derive_email_from_postmark_exception(exception)
link = %Q[<a href="# reactivate_email_bounce_path(address) ">reactivating</a>]
msg = "We could not deliver a recent message to “# address ”. The email was disabled due to a hard bounce or a spam complaint. You can try # link it and try again."
else
msg = "We could not deliver a recent message. The email was disabled due to a hard bounce or a spam complaint. Please contact support."
end
flash[:alert] = msg
redirect_to :back
end
reactivate_email_bounce_path 链接到使用 Postmark API 重新激活退回的控制器。您可以在此处找到有关它的更多详细信息:
http://developer.postmarkapp.com/developer-bounces.html
因此,在您完成所有这些之后,您的最终用户可以在处理交付错误时获得相当不错的体验,而这在网络应用程序中通常不会解决。在 Beanstalk 中看起来像这样:
不仅用户可以看到他的电子邮件被退回,他还可以自己做出反应:
希望这会有所帮助。
伊利亚·萨巴宁 http://twitter.com/isabanin
【讨论】:
亲爱的 Ilya,哇,非常感谢您的精彩回答!!!很抱歉延迟回来,我不得不暂时搁置这个问题。您是否打算将此代码开源到 gem 中?我肯定会使用它并尝试做出贡献。同时,您能否提供有关控制器中 reactivate_email_bounce_path 操作的更多信息?我将尝试实施我自己的解决方案并保持这个问题开放,直到我可以让它工作,然后我会标记你的答案。 谢谢。我很难展示我们的控制器内部的样子,因为那里有很多与问题无关的逻辑。然而,重新激活反弹的解决方案非常简单。您只需向 Postmark API 发送一个 HTTP 请求。您可以在这里找到更多详细信息:developer.postmarkapp.com/… 疯狂的答案。处理得非常好。我将在我们的应用程序中逐字实现这一点。谢谢! 这是一个很棒的答案,但是如果您使用 DelayedJob,您知道如何处理异常吗?以上是关于使用 Postmarkapp 在 Rails 应用程序中处理电子邮件异常的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
Postmark::InvalidMessageError 尝试发送邮件时
php 带附件的简单邮戳PHP类。需要邮戳帐户(http://postmarkapp.com)和php库(https://gist.github.co