how to raise/rescue from ActionMailer deliver method
I am sending emails with the following method:
class Communicate < ActionMailer::Base
def message(sub,msg,people)
subject sub
bcc people
from 'my_email.s@gmail.com'
sent_on Time.now
body :greeting => msg
end
end
bcc contains 4 or 5 email addresses.
During my testing I've noticed two things:
- That if even one of the emails is not an actual email (for example
fake_email_no_domain
) it does not send emails to any of the r开发者_StackOverflow社区ecipients - if the bcc list has a bad email address (for example
nonexistent@gmail.com
) then it still sends emails to other recipients but still throws an error to the logs.
In both scenarios the error that is thrown is:
Redirected to http://localhost:3000/
Completed in 2601ms (DB: 1) | 302 Found [http://localhost/notifications]
[2010-08-04 00:49:00] ERROR Errno::ECONNRESET: Connection reset by peer
/usr/local/lib/ruby/1.9.1/webrick/httpserver.rb:56:in `eof?'
/usr/local/lib/ruby/1.9.1/webrick/httpserver.rb:56:in `run'
/usr/local/lib/ruby/1.9.1/webrick/server.rb:183:in `block in start_thread'
Questions:
- Is there any way I can catch this error? I am showing a
flash[:notice]
to the user and i'd like to mention that something bad happened - If my BCC list has 5 emails and really only 4 emails are sent because 5th was nonexistent email then after all is done can I get a number of how many emails were actually sent? I'd like to show that number in my
flash[:notice]
. I can get this number by actually calling the delivery method in a iteration rather then sending as bulk but still I would not want to increment the count if one email is not sent.
Add or uncomment following line in the config/environments/development.rb
and restart your server.
# Don't care if the mailer can't send
config.action_mailer.raise_delivery_errors = false
I assume you check for the development
for production
add line in config/environments/production.rb
If I am writing the code to sent the email in controller i can write like these to handle the rescue in my application I'm using something like this in the controller:
if @user.save
begin
UserMailer.welcome_email(@user).deliver
flash[:success] = "#{@user.name} created"
rescue Net::SMTPAuthenticationError, Net::SMTPServerBusy, Net::SMTPSyntaxError, Net::SMTPFatalError, Net::SMTPUnknownError => e
flash[:success] = "User #{@user.name} creating Problems sending mail"
end
redirect_to home_index_path
end
精彩评论