1

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

  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
4

3 回答 3

0

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

于 2012-08-14T23:36:11.903 回答
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
于 2012-08-14T22:06:16.620 回答
0

考虑使用拦截器设置Mail::Message#perform_deliveriesfalse

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

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

有关源代码和其他用法,请参阅 API 文档

于 2016-06-26T19:35:27.777 回答