What is the best way to schedule a sending-email task with Ruby on Rails?

后端 未结 5 716
生来不讨喜
生来不讨喜 2020-12-28 09:53

I would like to schedule a daily task : every day at 7 AM, I want an email to be sent (without human intervention).

I\'m working on the RoR framework and I\'m wonder

相关标签:
5条回答
  • 2020-12-28 10:36

    Add a class method to one of your models that will handle this for you. Now try to execute that method using the runner script

    ./script/runner "MyModel.send_daily_mail" RAILS_ENV=production
    

    Ensure everything works ok. If it does, then we need to make the command work universally by setting up the path to the project properly.

    cd /path/to/my/rails/project && ./script/runner "MyModel.send_daily_mail" RAILS_ENV=production
    

    Now change to any random directiry and run that command. If it runs properly, run crontab -e and insert the command in there setup to run daily at 7AM. There are a ton of explanation about the cron format on there if you google for them and should be pretty simple to figure out.

    0 讨论(0)
  • 2020-12-28 10:46

    BackgroundRB is what I use and it works perfect. I have several emails being sent, generated by BackgroundRB. I also have other tasks as well. Because it enables both scheduled tasks and asynchronous tasks (tasks that take longer than the normal client/server response cycle).

    I use it and I am very happy with it.

    0 讨论(0)
  • 2020-12-28 10:47

    Another option is to create a rake task that is run by a cron job. To do this, create a file some_file.rake and put it in your lib/tasks folder. Your file might look like this:

    Rails 2.x:

    task :send_daily_mail, :needs => :environment do
        Model.send_daily_mail
    end
    

    Rails 3.x:

    task :send_daily_mail => :environment do
        Model.send_daily_mail
    end
    

    Then use cron to execute it as often as you like:

    cd /path/to/app && /usr/bin/rake send_daily_mail
    

    Note you might need to put RAILS_ENV=production in your crontab if your app is in development mode by default.

    0 讨论(0)
  • 2020-12-28 10:49

    Go with a rake task and cron job, as the accepted answer already says. However, note that, updating the cron file itself is a manual task. That may be fine if you are not changing it during development. Otherwise, here how you can let Capistrano do it for you: http://push.cx/2008/deploying-crontab-with-your-rails-app

    0 讨论(0)
  • 2020-12-28 10:51

    I was impressed by (and plan to try) the rufus-scheduler gem discussed in this blog post

    He describes something like this:

    scheduler = Rufus::Scheduler.start_new  
    
    scheduler.every("1m") do  
       DailyDigest.send_digest!  
    end 
    

    ..which seems pretty simple. I wonder how easy it would be to add HTML-based configuration?

    0 讨论(0)
提交回复
热议问题