0

Below code is sending mail every 3 minutes. But i want to send the Mail only once in every day at 8pm. How to set this in the below code.

I'm new to windows services so help me. I'm using visual studio 2010

    public partial class Scheduler : ServiceBase
 {
    System.Timers.Timer createOrderTimer;
    private Timer timer1 = null;
    public Scheduler()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        System.Timers.ElapsedEventHandler(this.timer1_Tick);

        createOrderTimer = new System.Timers.Timer();
        createOrderTimer.Elapsed += new System.Timers.ElapsedEventHandler(GetMail);
        createOrderTimer.Interval = 180000;
        createOrderTimer.Enabled = true;
        createOrderTimer.AutoReset = true;
        createOrderTimer.Start();   
    }

    private void timer1_Tick(object sender, ElapsedEventArgs e)
    {
        Library.WriteErrorLog("Timer Ticked and some job has been done successfully");
    }

    protected override void OnStop()
    {
        timer1.Enabled = false;
        Library.WriteErrorLog("Test Window Service stopped");
    }

    public void GetMail(object sender, System.Timers.ElapsedEventArgs args)
    {
        NetworkCredential cred = new NetworkCredential("abc@gmail.com", "abc");
        MailMessage msg = new MailMessage();
        msg.To.Add("to@abc.com");
        msg.Subject = "Welcome Venkat";

        msg.Body = "You Have Successfully Entered to venkat World!!!";
        msg.From = new MailAddress("from@gmail.com"); // Your Email Id
        SmtpClient client = new SmtpClient("smtp.gmail.com", 587);
        client.Credentials = cred;
        client.EnableSsl = true;
        client.Send(msg);
    }
}
  • Here is exactly what you are looking for http://stackoverflow.com/questions/1297109/how-do-i-generate-an-alert-at-a-specific-time-in-c – Zeeshan Oct 31 '14 at 09:31

2 Answers2

0

Have a look at the following library: http://www.quartz-scheduler.net/

With this you can schedule your Tasks very easely.

You can find examples here on stackoverflow, i.e.

Community
  • 1
  • 1
MichaelS
  • 3,809
  • 2
  • 26
  • 33
0

You do send the mail every three minutes. Why don't you just control if the time is 8:00 every minute, and send the mail if so. You can get the current time with DateTime.Now. To strenghten your control, you can keep the log of your sent mails and try sending again if you haven't yet, as sending may fail.

Something like below, but know that this is a very simple example and may cause errors:

public void GetMail(object sender, System.Timers.ElapsedEventArgs args)
{
    if (mailSentForToday)
        return;

    if (DateTime.Now.Hour < 20)
        return;

    NetworkCredential cred = new NetworkCredential("abc@gmail.com", "abc");
    MailMessage msg = new MailMessage();
    msg.To.Add("to@abc.com");
    msg.Subject = "Welcome Venkat";

    // send the mail    
}
İsmet Alkan
  • 5,361
  • 3
  • 41
  • 64
  • Can you help me how to control the time.. I had written like this but it is not working `string OnlyTime = DateTime.Now.ToString("HH:mm tt"); if(OnlyTime=="20:00 PM") { createOrderTimer = new System.Timers.Timer(); createOrderTimer.Elapsed += new System.Timers.ElapsedEventHandler(GetMail); createOrderTimer.Interval = 500; createOrderTimer.Enabled = true; createOrderTimer.AutoReset = true; createOrderTimer.Start(); }` – user2618074 Oct 31 '14 at 11:15