Ответ SMTP-сервера Actionmailer

При отправке почты через actionmailer, actionmailer получает ответ от SMTP-сервера, когда все в порядке, а когда нет. Есть ли способ получить этот ответ после отправки почты? Также, когда SMTP-сервер не выдает никаких ошибок?

Наш почтовый сервер qmail выдает идентификатор обработчика, который мы хотим использовать для отслеживания электронных писем.

Например, ответ сервера такой:

250 ok 1308235825 qp 17832


person Martijn Bakker    schedule 16.06.2011    source источник


Ответы (2)


Установите return_response: true в настройках smtp и вызовите message.deliver! вместо deliver. Это возвращает ответ SMTP-сервера, Net::SMTP::Response, который содержит ответ сервера, который вы ищете.

Если вам нужен журнал всех ответов от соединения с сервером, а не только окончательный результат, вам нужно покопаться в Net::SMTP.

person tribalvibes    schedule 02.03.2013
comment
Это нарушает некоторые тесты для меня, потому что меняет класс возвращаемого объекта. Как следует изменить/переопределить возвращаемое значение в тестах, когда return_response имеет значение true? - person duleorlovic; 09.06.2014
comment
@duleorlovic, это зависит от цели ваших тестов, не так ли. в основном, если вы вызываете форму взрыва deliver!, вы должны обрабатывать Net::SMTP::Response в качестве результата. result.success? — это встроенный модуль, который вы можете использовать. См. ruby-doc.org /stdlib-2.0.0/libdoc/net/smtp/rdoc/Net/SMTP/ - person tribalvibes; 10.06.2014
comment
Почему return_response не включен по умолчанию? - person mwfearnley; 24.11.2016

Глядя на источник, вы можете определить наблюдателя:

в base.rb

  # Register an Observer which will be notified when mail is delivered.
  # Either a class or a string can be passed in as the Observer. If a string is passed in
  # it will be <tt>constantize</tt>d.
  def register_observer(observer)
    delivery_observer = (observer.is_a?(String) ? observer.constantize : observer)
    Mail.register_observer(delivery_observer)
  end

Таким образом, вы можете использовать такой код в файле инициализации:

class MailObserver
  def self.delivered_email(message)
    logger_info "Sent Message: #{message}"
  end
end

ActionMailer::Base.register_observer(MailObserver)

Это будет регистрировать отправленную почту, и вы сможете увидеть, сможете ли вы получить заголовки или ответ от объекта отправленной почты.

person Devin M    schedule 16.06.2011
comment
Ну, я хочу получить все ответы от сервера, даже если ошибки нет. Наш почтовый сервер qmail выдает идентификатор обработчика, который мы хотим использовать для отслеживания электронных писем. - person Martijn Bakker; 17.06.2011