2011-02-09 20 views
26

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:ActionMailer 3 sin rieles

# 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.

Supongo que también debería preguntar si hay una forma 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?

Respuesta

44

Después de una seria depuración, 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 

archivo de bolsas/daily_email.html.erb

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

archivo de bolsas/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 :)

+0

Gracias ... que ayudó. Entonces, donde estoy atascado a continuación es dónde poner mis puntos de vista. Sé que, si estuviera creando una aplicación de Rails, vivirían en 'app/views', pero no tengo idea de dónde debería poner mis puntos de vista. Por ahora mi punto de vista es el siguiente: 'lib/bug_mailer/daily_email.html.erb'. ¿Algunas ideas? –

+0

Ha, stackoverflow tiene todas las respuestas :) http://stackoverflow.com/questions/741989/actionmailer-and-ramaze – Augusto

+0

Esa fue en realidad la primera publicación que investigué en ActionMailer fuera de Rails. Seguí el método mencionado allí, pero no voy. Así es como tengo todo configurado actualmente. El programa de envío está aquí: 'bugs_email/lib/bug_mailer.rb'. La vista está aquí: 'bugs_email/lib/bug_mailer/daily_email.html.erb'. Entonces a menos que me esté perdiendo algo (¡que es posible!) Estoy configurado como ese ejemplo. –

2

Me tomó un tiempo hacer que esto funcione en (no) Rails 4. Sospecho que es solo porque tengo ': require => false' todo mi Gemfile, pero que tenía que añadir la siguiente para que funcione:

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

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

Después de eso, he configurado 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 anuncio publicitario que llame a enviar el correo electrónico).

Por último, no se olvide de poner esto en su spec_helper:

ActionMailer::Base.delivery_method = :test