rails 3 + devise: как изменить метод mailer для подтверждения писем, чтобы добавить второй адрес электронной почты пользователя

Справочная информация: в нашем приложении у нас часто есть торговый представитель, который делает настройку для нашего клиента с помощью компьютера продавца (часто клиенты не имеют доступа к своей электронной почте во время их настройки). Поэтому мы думаем добавить поле в регистрационную форму devise для адреса электронной почты торгового представителя и иметь ссылку подтверждения также перейти на этот адрес электронной почты.

вопрос: есть ли способ сообщить devise bcc (или cc) первоначальное подтверждение электронная почта (только первоначальное подтверждение по электронной почте) на (необязательный) адрес электронной почты "backup_email", который также указан в новой форме регистрации пользователя?

кроме того, есть ли способ "отключить" процесс подтверждения электронной почты, но только когда в поле регистрации введен определенный код?

Я знаю, как добавить другое поле в регистрационную форму devise, но я не вижу, как / где изменить код devise mailer, поэтому, когда подтверждение по электронной почте отправляется на адрес "email", он также переходит на адрес" backup_email " (если есть, иногда он пуст).


Спасибо Джонни Грасс!

я rails generate mailer CustomerUserMailer и добавил:--13-->

#config/initializers/devise.rb
config.mailer = "CustomUserMailer"

мой пользовательский почтовый ящик выглядит так:

# app/mailers/customer_user_mailer.rb
class CustomUserMailer < Devise::Mailer
  def headers_for(action)
    headers = {
      :subject       => translate(devise_mapping, action),
      :from          => mailer_sender(devise_mapping),
      :to            => resource.email,
      :cc            => resource.backup_user_email(action),
      :template_path => template_paths
    }
  end
end

затем я переместил шаблоны 3 mailer из views/devise/mailer to views/customer_user_mailer (в противном случае сообщения будут пустыми)

затем я добавил метод к моему User модель backup_user_email() что возвращает 'резервное копирование' электронной почты адрес (если есть) на основе данных в записи пользователя и действия. Единственный "трюк" заключается в том, что при тестировании action это не action == "confirmation_instructions" это action == :confirmation_instructions.

4 ответов


один из способов сделать это-переопределить headers_for действий Devise:: Mailer

class MyMailer < Devise::Mailer
  backup_email = "..."
  def headers_for(action)
    headers = {
     :subject       => translate(devise_mapping, action),
     :from          => mailer_sender(devise_mapping),
     :to            => resource.email,
     :bcc           => backup_email
     :template_path => template_paths
  }
end

и скажите devise использовать ваш почтовый ящик:

#config/initializers/devise.rb
config.mailer = "MyMailer"

на всякий случай, если кто - то попал сюда через Google-в последней версии Devise, header_for принимает два параметра. Таким образом, ваш код должен быть:

class MyMailer < Devise::Mailer
  backup_email = "..."
  def headers_for(action, opts)
    headers = {
      :subject       => subject_for(action),
      :to            => resource.email,
      :from          => mailer_sender(devise_mapping),
      :bcc           => backup_email,
      :reply_to      => mailer_reply_to(devise_mapping),
      :template_path => template_paths,
      :template_name => action
    }.merge(opts)
  end
end

это может быть не лучший способ сделать это, но, по крайней мере, это позволяет избежать ошибок.


Вы можете использовать этот код, который намного чище и проще

# app/mailers/my_mailer.rb
class MyMailer < Devise::Mailer
  def headers_for(action, opts)
    backup_email = "..."
    super.merge!({bcc: backup_email})
  end
end

# config/initializers/devise.rb
...
config.mailer = MyMailer
...

с хэшем, переданным в merge! метод вы можете добавлять или изменять любые заголовки электронной почты, которые вы хотите.


ваш ответ работал для меня. Огромное спасибо.

У меня был сценарий, в котором я должен был настроить devise для: 1) отправить электронную почту подтверждения регистрации в BCC на различные электронные письма, основанные на среде. 2) электронные письма должны быть добавлены в BCC только для писем с подтверждением регистрации.

для этого я сравнил значения аргумента action, как показано в фрагменте кода ниже:

def headers_for(action)
  if action == :confirmation_instructions
    if Rails.env.production?
        recipient_email = "user1@example.com"
    else
        recipient_email = "user2@example.com"
    end

    headers = {
      :subject => translate(devise_mapping, action),
      :from => mailer_sender(devise_mapping),
      :to => resource.email,
      :bcc => recipient_email,
      :template_path => template_paths
    }
  else
    super
  end
end