2011-06-07 13 views
15

Antecedentes: En nuestra aplicación, a menudo tenemos un representante de ventas para configurar a nuestro cliente usando la computadora del vendedor (a menudo clientes no tenemos acceso a su correo electrónico en el momento en que los configuramos). Así que estamos pensando en agregar un campo al formulario de registro de la dirección de correo electrónico del representante de ventas y hacer que el enlace de confirmación TAMBIÉN vaya a esa dirección de correo electrónico.rails 3 + idear: cómo modificar el método de envío de correos electrónicos de confirmación para agregar la segunda dirección de correo electrónico del usuario

Pregunta: ¿Hay una manera de decirle a diseñar a CCO (o cc) el correo electrónico de confirmación inicial (sólo el correo electrónico de confirmación inicial) a una (opcional) "backup_email" dirección de correo electrónico que también se proporciona en el nuevo formulario de registro de usuario?

Por otra parte, ¿hay alguna manera al proceso de correo electrónico de confirmación 'desactivar' pero sólo cuando se introduce un cierto código en el campo de registro?

Sé cómo agregar otro campo al formulario de registro de diseño, pero no veo cómo/dónde modificar el código del remitente, así que cuando se envía un correo electrónico de confirmación a la dirección de "correo electrónico" TAMBIÉN va al la dirección "backup_email" (si corresponde, a veces está en blanco).


Gracias a Johnny Grass!

lo hice rails generate mailer CustomerUserMailer y ha añadido

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

mi programa de correo personalizada se parece a:

# 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 

Luego se trasladaron las 3 plantillas Mailer DE views/devise/mailer a views/customer_user_mailer (de otro modo los mensajes de correo electrónico están vacíos)

Luego agregué un método a mi modelo User llamado backup_user_email() que devuelve la dirección de correo electrónico de "copia de seguridad" (si corresponde) en función de los datos en el registro del usuario y la acción. El único "truco" es que al probar el action no es action == "confirmation_instructions" es action == :confirmation_instructions.

Respuesta

11

Una forma de hacerlo sería para anular la acción headers_for en 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 

Y decirle a diseñar para utilizar su programa de correo:

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

Una pregunta ... ¿dónde puedo guardar el archivo nuevo? Esa es una información muy útil. El correo electrónico de respaldo proviene de los datos en el formulario de registro de cada usuario, con suerte podemos usar algo como: bcc => resource.backup_email. – jpwynn

+1

En realidad, tendría que hacer un anuncio publicitario, seguir [esta guía] (http://guides.rubyonrails.org/action_mailer_basics.html) pero convertirlo en una subclase de 'Devise :: Mailer'. – David

+0

GRACIAS PERFECTAMENTE. Documenté los cambios al final de mi pregunta original, ya que también necesitaba mover las plantillas erb de mailer a la nueva vista – jpwynn

13

Sólo en caso de que alguien llegó aquí a través de Google - en la última versión de Devise, header_for toma dos parámetros. Así que su código tendría que ser:

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 

que podría no ser la mejor manera de hacerlo, pero al menos evita errores.

+0

Cuando hago esto termino con correos electrónicos sin cuerpo. Todos los encabezados funcionan bien. No veo cómo se define "ruta de la plantilla": ¿es posible que porque estoy usando vistas generadas no funcionen? – Calciphus

+0

No importa, resulta que si cambio: template_path a: ': template_path =>" devise/mailer "' Puedo usar las plantillas que ya creé. – Calciphus

9

Usted puede utilizar este código, que es mucho más limpio y más sencillo

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

Con Hash pasado a merge! método puede agregar o modificar las cabeceras de correo electrónico que le gustaría.

0

Tu respuesta ha funcionado para mí. Muchas gracias.

Tenía un escenario en el que se me requería personalizar el diseño para: 1) enviar correos electrónicos de confirmación de suscripción en BCC a diferentes correos electrónicos basados ​​en el entorno. 2) los correos electrónicos deben agregarse a BCC solo para los correos de confirmación de suscripción.

Para ello, comparé valores de argumento de la acción, como se muestra en el siguiente fragmento de código:

def headers_for(action) 
    if action == :confirmation_instructions 
    if Rails.env.production? 
     recipient_email = "[email protected]" 
    else 
     recipient_email = "[email protected]" 
    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 
Cuestiones relacionadas