Каков наилучший способ обработки исключений электронной почты в приложении Rails с использованием Postmarkapp? - PullRequest
6 голосов
/ 04 октября 2011

Я использую Postmark для обработки всей электронной почты в моем приложении Rails 3, используя гем postmark-rails.

Время от времени пользователь вводит неправильный или несуществующий адрес электронной почты, заканчивая тем, что дает жесткие откаты. Почтовый штемпель вызывает Postmark::InvalidMessageError ошибок для решения этой проблемы, которые мои пользователи получают как неописательную ошибку 500.

Я бы хотел обработать эти ошибки в своем адаптивном интерфейсе, и мне было интересно, какова будет лучшая стратегия. У меня уже есть несколько почтовых программ с несколькими десятками, поэтому я не хочу добавлять блоки begin-raise ко всем этим методам. Добавление этого начального повышения к контроллерам также не кажется самым элегантным решением.

Я читал о добавлении блока rescue_from к моему ApplicationController, но тогда я не знаю, как с этим справиться в интерфейсе (возможно, вызывая метод, который использует метод errors?)

Я бы хотел выслушать ваши мысли, прежде чем водопроводчик.

Есть идеи?

1 Ответ

26 голосов
/ 08 октября 2011

Нам пришлось столкнуться с той же проблемой в Beanstalk. Прежде всего мы отключили «lift_delivery_errors» в производственной среде, затем мы реализовали метод переопределения для ActionMailer :: Base, который позволял нам изменять этот параметр на лету для конкретных поставок. Как это:

AccountMailer.raise_errors do
  AccountMailer.deliver_welcome_email(@account)
end

Это позволило нам контролировать, когда именно мы хотим, чтобы появлялись исключения при доставке, и избегать проблем, когда такие ошибки ломали то, чего не должны были делать. Обычно есть только одно или два места, где вы хотите поместить это переопределение. В нашем случае это функции «Забыть пароль» и «Пригласить пользователя», когда важно сообщить пользователям, что их электронное письмо / приглашение для сброса пароля не доставлено. Наличие исключений доставки в фоновом режиме никому не помогает.

После этого мы добавили rescue_from в наш ApplicationController, который установил бы 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

activtivate_email_bounce_path ссылается на контроллер, который использует Postmark API для повторной активации отказов. Вы можете найти более подробную информацию об этом здесь:

http://developer.postmarkapp.com/developer-bounces.html

Таким образом, после того, как вы все это сделаете, у вашего конечного пользователя будет довольно хороший опыт работы с ошибками доставки, что обычно не решается в веб-приложениях. В Beanstalk это выглядит так:

Beanstalk reactive bounce

И не только пользователь может видеть, что его электронное письмо отскочило, но и сам реагировать на него:

Beanstalk reactivate bounce

Надеюсь, это поможет.

Илья Сабанин http://twitter.com/isabanin

...