Rails 3 / delayed_job - Требуются: базовый пример отложенной почты - PullRequest
5 голосов
/ 21 декабря 2010

Я пытался выяснить, как отправить задержанную почту, используя delayed_job с rails 3. Я перепробовал практически все возможные комбинации - я могу заставить почту работать в фоновом режиме, я просто не могу заставить его отложить отправку на будущее. Таблица delayed_jobs в базе данных очищает задачи, журнал говорит «отправлено», процессор задач delayed_job выбирает задачу и говорит, что отправлено без сбоев ... но сообщение либо:

  • отправлено немедленно или
  • просто не приходит

если я попытаюсь отправить в будущем.

Если бы кто-нибудь мог предложить простой пример rails 3 delayed_job, который отправляет почту в будущем, я был бы очень благодарен. Я уверен, что многие люди делают это, поэтому я подозреваю, что упускаю что-то очевидное. Одна (из бесчисленных) комбинаций, которые я попробовал ниже:

delayed_job: 2.1.2 рельсы: 3.0.3 actionmailer: 3.0.3

Контроллер:

class TestmailerController < ApplicationController
  def index
    Testmailer.delay.test_mail
  end

end

Mailer:

class Testmailer < ActionMailer::Base
  def test_mail
    mail(:to => '(myemailaddress@removedforprivacy.com', :from => '(removedforprivacy)@gmail.com', :subject => 'Testing Delayed Job', :content_type => 'text/plain').deliver
  end
  handle_asynchronously :test_mail, :run_at => Proc.new { 2.minutes.from_now }


end

соответствующая почтовая часть config / environment / development.rb:

  # Don't care if the mailer can't send
  config.action_mailer.raise_delivery_errors = true

  # Print deprecation notices to the Rails logger
  config.active_support.deprecation = :log

  config.action_mailer.default_url_options = { :host => 'localhost:3000' }

  ActionMailer::Base.smtp_settings = {
    :address => "smtp.gmail.com",
    :port => 587,
    :domain => "gmail.com",
    :user_name => "(removedforprivacy)",
    :password => "(removedforprivacy)",
    :authentication => "plain",
    :enable_starttls_auto => true
  }

Команда задания:

rake jobs:work

Ответы [ 3 ]

13 голосов
/ 20 января 2011

Я согласен с andrea - у меня возникла именно эта проблема, и после переключения моей локальной базы данных разработки с sqlite на mysql я могу запустить код, подобный

Emailer.delay({:run_at => 5.minutes.from_now}).welcome(@user)

, и он отправит письмо через 5 минут.Обратите внимание, что вам может потребоваться более длительная задержка, чем пять минут (в случае странности часового пояса), чтобы убедиться, что она работает.

1 голос
/ 31 декабря 2012

Я обнаружил в Rails 3 с mongoid, что удаление строки handle_asynchronously заставляет его работать. У меня были всевозможные проблемы, и оказалось, что delayed_job не распознает никаких объектов в моем классе Emailer. Удаление handle_asynchronously исправило это.

1 голос
/ 17 января 2011

Как при использовании метода .delay, так и при настройке handle_asynchronously :test_mail является избыточным. Попробуйте удалить метод .delay из вашего кода. используйте просто

Testmailer.test_mail   # without .deliver due to a delayed_job issue

Тем не менее, я провел некоторый тест на вашей конфигурации и при использовании sqlite , run_at просто игнорируется (не знаю почему), но при использовании mysql2 все работает нормально.

...