2011-06-16 132 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