¿Cómo puedo enviar correo con rails sin plantilla?


En mi proyecto Rails 3, quiero enviar algunos correos electrónicos de notificación simples. No necesito hacer una plantilla para ellos o hacer ninguna lógica. Sólo quiero despedirlos de varios lugares en el sistema.

Si estuviera haciendo esto en un script ruby arbitrario usaría pony. Sin embargo, me gustaría seguir utilizando las facilidades y la configuración de rails mail, para obtener la misma fiabilidad y configuración que tengo para el resto del correo en mi sistema.

¿Cuál es el más simple ¿cómo se hace esto? Idealmente habría algún método como

ActionMailer.send(:to => '[email protected]', :subject =>"the subject", :body =>"this is the body")
Author: John Bachir, 2011-02-07

4 answers

La forma más sencilla de enviar correo en rails 3 sin una plantilla es llamar al método mail de ActionMailer::Base directamente seguido por el método deliver,

Por ejemplo, lo siguiente enviaría un correo electrónico de texto sin formato:

ActionMailer::Base.mail(from: "[email protected]", to: "[email protected]", subject: "test", body: "test").deliver

Http://api.rubyonrails.org/classes/ActionMailer/Base.html#method-i-mail le da todas las opciones de encabezado y también ideas sobre cómo enviar un correo electrónico multiparte/alternativo con partes text/plain y text/html directamente.

 95
Author: KMG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-24 20:56:56

Aquí es un pequeño ejemplo de Rails Guides que usa el método render. No lo probé, pero si funciona como render en cotrollers, entonces puedes usar:

render :text => "Your message"

O

render :text => my_message

Donde my_message es un parámetro.

Simplemente puedes envolverlo en un método al que puedes llamar desde cualquier lugar que desees.

Rails actualizado 3.2.8

En esta versión de Rails tuve que hacerlo así:

def raw_email( email, subject, body )
  mail(
    :to => email,
    :subject => subject
  ) do |format|
    format.text { render :text => body }
  end
end
 10
Author: klew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-05 17:38:29

Puedes probar algo como esto:

class Notifier < ActionMailer::Base
  def send_simple_message(options)
    mail(options.except(:body)) do |format|
      format.text { render :text => options[:body] }
    end.deliver
  end
end
 7
Author: John Douthat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-26 15:50:02

Los usuarios de Rails 5 pueden encontrar que la respuesta aceptada (usando format.text {...}) no funciona; al menos estaba recibiendo una excepción porque Rails estaba buscando una vista.

Resulta que hay una sección en la Guía de Rails llamada Envío de correos electrónicos sin Representación de plantillas y todo lo que hay que hacer es proporcionar :content_type y :body a mail(). Por ejemplo:

class UserMailer < ApplicationMailer
  def welcome_email
    mail(to: params[:user].email,
         body: params[:email_body],
         content_type: "text/html",
         subject: "Already rendered!")
  end
end
 1
Author: arooaroo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-10 20:43:31