rails 3 + devise: как изменить метод рассылки для писем с подтверждением, чтобы добавить второй адрес электронной почты пользователя - PullRequest
15 голосов
/ 08 июня 2011

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

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

В качестве альтернативы, есть ли способ «отключить» процесс подтверждения электронной почты, но ТОЛЬКО при вводе определенного кода в поле регистрации?

Я знаю, как добавить еще одно поле в регистрационную форму устройства, но я не вижу, как / где изменить код устройства электронной почты, поэтому, когда электронное письмо с подтверждением отправляется на «адрес электронной почты», оно ТАКЖЕ переходит на backup_email "адрес (если есть, иногда пустой).


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

Я сделал rails generate mailer CustomerUserMailer и добавил

#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 почтовых шаблона ОТ views/devise/mailer в views/customer_user_mailer (в противном случае электронные письма пусты)

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

Ответы [ 4 ]

13 голосов
/ 05 февраля 2013

На всякий случай, если кто-то попадет сюда через 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

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

11 голосов
/ 08 июня 2011

Один из способов сделать это - переопределить действие 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"
9 голосов
/ 10 июля 2013

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

# 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!, вы можете добавлять или изменять любые заголовки писем, которые захотите.

0 голосов
/ 23 января 2014

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

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

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

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
...