Solución:
¿Probaste el tutorial de quartz.net?
Dado que su aplicación web podría reciclarse / reiniciarse, probablemente debería (re) inicializar el programador quartz.net en el controlador Application_Start en global.asax.cs.
Actualizar (con ejemplo completo y algunas otras consideraciones):
Aquí hay un ejemplo completo de cómo hacer esto usando quartz.net. En primer lugar, debe crear una clase que implemente el IJob
interfaz definida por quartz.net. El programador quartz.net llama a esta clase en el momento configurado y, por lo tanto, debe contener su funcionalidad de envío de correo:
using Quartz;
public class SendMailJob : IJob
{
public void Execute(JobExecutionContext context)
{
SendMail();
}
private void SendMail()
{
// put your send mail logic here
}
}
A continuación, debe inicializar el programador de quartz.net para invocar su trabajo una vez al día a las 06:00. Esto se puede hacer en Application_Start
de global.asax
:
using Quartz;
using Quartz.Impl;
public class Global : System.Web.HttpApplication
{
void Application_Start(object sender, EventArgs e)
{
ISchedulerFactory schedFact = new StdSchedulerFactory();
// get a scheduler
IScheduler sched = schedFact.GetScheduler();
sched.Start();
// construct job info
JobDetail jobDetail = new JobDetail("mySendMailJob", typeof(SendMailJob));
// fire every day at 06:00
Trigger trigger = TriggerUtils.MakeDailyTrigger(06, 00);
trigger.Name = "mySendMailTrigger";
// schedule the job for execution
sched.ScheduleJob(jobDetail, trigger);
}
...
}
Eso es todo. Su trabajo debe ejecutarse todos los días a las 06:00. Para las pruebas, puede crear un disparador que se active cada minuto (por ejemplo). Eche un vistazo al método de TriggerUtils
.
Si bien la solución anterior puede funcionar para usted, hay una cosa que debe considerar: su aplicación web se reciclará / detendrá si no hay actividad durante algún tiempo (es decir, no hay usuarios activos). Esto significa que es posible que su función de envío de correo no se ejecute (solo si hubo alguna actividad en el momento en que se debe enviar el correo).
Por lo tanto, debe pensar en otras soluciones para su problema:
- es posible que desee implementar un servicio de Windows para enviar sus correos electrónicos (el servicio de Windows siempre se ejecutará)
- o mucho más fácil: implemente su funcionalidad de envío de correo en una pequeña aplicación de consola y configure una tarea programada en Windows para invocar su aplicación de consola una vez al día a la hora requerida.
Además de la buena respuesta proporcionada por M4N, puede echar un vistazo a la integración de spring.net de la lib quartz.net que permite llamar a métodos sin la necesidad de implementar IJob.
Agregue .Result al final de schedFact.GetScheduler ();
void Application_Start(object sender, EventArgs e)
{
ISchedulerFactory schedFact = new StdSchedulerFactory();
// get a scheduler
IScheduler sched = schedFact.GetScheduler().Result;
sched.Start();
// construct job info
JobDetail jobDetail = new JobDetail("mySendMailJob", typeof(SendMailJob));
// fire every`enter code here` day at 06:00
Trigger trigger = TriggerUtils.MakeDailyTrigger(06, 00);
trigger.Name = "mySendMailTrigger";
// schedule the job for execution
sched.ScheduleJob(jobDetail, trigger);
}