2011-02-09 17 views
26

Piszę mały program w języku Ruby, który będzie pobierał rekordy z bazy danych i wysyłał e-mail HTML codziennie. Próbuję użyć ActionMailer 3.0.3 do tego, ale mam problemy z uruchamianiem. Wszystkie poszukiwania, które do tej pory zrobiłem przy użyciu ActionMailera poza Railsami, dotyczą wersji wcześniejszych niż 3. Czy ktoś mógłby wskazać mi właściwy kierunek, gdzie znaleźć zasoby, jak to zrobić? Oto, gdzie jestem do tej pory w moim pliku mailer:ActionMailer 3 bez Railsów

# 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 

Zdecydowanie utknąłem w miejscu, w którym mogę wyrazić swoje poglądy. Każda próba, którą podjąłem, aby poinformować ActionMailer, gdzie moje szablony są nieudane.

Chyba powinienem również zapytać, czy jest inny sposób realizacji tego programu. Zasadniczo robię wszystko od zera w tym momencie. Oczywiście to, co sprawia, że ​​Rails jest niesamowity, to konwencja, więc próbuje wykorzystać części Railsów na własną rękę, stratę czasu? Czy istnieje sposób na uzyskanie środowiska podobnego do Railsów bez tworzenia pełnej wersji aplikacji Rails?

Odpowiedz

44

Po poważnym debugowaniu, znalazłem sposób konfiguracji.

plik 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 

plik Mailer/daily_email.html.erb

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

plik Mailer/daily_email.text.erb

this is a text email 

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

Ładne pytanie! Pomogło mi to zrozumieć nieco więcej jak Rails 3 działa :)

+0

Dzięki ... że pomogło. Tak więc, gdzie utknąłem dalej, jest miejsce, w którym mogę wyrazić swoje poglądy. Wiem, że gdybym tworzył aplikację Railsów, to żyliby w 'app/views', ale nie mam pojęcia, gdzie powinienem umieścić moje poglądy. Na razie mój widok wygląda następująco: 'lib/bug_mailer/daily_email.html.erb'. Jakieś pomysły? –

+0

Ha, stackoverflow ma wszystkie odpowiedzi :) http://stackoverflow.com/questions/741989/actionmailer-and-ramaze – Augusto

+0

To był właściwie pierwszy post, na który patrzyłem podczas badania ActionMailer'a poza Railsami. Postępowałem zgodnie ze wspomnianą tam metodą, ale nie miałem wyjścia. Oto, jak mam teraz wszystko skonfigurowane. Mailer jest tutaj: 'bugs_email/lib/bug_mailer.rb'. Widok jest tutaj: 'bugs_email/lib/bug_mailer/daily_email.html.erb'. Więc jeśli czegoś nie brakuje (co jest możliwe!) Jestem ustawiony jak ten przykład. –

2

Zajęło mi to trochę czasu, aby to zadziałało (nie). Rails 4. Podejrzewam, że to dlatego, że mam ": require => false" całym moim Gemfile, ale potrzebowałem dodać następujące aby to działało:

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

Bez powyższego kodu, trzymałem coraz NoMethodError z undefined method 'assign_controller'.

Po tym, skonfigurowany ActionMailer następująco:

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 
] 

Szablony iść lib/<GEM_NAME>/views/mailers/<MAILER_CLASS_NAME>/<MAILER_ACTION_NAME>.erb (MAILER_ACTION_NAME jest publiczna metoda instancja klasy mailera że dzwonisz, aby wysłać e-mail).

Wreszcie, nie zapomnij umieścić to w swoim spec_helper:

ActionMailer::Base.delivery_method = :test