2015-02-06 3 views
1

Я использую Rails 4.2, чтобы переопределить поле to для всех почтовых программ ActionMailer для определенной среды. В этом случае я хочу переопределить поле для всех почтовых программ, используемых в Staging. Моя цель заключается в том, чтобы промежуточная среда отправляла почту точно так же, как и производство, но чтобы сбрасывать ее все в тестовую папку.Переопределить поле в ActionMailer на основе среды

Я знаю, что есть услуги, которые помогают в этом, но моя цель - использовать мой производственный API для промежуточной доставки в качестве тщательного теста.

Я надеюсь, что смогу использовать микшину или что-то, чтобы сбросить поле to до того, как почерк погаснет.

ответ

3

Не уверен, какая версия Rails вы , но вы можете использовать новые перехватчики почты для этого.

Главное преимущество заключается в том, что он не загромождает классы ActionMailer напрямую.

http://guides.rubyonrails.org/action_mailer_basics.html#intercepting-emails

Копирование их пример:

class SandboxEmailInterceptor 
    def self.delivering_email(message) 
    message.to = ['[email protected]'] 
    end 
end 

конфигурации/Инициализаторы/sandbox_email_interceptor.rb:

ActionMailer::Base.register_interceptor(SandboxEmailInterceptor) if Rails.env.staging? 
+0

Я использую Rails 4.2, и это именно то, что я ищу ! –

1

Простейшим способом было бы проверить, какая среда работает, и соответственно установить поле to. Например, простой сброс пароля почтовой программы может выглядеть примерно так:

class UserMailer < ActionMailer::Base 
    default from: "[email protected]" 

    def reset_password(user_id) 
    @user = User.find(user_id) 
    @url = reset_password_users_url(token: @user.password_reset_token) 

    mail(to: @user.email, subject: '[Example] Please reset your password') 
    end 
end 

Теперь для проверки промежуточной среды и пути всех этих писем к [email protected]:

class UserMailer < ActionMailer::Base 
    default from: "[email protected]" 

    def reset_password(user_id) 
    @user = User.find(user_id) 
    @url = reset_password_users_url(token: @user.password_reset_token) 

    to = Rails.env.staging? ? '[email protected]' : @user.email 
    mail(to: to, subject: '[Example] Please reset your password') 
    end 
end