ActionMailer 3 sin carriles


Estoy escribiendo un pequeño programa Ruby que extraerá registros de una base de datos y enviará un correo electrónico HTML diariamente. Estoy tratando de usar ActionMailer 3.0.3 para esto, pero me estoy ejecutando en los problemas. Toda la búsqueda que he hecho hasta ahora sobre el uso de ActionMailer fuera de Rails se aplica a las versiones anteriores a la versión 3. ¿Podría alguien indicarme en la dirección correcta dónde encontrar recursos sobre cómo hacer esto? Aquí es donde estoy hasta ahora en mi archivo de correo:

# lib/bug_mailer.rb
require 'action_mailer'

ActionMailer::Base.delivery_method = :file

class BugMailer < ActionMailer::Base
  def daily_email
    mail(
            :to      => "[email protected]",
            :from    => "[email protected]",
            :subject => "testing mail"
    )
  end
end

BugMailer.daily_email.deliver

Definitivamente estoy atascado en dónde poner mis puntos de vista. Cada intento que he hecho para decirle a ActionMailer dónde están mis plantillas ha fallado.

Supongo que también debería preguntar si hay una manera diferente de llevar a cabo este programa. Básicamente, estoy haciendo todo desde cero en este punto. Obviamente, lo que hace que Rails sea impresionante es su convención, por lo que tratar de usar partes de Rails por su cuenta es una pérdida de tiempo? ¿Hay alguna manera de obtener el entorno similar a Rails sin crear una aplicación Rails completa?

Author: Spencer R, 2011-02-10

2 answers

Después de una depuración seria, encontré cómo configurarlo.

File mailer.rb

require 'action_mailer'

ActionMailer::Base.raise_delivery_errors = true
ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.smtp_settings = {
   :address   => "smtp.gmail.com",
   :port      => 587,
   :domain    => "domain.com.ar",
   :authentication => :plain,
   :user_name      => "[email protected]",
   :password       => "passw0rd",
   :enable_starttls_auto => true
  }
ActionMailer::Base.view_paths= File.dirname(__FILE__)

class Mailer < ActionMailer::Base

  def daily_email
    @var = "var"

    mail(   :to      => "[email protected]",
            :from    => "[email protected]",
            :subject => "testing mail") do |format|
                format.text
                format.html
    end
  end
end

email = Mailer.daily_email
puts email
email.deliver

File mailer/daily_email.HTML.erb

<p>this is an html email</p>
<p> and this is a variable <%= @var %> </p>

File mailer/daily_email.texto.erb

this is a text email

and this is a variable <%= @var %>

Buena pregunta! Me ayudó a entender un poco más cómo funciona Rails 3:)

 45
Author: Augusto,
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
2011-02-12 12:05:44

Me llevó un tiempo hacer que esto funcionara en (non-)Rails 4. Sospecho que es solo porque tengo': require => false ' en todo mi Gemfile, pero necesitaba agregar lo siguiente para que funcionara:

require 'action_view/record_identifier'
require 'action_view/helpers'
require 'action_mailer'

Sin el código anterior, seguí obteniendo un NoMethodError con undefined method 'assign_controller'.

Después de eso, configuré ActionMailer de la siguiente manera:

ActionMailer::Base.smtp_settings = {
  address: 'localhost', port: '25', authentication: :plain
}
ActionMailer::Base.default from: '[email protected]'
ActionMailer::Base.raise_delivery_errors = true
ActionMailer::Base.logger = Logger.new(STDOUT)
ActionMailer::Base.logger.level = Logger::DEBUG
ActionMailer::Base.view_paths = [
  File.join(File.expand_path("../../", __FILE__), 'views', 'mailers')
  # Note that this is an Array
]

Las plantillas van en lib/<GEM_NAME>/views/mailers/<MAILER_CLASS_NAME>/<MAILER_ACTION_NAME>.erb (MAILER_ACTION_NAME es el método de instancia pública de su clase de correo al que llama para enviar la correo).

Por último, no olvides poner esto en tu spec_helper:

ActionMailer::Base.delivery_method = :test
 2
Author: Isaac Betesh,
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
2013-10-31 16:37:34