ActionMailer отправляет электронные письма, даже если это не удалось с ArgumentError: отправитель должен отправить сообщение

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

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

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

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

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

Возможно ли, что 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

person thewillcole    schedule 25.02.2012    source источник


Ответы (2)


Нашел проблему!

delayed_job не очень хорошо работает с rails 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.

Ву!

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

person thewillcole    schedule 29.02.2012
comment
Кстати, я также нашел обходной путь: просто вызовите метод delayed_job 'delay' для класса, который не наследуется от ActionMailer, а затем вызовите оттуда свой метод ActionMailer. Это похоже на вызов задержки в ActionMailer через прокси-метод, и это прекрасно работает. - person thewillcole; 29.02.2012

Это о delayed_job и rails-3-mailer: https://github.com/collectiveidea/delayed_job#rails-3-mailers

person Dzmitry    schedule 13.07.2012