2010-09-06 18 views
7

Uso un diseño para todos mis correos electrónicos en mi modelo Notificador (más de 20 correos electrónicos) ... sin embargo, a veces solo quiero enviar un correo electrónico de texto plano sin diseño ni html. Parece que no soy capaz de descubrir cómo? Si trato de enviar un correo electrónico de texto sin formato, sigo recibiendo el diseño y todo el HTML del correo electrónico.enrutadores de rieles con diferentes diseños

Estoy usando Rails 2.3.8.

Leí acerca de este parche de mono aquí ... pero parecía indicar que una nueva versión de los rieles había terminado con esto? Y realmente no quiero parche de mono si puedo evitar uno.

Rails - setting multiple layouts for a multipart email with mailer templates

layout "email" # use email.text.(html|plain).erb as the layout 


    def welcome_email(property) 
    subject 'New Signup' 
    recipients property.email 
    from  '[email protected]' 
    body  :property => property 
    content_type "text/html" 
    end 

    def send_inquiry(inquire) 
    subject "#{inquire.the_subject}" 
    recipients inquire.ob.email 
    from  "Test on behalf of #{inquire.name} <#{inquire.email}>" 
    body  :inquire => inquire 
    content_type "text/plain" 

    end 

También tienen 2 archivos.

email.text.html.erb 
email.text.plain.erb 

Siempre utiliza text.html.erb ... incluso si el content_type es "text/plain"

Respuesta

5

bien, no estoy seguro si esto funciona, pero parece que la content_type defecto es text/plain , por lo que solo necesitaría establecer el tipo de contenido si desea algo diferente de texto/simple.

Prueba esto:

def send_inquiry(inquire) 
    subject "#{inquire.the_subject}" 
    recipients inquire.ob.email 
    from  "Test on behalf of #{inquire.name} <#{inquire.email}>" 
    body  :inquire => inquire 
end 

todavía pienso que usted debe considerar esto:

layout "email", :except => [:send_inquiry] 

me gustaría utilizar lo anterior debido a que el correo electrónico de texto sin formato no parecen tener un 'diseño', sólo se el contenido real que desea enviar

+0

Probablemente sea una solución rápida, pero aún me gustaría si pudiera descubrir por qué la funcionalidad supuestamente integrada no funciona. IE, cuando declaro un content_type se supone que busca el archivo apropiado? – holden

+0

Actualicé mi respuesta ... no estoy seguro, pero vale la pena intentarlo. Buena suerte. – Mischa

9

editar: Me di cuenta de que los diseños siguen un esquema de nombres diferente para las plantillas de correo electrónico. Sólo cambiar el nombre de la siguiente manera:

layout.text.html.erb => layout.html.erb 
layout.text.plain.erb => layout.text.erb 

también cometí el error de definir manualmente las partes, si se utiliza este:

part :content_type => 'text/plain', 
    :body => render_message('my_template') 

Entonces Carriles no puede determinar la content_type por su parte y que asume es HTML

¡Después de cambiar esas dos cosas funcionó para mí!

respuesta original sigue ..


he luchado con esta pregunta muchas veces en el pasado, por lo general terminan con algún tipo de solución rápida y sucia no seco. Siempre pensé que era el único con este problema porque Google no arrojó exactamente nada útil sobre el tema.

Esta vez decidí excavar en Rails para averiguarlo, pero hasta ahora sin mucho éxito, pero tal vez mis hallazgos ayudarán a alguien más a resolver esto.

Lo que encontré fue que en ActionMailer :: Base el método #render_message tiene la tarea de determinar el content_type adecuado y debe asignarlo a @current_template_content_type. #default_template_format luego devuelve el tipo de mime adecuado para el diseño o, si @current_template_content_type no está establecido, se establecerá de manera predeterminada en html.

Esto es lo que ActionMailer :: Base # render_message parece que en mi aplicación (2.3.5)

def render_message(method_name, body) 
    if method_name.respond_to?(:content_type) 
     @current_template_content_type = method_name.content_type 
    end 
    render :file => method_name, :body => body 
    ensure 
    @current_template_content_type = nil 
    end 

El problema es que method_name parece ser una cadena (el nombre de la vista local, en mi case "new_password.text.html") y las cadenas, por supuesto, no responden a #content_type, lo que significa que @current_template_content_type siempre permanecerá nulo, por lo que el #default_template_format siempre tendrá como valor predeterminado: html.

No mucho más cerca de una solución real, lo sé. Las partes internas de ActionMailer son demasiado opacas para mí.

+0

Hm, interesante. Contrariamente a lo que dices, de acuerdo con los documentos de la API, el tipo_contenido predeterminado es texto/simple ... – Mischa

+0

Eso tendría más sentido para mí también, pero busca #default_template_format en ActionMailer :: Base, ese es el culpable en la medida de lo posible como puedo entrenar Seguiré buscando y actualizando esto a medida que encuentre más. –

+0

Creo que lo he descubierto, más o menos. Mi problema era que estaba definiendo las partes manualmente con "part: body => render_message()", si lo hace, ActionMailer ignora content_type y simplemente se configura como html, como describí anteriormente. Pero si dejas que Rails determine automágicamente las partes, render_message obtiene un ActionView :: ReloadableTemplate en lugar de una cadena pasada como "method_name" (hablar sobre nombres de variables engañosas) y la detección de content_type funciona. –

Cuestiones relacionadas