2009-02-16 10 views
10

Je voudrais planifier une tâche quotidienne: tous les jours à 7 heures du matin, je veux qu'un e-mail soit envoyé (sans intervention humaine).Quelle est la meilleure façon de planifier une tâche d'envoi d'e-mails avec Ruby on Rails?

Je travaille sur le cadre RoR et je me demande quelle est la meilleure façon de le faire? J'ai entendu parler de BackgrounDRB, OpenWFEru planificateur ou des choses basées sur Cron, mais je suis un débutant et je ne comprends pas lequel est fait pour mon besoin.

Répondre

12

Une autre option consiste à créer une tâche rake exécutée par un travail cron. Pour ce faire, créez un fichier some_file.rake et placez-le dans votre dossier lib/tasks. Votre fichier pourrait ressembler à ceci:

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 

Utilisez ensuite Cron pour l'exécuter aussi souvent que vous le souhaitez:

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

Notez que vous devrez peut-être mettre RAILS_ENV=production dans votre crontab si votre application est en mode développement par défaut.

+0

J'ai un étrange problème avec ceci: quand j'exécute "cd/chemin/vers/app &&/usr/local/bin/rake send_daily_mail" de la ligne de commande, cela fonctionne. Mais quand crontab essaie de l'exécuter, j'ai l'erreur "/ usr/local/bin/rake: 9: dans' require ': Pas de tel fichier à charger - rubygems (LoadError) "de/usr/local/bin/rake : 9 " – Flackou

+0

Les tâches Cron s'exécutent par défaut sans bénéficier de l'environnement de connexion complet des utilisateurs La crontab qui a fonctionné pour moi était: */5 * * * * bash --login -c 'cd/chemin/vers/app && rake send_daily_mail ' – wonderfulthunk

1

Ajoutez une méthode de classe à l'un de vos modèles qui s'occupera de cela pour vous. Maintenant, essayez d'exécuter cette méthode en utilisant le script runner

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

Assurez-vous que tout fonctionne bien. Si c'est le cas, alors nous devons faire fonctionner la commande de manière universelle en configurant correctement le chemin vers le projet.

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

Passez maintenant à n'importe quelle direction aléatoire et exécutez cette commande. Si cela fonctionne correctement, exécutez crontab -e et insérez la commande dans setup pour s'exécuter tous les jours à 7h00. Il ya une tonne d'explications sur le format cron là-bas si vous google pour eux et devrait être assez simple à comprendre.

+0

Merci beaucoup pour cette réponse.Est-il possible de le gérer à partir d'un fichier spécifique (comme lib/tasks/send_mail.rb) plutôt que dans la méthode d'un modèle? – Flackou

7

J'ai été impressionné par (et l'intention d'essayer) le joyau rufus-scheduler discuté in this blog post

Il décrit quelque chose comme ceci:

scheduler = Rufus::Scheduler.start_new 

scheduler.every("1m") do 
    DailyDigest.send_digest! 
end 

..which semble assez simple. Je me demande comment il serait facile d'ajouter une configuration basée sur HTML?

+1

alors? Avez-vous essayé, qu'avez-vous pensé? –

2

BackgroundRB est ce que j'utilise et cela fonctionne parfaitement. J'ai plusieurs emails envoyés, générés par BackgroundRB. J'ai aussi d'autres tâches. Parce qu'il active à la fois les tâches planifiées et les tâches asynchrones (tâches qui prennent plus de temps que le cycle normal de réponse client/serveur). Je l'utilise et j'en suis très content.

0

Optez pour une tâche rake et un travail cron, comme l'indique déjà la réponse acceptée. Cependant, notez que la mise à jour du fichier cron lui-même est une tâche manuelle. Cela peut être bien si vous ne le changez pas pendant le développement. Sinon, voici comment vous pouvez laisser Capistrano le faire pour vous: http://push.cx/2008/deploying-crontab-with-your-rails-app