2009-02-16 13 views
10

Me gustaría programar una tarea diaria: todos los días a las 7 AM, quiero que se envíe un correo electrónico (sin intervención humana).¿Cuál es la mejor manera de programar una tarea de envío de correo electrónico con Ruby on Rails?

Estoy trabajando en el marco RoR y me pregunto cuál es la mejor manera de hacerlo?

He oído hablar de BackgrounDRB, el programador de OpenWFEru o cosas basadas en Cron, pero soy un novato y no entiendo cuál está hecho para mi necesidad.

Respuesta

12

Otra opción es crear una tarea de rake que ejecute un trabajo cron. Para hacer esto, crea un archivo some_file.rake y ponlo en tu carpeta lib/tasks. Su archivo podría tener este aspecto:

rieles 2.x:

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

rieles 3.x:

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

Entonces usar cron para ejecutar tantas veces como desee:

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

Tenga en cuenta que puede necesitar poner RAILS_ENV=production en su crontab si su aplicación está en modo de desarrollo por defecto.

+0

Tengo un problema extraño con esto: cuando ejecuto "cd/path/to/app &&/usr/local/bin/rake send_daily_mail" desde la línea de comandos, funciona. Pero cuando crontab intenta ejecutarlo, aparece el error "/ usr/local/bin/rake: 9: en' require ': no ​​hay tal archivo para cargar-- rubygems (LoadError) "de/usr/local/bin/rake : 9 " – Flackou

+0

Las tareas de cron se ejecutan de manera predeterminada sin el beneficio del entorno de inicio de sesión completo de los usuarios. El crontab que funcionó para mí fue: */5 * * * * bash --login -c 'cd/path/to/app && rake send_daily_mail ' – wonderfulthunk

1

Agregue un método de clase a uno de sus modelos que lo manejará por usted. Ahora intente ejecutar ese método utilizando el script runner

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

Asegúrese de que todo funcione correctamente. Si lo hace, entonces tenemos que hacer que el comando funcione universalmente configurando la ruta al proyecto correctamente.

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

Ahora cambie a cualquier directiry aleatorio y ejecute ese comando. Si se ejecuta correctamente, ejecute crontab -e e inserte el comando allí configuración para ejecutar a diario a las 7 am. Hay un montón de explicaciones sobre el formato cron allí si buscas para ellos y debería ser bastante simple de entender.

+0

Muchas gracias por esta respuesta.¿Es posible administrarlo desde un archivo específico (como lib/tasks/send_mail.rb) en lugar de en el método de un modelo? – Flackou

7

Me impresionó (y pensado para probar) la rufus-scheduler joya discutió in this blog post

Él describe así:

scheduler = Rufus::Scheduler.start_new 

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

..which parece bastante simple. Me pregunto qué tan fácil sería agregar una configuración basada en HTML.

+1

entonces? ¿Lo intentaste, qué pensaste? –

2

BackgroundRB es lo que uso y funciona perfecto. Tengo varios correos electrónicos enviados, generados por BackgroundRB. También tengo otras tareas también. Porque habilita tareas programadas y tareas asincrónicas (tareas que toman más tiempo que el ciclo de respuesta cliente/servidor normal).

Lo uso y estoy muy contento con él.

0

Vaya con una tarea de rake y un trabajo cron, como ya lo dice la respuesta aceptada. Sin embargo, tenga en cuenta que la actualización del archivo cron en sí es una tarea manual. Eso puede estar bien si no lo estás cambiando durante el desarrollo. De lo contrario, aquí puede dejar que Capistrano lo haga por usted: http://push.cx/2008/deploying-crontab-with-your-rails-app

Cuestiones relacionadas