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