Share via


How to fire an email using a windows service

1. Introduction

If you want to schedule something to run or your program takes long time to process, Sometimes we may have to create a separate service application,

Windows service allows a long running application to run in a own windows process. These services can be managed thorough a services portal available in Windows. A service can be started, stopped, paused or restarted by automatically as well as manually.

I wanted to write an application to send emails in specific time periods, I thought of writing a windows service application.

We can install this service in your server or local computer and configure it to run on intervals using a timer.

↑ Return to Top

2. Create a Windows service

When we create a windows service from visual studio, It gives us a service class with constructor method, OnStart and OnStop methods as follows.

public Scheduler()
{
}
 
protected override  void OnStart(string[] args)
{
}
 
protected override  void OnStop()
{
}

↑ Return to Top

2.1. Scheduling the task with a timer

When program needs to periodically perform a task, for that it needs a timer component, add a timer into the service design from toolbox

↑ Return to Top

2.2. Fill up OnStart method

we need to initialise timer component inside the OnStart method, then I set timer interval and added a elapsed event to track each interval.

protected override  void OnStart(string[] args)
 {
     Debugger.Launch();
     logger.Info("Service is started.");
     try
      {
          Timer tmrEmailScheduler = new  Timer();
           tmrEmailScheduler.Interval = 120000;
           tmrEmailScheduler.Elapsed += tmrEmailScheduler_Elapsed;
           tmrEmailScheduler.Start();
           ProcessEmail.CreateEmail();
      }
       catch (Exception ex)
        {
           logger.Error(ExceptionHandler.ToLongString(ex));
        }
 }

↑ Return to Top

2.3. Actual scheduling done in here

inside timer elapsed event, actual task is going to run. elapsed event is called for each 2 minutes according to this code sample

private void  tmrEmailScheduler_Elapsed(object sender, ElapsedEventArgs e)
 {
      logger.Info("Timer is ticked");
      ProcessEmail.CreateEmail();
 }

↑ Return to Top

2.4. How to stop the execution

to stop the execution, OnStop event is used.

protected override  void OnStop()
 {
    logger.Info("Service is stopped.");
    tmrEmailScheduler.Stop();
 }

↑ Return to Top

3. How to install the windows service

Before installing the service in your pc, we need to create a installer class,

Add installer class as shown above

↑ Return to Top

3.1. Installer Class

in Installer class, we need to give a service name, so we can identify the service by its name.

[RunInstaller(true)]
public partial  class ProjectInstaller : System.Configuration.Install.Installer
{
     private ServiceProcessInstaller process;
     private ServiceInstaller service;
 
      public ProjectInstaller()
       {
           InitializeComponent();
           process = new  ServiceProcessInstaller();
           process.Account = ServiceAccount.LocalSystem;
           service = new  ServiceInstaller();
           service.ServiceName = "test Service";
           Installers.Add(process);
           Installers.Add(service);
        }
   }

↑ Return to Top

3.2. Let’s install the service

service is getting created after we build the application. we can find the .exe file in the bin folder. But we can’t install the service by double clicking on it.

we have to install it to the local pc or server.

↑ Return to Top

3.3. InstallUtil

InstallUtil.exe is used to install/uninstall services in local machine or server. We can run installUtil command from Developer command prompt, type InstallUtil.exe with full path to the service exe file.

But this doesn’t going to install the service, It throws an error.

It seems like we don’t have access to install the service, Let's try this, run Developer command prompt as administrator, then this permission issue is getting resolved.

We can install a service using cmd as well,

run cmd as administrator, then we can install the service using cmd as well.

↑ Return to Top

4. View services

We can check available services, by just typing services in your program list.

I gave service name as ‘test service’ in installer class.

↑ Return to Top

5. Windows service on Local Computer started and then stopped

I tried to start the service from the panel, But it didn't work,

this issue comes normally when code has some kind of a error. It’s somewhat difficult to debug a windows service application to find out errors,

↑ Return to Top

6. Debug a windows service application

normally in a windows service, program.cs looks like this.

If we want to check whether our service implementation has any issue, we can use this trick

manually start a method that has exact same code as the service implementation, inside of start method implementation, we can check whether service logic works properly.

using this trick, we can identify our service logic is working fine.

Another way of testing the program logic is, create another console application and call service logic method from console app and verify it works fine.

↑ Return to Top

6.1. Debugger Launch

If we want to debug onStart method, we can launch the debugger in start method

we can launch the debugger like this,

we can debug the code like this.

But in here specific file we attached into debugger is getting loaded. So other files are not loaded. Only we can debug the service file as this code sample shows.

↑ Return to Top

7. Windows service can’t connect to the database

In my service, i need to access to the database, But it gives me an error like this, Login failed. Login failed for user ‘NT AUTHORITY\SYSTEM’

windows service is running on ‘NT AUTHORITY\SYSTEM’ login. this login doesn’t seem to have access to the database.

To resolve this, add this in your connectionstring, Integrated Security=SSPI or else create a user account for ‘NT AUTHORITY\SYSTEM’ in your database server and give necessary permissions.

↑ Return to Top

8. Downloads

↑ Return to Top

8.2. Github

↑ Return to Top

9. Conclusion

This article explains how to configure a windows service to send emails periodically. If you go through the code sample, We have used a timer component to handle the timeline, Windows service is running accordingly in its own process without being idle until it stops.

↑ Return to Top