ho avuto uno sguardo alla classe, ma non riuscivo a vedere un elenco di possibili eccezioni che possono essere sollevate da consegnare e-mail SMTP nel rotaie 3.Quali eccezioni possono essere sollevate da un'azione mailer
Qualcuno ha idea?
ho avuto uno sguardo alla classe, ma non riuscivo a vedere un elenco di possibili eccezioni che possono essere sollevate da consegnare e-mail SMTP nel rotaie 3.Quali eccezioni possono essere sollevate da un'azione mailer
Qualcuno ha idea?
Questo post su thoughtbot riassume tutte le possibili eccezioni SMTP e offre un modo abbastanza elegante di gestirle tutte.
http://robots.thoughtbot.com/post/159806037/i-accidentally-the-whole-smtp-exception
Ecco le possibili eccezioni:
SMTP_SERVER_ERRORS = [TimeoutError,
IOError,
Net::SMTPUnknownError,
Net::SMTPServerBusy,
Net::SMTPAuthenticationError]
SMTP_CLIENT_ERRORS = [Net::SMTPFatalError, Net::SMTPSyntaxError]
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).
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