在ActionMailer中禁用某些电子邮件

时间:2012-08-14 22:02:22

标签: ruby-on-rails actionmailer environment

我想在开发和测试/登台服务器上关闭某些电子邮件,但要继续将它们发送到生产环境中。我目前所做的是将这些管理邮件的默认“到”地址设置为空白:

  default :to => Rails.env.production? ? "admin-list@sharethevisit.com" : ""

但是,当我测试应该发送的用户邮件时,这会将堆栈跟踪放入我的开发日志中。

是否有更有效的方法可以根据当前环境禁用某些电子邮件?我尝试检查函数本身,但不理想,因为我必须更改每个函数,加上它实际上不起作用...它只是无法在呈现电子邮件和创建不同的堆栈跟踪之前设置所需的@account变量

  def user_registered_notify_email(account)
    if Rails.env.production?
      @account = account
      mail(:subject => "New user registered: #{@account.full_name}")
    end
  end

3 个答案:

答案 0 :(得分:0)

我不记得我在哪里发现这一点可以归功于作者,但这就是我在开发模式下重定向电子邮件的方式。在RAILS_ROOT / config / initializers中为此创建一个新文件。 DEFAULT_DEV_EMAIL_OVERRIDE在我们的主站点配置中定义了其他静态值。

if Rails.env.development?
  if Rails.version =~ /^2\./
    class ActionMailer::Base
      def create_mail_with_overriding_recipients
        mail = create_mail_without_overriding_recipients
        mail.to = DEFAULT_DEV_EMAIL_OVERRIDE
        mail
      end
      alias_method_chain :create_mail, :overriding_recipients
    end
  elsif Rails.version =~ /^3\./
    if Rails.env.development?
      class OverrideMailRecipient
        def self.delivering_email(mail)
          mail.to = DEFAULT_DEV_EMAIL_OVERRIDE
        end
      end
      ActionMailer::Base.register_interceptor(OverrideMailRecipient)
    end
  end
end

答案 1 :(得分:0)

我通常使用此处所述的邮件拦截器:http://asciicasts.com/episodes/206-action-mailer-in-rails-3

答案 2 :(得分:0)

考虑使用拦截器将Mail::Message#perform_deliveries设置为false

class NeverDeliverInterceptor
  def self.delivering_email(message)
    message.perform_deliveries = false
  end
end

if !Rails.env.production?
  ActionMailer::Base.register_interceptor(NeverDeliverInterceptor)
end

See API doc来源&其他用法。