ActionMailer 3 без Rails - PullRequest
       1

ActionMailer 3 без Rails

27 голосов
/ 10 февраля 2011

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

# lib/bug_mailer.rb
require 'action_mailer'

ActionMailer::Base.delivery_method = :file

class BugMailer < ActionMailer::Base
  def daily_email
    mail(
            :to      => "example@mail.com",
            :from    => "example@mail.com",
            :subject => "testing mail"
    )
  end
end

BugMailer.daily_email.deliver

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

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

Ответы [ 2 ]

46 голосов
/ 10 февраля 2011

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

файл 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      => "test@domain.com.ar",
   :password       => "passw0rd",
   :enable_starttls_auto => true
  }
ActionMailer::Base.view_paths= File.dirname(__FILE__)

class Mailer < ActionMailer::Base

  def daily_email
    @var = "var"

    mail(   :to      => "myemail@gmail.com",
            :from    => "test@domain.com.ar",
            :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 %>

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

2 голосов
/ 31 октября 2013

Мне потребовалось некоторое время, чтобы заставить это работать в (не) 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: 'noreply@example.com'
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
...