2012-02-08 20 views

Trả lời

3

Phụ thuộc vào cài đặt của bạn về cách gửi thư. Nếu bạn đang gửi thư qua smtp, ActionMailer sử dụng Net::SMTP. Ở đó bạn sẽ tìm thấy các lỗi có thể được nâng lên.

Nếu ứng dụng của bạn được định cấu hình để sử dụng sendmail, ActionMailer sử dụng IO.

2

Bài đăng này trên thinkbot tóm tắt tất cả các ngoại lệ SMTP có thể và cung cấp cho bạn một cách khá thanh lịch để giải quyết tất cả chúng.

http://robots.thoughtbot.com/post/159806037/i-accidentally-the-whole-smtp-exception

Dưới đây là những trường hợp ngoại lệ có thể:

SMTP_SERVER_ERRORS = [TimeoutError, 
         IOError, 
         Net::SMTPUnknownError, 
         Net::SMTPServerBusy, 
         Net::SMTPAuthenticationError] 

SMTP_CLIENT_ERRORS = [Net::SMTPFatalError, Net::SMTPSyntaxError] 
3

Chúng tôi đã tìm thấy danh sách này hoạt động khá tốt cho các lỗi tiêu chuẩn mà bạn có thể muốn thử lại vào lúc:

[ EOFError, 
IOError, 
TimeoutError, 
Errno::ECONNRESET, 
Errno::ECONNABORTED, 
Errno::EPIPE, 
Errno::ETIMEDOUT, 
Net::SMTPAuthenticationError, 
Net::SMTPServerBusy, 
Net::SMTPSyntaxError, 
Net::SMTPUnknownError, 
OpenSSL::SSL::SSLError 
] 

Note rằng tôi không bao gồm Net::SMTPFatalError vì đó thường là một sự cố vĩnh viễn (như địa chỉ email được liệt kê trong danh sách đen).

0

Có thể xảy ra lỗi khác tùy thuộc vào phương pháp phân phối bạn sử dụng. Trong trường hợp bạn đang sử dụng dịch vụ của Amazon SES qua đá quý AWS-ses, thêm các lỗi sau đây để mảng của bạn

AWS::SES::ResponseError 

Bạn có thể sử dụng một số mã như thế này để bắt lỗi

# some_utility_class.rb 
# Return false if no error, otherwise returns the error 
    def try_delivering_email(options = {}, &block) 
    begin 
     yield 
     return false 
    rescue EOFError, 
      IOError, 
      TimeoutError, 
      Errno::ECONNRESET, 
      Errno::ECONNABORTED, 
      Errno::EPIPE, 
      Errno::ETIMEDOUT, 
      Net::SMTPAuthenticationError, 
      Net::SMTPServerBusy, 
      Net::SMTPSyntaxError, 
      Net::SMTPUnknownError, 
      AWS::SES::ResponseError, 
      OpenSSL::SSL::SSLError => e 
     log_exception(e, options) 
     return e 
    end 
    end 

# app/controller/your_controller.rb 

if @foo.save 
    send_email 
    ... 


private 

    def send_email 
    if error = Utility.try_delivering_email { MyMailer.my_action.deliver_now } 
     flash('Could not send email : ' + error.message) 
    end 
    end