2011-02-09 5 views
26

Я пишу небольшую программу Ruby, которая будет извлекать записи из базы данных и ежедневно отправлять HTML-письмо. Я пытаюсь использовать ActionMailer 3.0.3 для этого, но у меня есть проблемы. Все поиски, которые я делал до сих пор при использовании ActionMailer за пределами Rails, относятся к версиям до версии 3. Может ли кто-нибудь указать мне в правильном направлении, где найти ресурсы о том, как это сделать? Вот где я до сих пор находится в моем файле почтовой рассылки:ActionMailer 3 без Rails

# 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 

Я определенно застрял на том, где разместить свои взгляды. Каждая попытка, которую я сделал, чтобы сообщить ActionMailer, где мои шаблоны не удалось.

Я думаю, я также должен спросить, есть ли другой способ выполнить эту программу. В принципе, я делаю все с нуля на этом этапе. Очевидно, что делает Rails удивительным - это соглашение, поэтому пытается использовать части Rails сами по себе пустую трату времени? Есть ли способ получить Rails-подобную среду без создания полноценного Rails-приложения?

ответ

44

После некоторой серьезной отладки я нашел, как ее настроить.

файл 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 

файл почтовик/daily_email.html.erb

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

файл почтовик/daily_email.text.erb

this is a text email 

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

Хороший вопрос! Это помогло мне понять, как работает Rails 3 :)

+0

Спасибо ... что помогло. Итак, где я застрял, вот где поставить мои взгляды. Я знаю, что, если бы я создавал приложение Rails, они бы жили в 'app/views', но я понятия не имею, куда мне поместить свои взгляды. На данный момент мой взгляд выглядит следующим образом: 'lib/bug_mailer/daily_email.html.erb'. Есть идеи? –

+0

Ha, stackoverflow имеет все ответы :) http://stackoverflow.com/questions/741989/actionmailer-and-ramaze – Augusto

+0

Это был самый первый пост, который я изучил при исследовании ActionMailer за пределами Rails. Я следовал методу, упомянутому там, но не ушел. Вот как у меня все настроено в настоящее время. Почтовая программа находится здесь: 'bugs_email/lib/bug_mailer.rb'. Представление здесь: 'bugs_email/lib/bug_mailer/daily_email.html.erb'. Поэтому, если мне не хватает чего-то (что возможно!) Я настроен таким образом. –

2

Мне потребовалось некоторое время, чтобы заставить это работать в (не) Rails 4. Я подозреваю, что это просто потому, что у меня есть: require => false ' все мое Gemfile, но мне нужно добавить следующее, чтобы сделать его работу:

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

Без кода выше, я продолжал получать NoMethodError с undefined method 'assign_controller'.

После этого я настроил ActionMailer следующим образом:

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 
] 

Шаблоны идут в lib/<GEM_NAME>/views/mailers/<MAILER_CLASS_NAME>/<MAILER_ACTION_NAME>.erb (MAILER_ACTION_NAME метод общественного экземпляра вашего класса почтовой программы, которую вы называете, чтобы отправить по электронной почте).

Наконец, не забудьте поставить это в spec_helper:

ActionMailer::Base.delivery_method = :test 
Смежные вопросы