如何从ActionMailer提供方法提升/救援

时间:2010-08-04 04:57:24

标签: ruby-on-rails actionmailer

我使用以下方法发送电子邮件:

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包含4或5个电子邮件地址。

在我测试期间,我注意到两件事:

  • 即使其中一封电子邮件不是实际的电子邮件(例如fake_email_no_domain),也不会向任何收件人发送电子邮件
  • 如果密件抄送列表的电子邮件地址不正确(例如nonexistent@gmail.com),那么它仍会向其他收件人发送电子邮件,但仍会向日志抛出错误。

在两种情况下,抛出的错误都是:

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'

问题:

  • 有什么方法可以捕捉到这个错误吗?我正在向用户展示flash[:notice],我想提一下发生了一些不好的事情
  • 如果我的BCC列表有5封电子邮件,而且实际上只发送了4封电子邮件,因为第5封是不存在的电子邮件,那么在完成所有操作后我可以获得多少实际发送的电子邮件?我想在flash[:notice]中显示该号码。我可以通过在迭代中实际调用传递方法而不是然后以批量发送来获得此数字但是如果没有发送一封电子邮件,我仍然不想增加计数。

2 个答案:

答案 0 :(得分:2)

config/environments/development.rb中添加或取消注释以下行,然后重新启动服务器。

# Don't care if the mailer can't send
config.action_mailer.raise_delivery_errors = false

我假设您在development

中检查production添加行的config/environments/production.rb

答案 1 :(得分:0)

如果我正在编写代码以在控制器中发送电子邮件,我可以像这样编写来处理我的应用程序中的救援  我在控制器中使用了这样的东西:

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