2011-06-16 150 views
4

当通过actionmailer发送邮件时,actionmailer会从SMTP服务器收到响应,当它正常或错误时。发送邮件后是否有办法检索此响应? 也当SMTP服务器没有引发错误?Actionmailer SMTP服务器响应

我们的qmail邮件服务器会抛出一个我们想用来跟踪电子邮件的处理程序ID。

作为一个例子,服务器的响应是这样的:

250 OK 1308235825 QP 17832

回答

1

综观源可以定义观察者:

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) 

这将记录发送的邮件,并且您可以看到是否可以从发送的邮件对象获取标题或响应。

+0

嗯,我想从服务器的所有响应,即使没有错误。我们的qmail邮件服务器会抛出一个我们想用来跟踪电子邮件的处理程序ID。 – 2011-06-17 07:34:52

+0

更新了我的答案。看看是否有更好的方法。 – 2011-06-17 17:21:23

5

在smtp设置中设置return_response: true并且调用message.deliver!而不是deliver。这将返回SMTP服务器响应,一个Net::SMTP::Response,其中包含您正在查找的服务器响应。

如果您需要记录与服务器连接的所有响应,而不仅仅是最终结果,则需要深入到Net :: SMTP。

+0

非常感谢! – JCorcuera 2013-08-15 05:45:33

+0

这打破了我的一些测试,因为它改变了返回对象的类。 return_response为true时应如何更改/覆盖测试中的返回值? – duleorlovic 2014-06-09 16:42:04

+0

@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