Rails 3/delayed_job - Wanted: базовый пример задержанной почты

Я пытался выяснить, как отправлять отложенную почту с помощью delayed_job с rails 3. Я перепробовал почти все комбинации возможных возможностей, которые только мог придумать, — я могу заставить почту работать в фоновом режиме, я просто могу». t заставить его отложить отправку на будущее время. Таблица 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

Почтовая программа:

class Testmailer < ActionMailer::Base
  def test_mail
    mail(:to => '([email protected]', :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/environments/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

person PlankTon    schedule 21.12.2010    source источник


Ответы (3)


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

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

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

person Will    schedule 20.01.2011
comment
Вы знаете, как это сделать без метода задержки. Я хочу использовать метод handle_async.... Мне нравится иметь возможность задерживать метод во всех вызываемых местах, а не менять всех вызывающих. - person baash05; 22.02.2013

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

person Ryan Buckley    schedule 31.12.2012

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

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

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

person andrea    schedule 17.01.2011