ActionMailer отправляет электронные письма, даже если это не удалось с ArgumentError: отправителю необходимо отправить сообщение - PullRequest
0 голосов
/ 25 февраля 2012

Похоже, что мои электронные письма вызывают ошибки и при отправке.

Я получаю электронные письма, а также получаю эту ошибку на консоли "rake jobs: work":

Class # delivery_and_save завершился неудачно с ArgumentError: отправителю (Return-Path, Sender или From) потребовалось отправить сообщение - 1 неудачная попытка

Но когда я перехожу через отладчик, я вижучто есть a from:

> email.from
=> ["my@email.com"]
> email_draft.From
=> Me <my@email.com>
> email_draft.sender
=> nil
> email_draft.Sender
=> nil
> email_draft.reply_to
=> ["my@email.com"]

Возможно ли, что ActionMailer выдает ошибку и все еще отправляет?Это известная проблема?У меня проблема в том, что delayed_job продолжает отправлять электронную почту несколько раз.

ОБНОВЛЕНИЕ:

def EmailEngine < ActionMailer::Base

  # Called with EmailEngine.delay.deliver_and_save(template)
  def deliver_and_save(template)

    # This appears to be raising the error
    email_draft = EmailEngine.send(template) # this will invoke 'mail'

    # Saved here to have a better record than the logs provide
    Email.create(...

    # Yet this still sends
    email_draft.deliver

Ответы [ 2 ]

2 голосов
/ 29 февраля 2012

Обнаружена проблема!

delayed_job не очень хорошо работает с рельсами 3.1, и вы должны использовать этот новый синтаксис:

EmailEngine.delay.deliver_and_save(template) # I was already doing this.

который он автоматически пытается вызвать .deliver объекта Mail :: Message, который возвращает deliver_and_save.(Так вот, у меня проблема: я пытаюсь позвонить .deliver.)

РЕШЕНИЕ: Я изменил код и позвонил Email.create(.. где-то за пределами EmailEngine, а затем позвонил EmailEngine.delay.send(template) полностью и полностью удален deliver_and_save.

Woo!

Btw, любой метод, вызванный для класса, который наследуется от ActionMailer, вернет объект Mail :: Message ,ActionMailer делает некоторую чёрную магию, чтобы это произошло (перезаписывая Ruby method_missing, чтобы он мог отображать представления точно так же, как контроллер, хотя во многих отношениях он ведет себя как модель).

0 голосов
/ 13 июля 2012
...