ruby - rails generate email
ActionMailer 3 sin rieles (2)
Estoy escribiendo un pequeño programa de Ruby que extraerá registros de una base de datos y enviará un correo electrónico HTML todos los días. Intento utilizar ActionMailer 3.0.3 para esto, pero me estoy quedando sin problemas. Toda la búsqueda que hice hasta ahora usando ActionMailer fuera de Rails se aplica a versiones anteriores a la versión 3. ¿Podría alguien señalarme en la dirección correcta de 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 hice para decirle a ActionMailer dónde han fallado mis plantillas.
Creo que también debería preguntar si hay una manera diferente de lograr este programa. Básicamente, estoy haciendo todo desde cero en este punto. Obviamente, lo que hace que Rails sea increíble es su convención, ¿entonces está tratando de usar partes de Rails por su propia cuenta como una pérdida de tiempo? ¿Hay alguna manera de obtener el entorno similar a Rails sin crear una aplicación de Rails en toda regla?
Después de una depuración seria, encontré cómo configurarlo.
archivo 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.text.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 :)
Me tomó un tiempo lograr que esto funcione en (no) Rails 4. Sospecho que es solo porque tengo '': require => false'' en todo mi Gemfile, pero necesitaba agregar lo siguiente para que funcione:
require ''action_view/record_identifier''
require ''action_view/helpers''
require ''action_mailer''
Sin el código anterior, seguí obteniendo un NoMethodError con el 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 a quien llama para enviar el correo electrónico).
Por último, no olvides poner esto en tu spec_helper
:
ActionMailer::Base.delivery_method = :test