当通过actionmailer发送邮件时,actionmailer会从SMTP服务器收到响应,当它正常或错误时。发送邮件后是否有办法检索此响应? 也当SMTP服务器没有引发错误?Actionmailer SMTP服务器响应
我们的qmail邮件服务器会抛出一个我们想用来跟踪电子邮件的处理程序ID。
作为一个例子,服务器的响应是这样的:
250 OK 1308235825 QP 17832
当通过actionmailer发送邮件时,actionmailer会从SMTP服务器收到响应,当它正常或错误时。发送邮件后是否有办法检索此响应? 也当SMTP服务器没有引发错误?Actionmailer SMTP服务器响应
我们的qmail邮件服务器会抛出一个我们想用来跟踪电子邮件的处理程序ID。
作为一个例子,服务器的响应是这样的:
250 OK 1308235825 QP 17832
综观源可以定义观察者:
# 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)
这将记录发送的邮件,并且您可以看到是否可以从发送的邮件对象获取标题或响应。
在smtp设置中设置return_response: true
并且调用message.deliver!
而不是deliver
。这将返回SMTP服务器响应,一个Net::SMTP::Response
,其中包含您正在查找的服务器响应。
如果您需要记录与服务器连接的所有响应,而不仅仅是最终结果,则需要深入到Net :: SMTP。
非常感谢! – JCorcuera 2013-08-15 05:45:33
这打破了我的一些测试,因为它改变了返回对象的类。 return_response为true时应如何更改/覆盖测试中的返回值? – duleorlovic 2014-06-09 16:42:04
@duleorlovic取决于你的测试的目的不是。基本上,如果你调用爆炸形式'deliver!',你应该处理一个'Net :: SMTP :: Response'作为结果。 'result.success?'是一个很好的例子,你可以使用。请参阅http://ruby-doc.org/stdlib-2.0.0/libdoc/net/smtp/rdoc/Net/SMTP/Response.html – tribalvibes 2014-06-10 19:48:46
嗯,我想从服务器的所有响应,即使没有错误。我们的qmail邮件服务器会抛出一个我们想用来跟踪电子邮件的处理程序ID。 – 2011-06-17 07:34:52
更新了我的答案。看看是否有更好的方法。 – 2011-06-17 17:21:23