2012-02-08 15 views

risposta

3

Dipende dalle impostazioni su come inviare messaggi. Se stai inviando messaggi tramite smtp, ActionMailer utilizza Net::SMTP. Lì troverai gli errori che potrebbero essere sollevati.

Se l'applicazione è configurata per utilizzare sendmail, ActionMailer utilizza IO.

3

Abbiamo trovato questa lista funziona piuttosto bene per gli errori standard che si potrebbe desiderare di riprovare su:

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

Nota che non ho incluso Net::SMTPFatalError perché è spesso un errore permanente (come un indirizzo di posta elettronica nella lista nera).

0

Altri errori possibili a seconda del metodo di consegna utilizzato. Nel caso in cui si utilizza il servizio di Amazon SES attraverso la gemma AWS-ses, aggiungere il seguente errore per l'array

AWS::SES::ResponseError 

È possibile utilizzare un po 'di codice come questo per catturare gli errori

# 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