2011-02-25 13 views
7

Probablemente me falta algo obvio, pero tengo un logotipo que me gustaría incluir en todos los correos electrónicos que envío desde mi aplicación. Tengo un diseño maestro que estoy usando para todos los anuncios publicitarios. Supongo que hay una manera de mantenerlo SECO y no tener que agregar la línea de código para adjuntar el archivo en cada método de envío de correo. ¿Puede alguien señalarme en la dirección correcta o corregir mi línea de pensamiento?Rieles: utilice el mismo archivo adjunto para todos los correos electrónicos que utilizan el diseño

Gracias!

Respuesta

1

en el archivo de diseño que utiliza su programa de correo u puede añadir el siguiente

<%= image_tag('logo.png') %> 

Estoy asumiendo que el correo que se envía es html o de varias partes.

También deberá realizar cambios en los archivos de entorno. ActionMailer no obtiene una base_url predeterminada. Por ejemplo, en entornos/development.rb añadí la siguiente

config.action_mailer.default_url_options = { :host => "localhost:3000" } 

Si desea hacerlo de una manera seca (y como archivo adjunto) tal vez usted podría hacer algo como

class MyMailer < ActionMailer::Base 
    default :attachment => File.read(File.join(Rails.root,'public','images','logo.png')) 
end 
+1

no si quiere usar archivos adjuntos en línea ... también necesita tener una url base configurada para que esto funcione también ... – sethvargo

+0

oh sí, se me olvidó mencionar eso. He editado mi respuesta en base a tu comentario. – Shiv

+1

Gracias, @Shiv. Desafortunadamente, realmente no responde mi pregunta (que quizás no estaba clara). Donde estoy teniendo problemas para no poder mantener las cosas SECAS está en las clases de correo, donde tengo que llamar a 'attachments.inline ['logo_small.png'] = File.read ('public/images/logo_small. png ') 'en cada método de envío. ¿Tiene sentido? Quiero una manera DRY para agregar los archivos adjuntos. – dbwinger

2

Pirateé un poco de algo, no es ideal, pero funciona.

Si utiliza

default "SOMEHEADER", Proc.new { set_layout } 

y luego definir set_layout

def set_layout 
    attachments.inline["logo.png"] = File.read("logopath.png") 
    attachments.inline["footer.jpg"] = File.read("footerpath.png") 
    "SOME HEADER VALUE" 
end 

Entonces porque set_layout es llamado para establecer la cabecera, sino que también añade los archivos adjuntos en línea. Básicamente, crea una devolución de llamada para agregar archivos adjuntos.

Sería preferible un sistema de devolución de llamada real en ActionMailer, pero esto también funciona.

Pensé que lo compartiría porque estaba buscando esta respuesta a esta pregunta hoy.

7

devoluciones de llamada utilizando before_filter y after_filter serán apoyados en un futuro rieles de lanzamiento:

http://github.com/rails/rails/commit/4f28c4fc9a51bbab76d5dcde033c47aa6711339b

Dado que se implementan utilizando AbstractController :: devoluciones de llamada, puede hacer lo siguiente para imitar la funcionalidad que será presente en ActionMailer :: Base vez los carriles 4 se libera:

class YourMailer < ActionMailer::Base 
    if self.included_modules.include?(AbstractController::Callbacks) 
    raise "You've already included AbstractController::Callbacks, remove this line." 
    else 
    include AbstractController::Callbacks 
    end 

    before_filter :add_inline_attachments! 

    private 
    def add_inline_attachments! 
    attachments.inline["footer.jpg"] = File.read('/path/to/filename.jpg') 
    end 
end 

Esto incluye el módulo que será utilizado en una futura versión de los carriles, por lo que los ganchos de devolución de llamada disponibles para usted será el mismo para asegurar la compatibilidad futura. El código aumentará cuando intente actualizar a una versión de Rails que ya incluye AbstractController :: Callbacks, por lo que se le recordará que elimine la lógica condicional.

+0

Gracias por este consejo. Creo que es genial poder reutilizar 'AbstractController :: Callbacks' aquí, ¡no tenía idea de que se pudiera hacer de esta manera! Al resolver mi problema para obtener un archivo adjunto en línea en cada correo, puedo configurar todo a través de un módulo dedicado que incluyo en mi 'ApplicationMailer'. – rchampourlier

-1

sé lo solicitado sobre adjuntar imágenes en línea, pero aquí es un enfoque diferente que logra lo mismo con menos complejidad ..

Usando inline base64 encoded images en el diseño html - sin los accesorios necesarios!

Básicamente, sólo cambia el src="..." la imagen del logotipo para el formato de:

<img alt="example logo" 
    width="32px" 
    height="32px" 
    src="data:image/png;base64,iVBORw0KGgoAAA....."/> 

utilizo la herramienta en línea codificador/decodificador de base 64 en http://www.base64-image.net para generar la completa <img /> etiqueta

Este enfoque tiene algunos beneficios:
- sin código de conexión, lo que hace que el código del servidor back-end cl eaner y fácil de leer
- ningún aumento en el tamaño de correo electrónico - archivos adjuntos de imagen en línea se convierten en base 64 de todos modos lo que este enfoque no hace que la carga útil de correo electrónico cualquier grande
- Es ampliamente apoyada - si el cliente de correo electrónico receptora está mostrando html, es pretty likely it also supports this method

Cuestiones relacionadas