Install and Configure SMTP Server on Windows Server 2016

The steps to setup and configure an SMTP Server or mail relay on Windows Server 2016 are almost exactly the same as those for Windows Server 2012 except for a few differences. Confusion has arisen due to slight GUI changes in Server 2016, which has led me to create this post to help anyone that requires explicit step-by-step instructions.

Note: The exact steps for installing SMTP Server on Windows Server 2012 can be found in this previous post of mine.

Installing the SMTP feature

1. Click on the Windows button and click on the Server Manager icon in the menu to load the Server Manager Dashboard:

20170526164721

Alternatively, open it via Powershell by entering servermanager.exe at the prompt to load the Server Manager Dashboard:

PS C:\> servermanager.exe

2. When the Server Manager Dashboard loads, click on Add roles and features in the center pane as highlighted below:

20170526012744

The Add Roles and Features Wizard will load, click Next to go past the initial Before You Begin Page:

20170526012839

3. In the Select installation type section, select Role-based or feature-based installation and click Next:

20170526013937

4. In the Select destination server section, select your server, in my example below, my server is called vs11app003, then click Next to proceed:

20170526014003

5. In the Select Server Roles section do not select anything and click Next to proceed:

20170526014032

6. In the Select features check SMTP Server:

20170526014121

Doing so will initiate a prompt to install the required roles services and features. Ensure you check the Include management tools (if applicable) box per the below and click Add Features to proceed:

20170526014203

7. Back at the Select features section, with SMTP Server selected click Next to proceed:

20170526014233

8. In the Web Server Role (IIS) section click Next to proceed:

20170526014309

9. Check Web Server then click Next to proceed:

20170526014513

10. The Confirm installation selections section will show all the role and feature configuration options you previously selected:

20170526014602

Checking Restart the destination server automatically if required is not necessary, if you do you will see the following warning:

20170526014630

Click Yes and the installation will begin:

20170526014709

11. Once the installation completes click Close:

20170526090039

The installation should complete shortly. You nay need to reboot your server to fully complete the installation.

Configuring the SMTP Server

The next step is to configure SMTP. To do so we will need to open Internet Information Services (IIS) Manager 6.

12. Click on the Windows button per step 1 to load the Server Manager Dashboard. Then click Tools and then click on Internet Information Services (IIS) 6.0 Manager to load IIS Manager 6:

20170528005334

13. In IIS 6 Manager, expand the server name, in my example below it is VS11APP003, then right-click on [SMTP Virtual Server #1] and select Properties:

20170526090654

14. In the General tab, unless you want the SMTP Server to use a specific IP address,  leave the settings as they are so that the IP address is set to (All Unassigned):

20170526090949

15. To proceed, click on the Access tab:

20170526092536

16. Click on the Authentication button and ensure Anonymous access is checked and then click OK:

20170526092606

17. Once back in the Access tab, click on the Connection button. Select Only the list below and then click Add. Enter 127.0.0.1 as the IP address and then click OK:

20170526092934

The Connection setting controls which computers can connect to the SMTP server and send mail. By granting only localhost (127.0.0.1) access, limits only the server itself the ability to connect to the SMTP server. This is a requirement for security. Click OK to return to the Access tab and then click on the Relay button. Enter 127.0.0.1 as the IP address and then click OK:

20170526092759

The Relay section determines which computers can relay mail through this SMTP server. By only allowing the localhost IP address (127.0.0.1) relay permissions it means that only the server itself can relay mail. Conversely, it prevents the SMTP server from being an open relay and being used to send unsolicited spam email by other computers on the internet, which could lead to the SMTP server being blacklisted.

18. Next, go to the Messages tab. Here you can enter an email address where copies of non-delivery reports are sent to. You can also configure the location of the Badmail director, however, the default setting should suffice:

20170526093025

19. Next, go to the Delivery tab:

20170528010430

20. Click on the Outbound Security button and ensure Anonymous access is selected. As the only server that can connect and relay mail through the SMTP server is localhost this security settings is fine:

20170526093758

21. Click OK to return to the Delivery tab and then click on Outbound Connections. Leave the defaults as they are:

20170526093843

22. Click OK to return to the Delivery tab and then click on the Advanced button:

20170526093957

Here you will need to enter the fully-qualified domain name of the SMTP server. This will be the host name or A record that has been created in your DNS zone file. This is straight-forward to do but you will have to confirm how you do this with the party that manages DNS for your domain. I have entered mail.vsysad.com as this is fully-qualified. If you click on the Check DNS button you can confirm whether your chosen name resolves successfully. In my case it does as I see the following:

20170526094249

23. Click OK and then OK again to exit the SMTP Virtual Server #1 Properties. You can also perform this test by running nslookup to confirm the existence of the host name as well as confirming the IP address it resolves to – which should the IP address of your server:

20170526094855

Please note that DNS is crucial to successful email delivery. If your SMTP server cannot resolve the domains it is trying to send messages to then it will fail. Ensure that the DNS servers you have configured are able to resolve DNS queries successfully. From the above screenshot you can see that the DNS server I have configured, google-public-dns-a.google.com, was able to successfully resolve my SMTP server’s hostname, mail.vsysad.com.

The reason I am highlighting this is because if your SMTP Server sits within a corporate network it will likely use an internal DNS server. Often these are only configured to resolve internal namespaces therefore resolving external hostnames may fail. Also, firewall rules may block your SMTP Server from querying any DNS servers so please check and ensure DNS queries are resolved successfully and if not make sure it get fixed before going onto the testing phase below.

Another very important point about DNS is that you must ensure that you have a PTR record for reverse DNS lookups configured. The PTR record allows your SMTP Server’s public IP address to be resolved back to your hostname. Some of the major email providers perform revers DNS lookups of  mail servers connecting to them as a security measure to check their credibility or reputation. Your web host should have a control panel that allows you to configure reverse DNS if you have a dedicated public IP address. Not having a PTR record will not guarantee email delivery failure but it will very likely delay email delivery and at worst may result in your messages being blocked and your host being blacklisted. I highly recommend you you configure a PTR record for your server.

Follow the instructions in this post which shows you how to verify correct DNS configuration using the SMTPDIAG tool.

24. The last configuration step will be to set the SMTP Service to Automatic so that it automatically starts when the server boots up. Open up the Powershell console and run the command below to enable this setting:

PS C:\> set-service smtpsvc -StartupType Automatic

Then run the command below to confirm that the service is actually running:

PS C:\> get-service smtpsvc

Status   Name               DisplayName
------   ----               -----------
Running  smtpsvc            Simple Mail Transfer Protocol (SMTP)

If the SMTP Service is not running the command will return a status of Stopped. If that is the case then run the command below to start it:

PS C:\> start-service smtpsvc

We are now ready to test the configuration.

 Testing the SMTP Server

The next step is to verify that the SMTP server is able to send email successfully. To do this follow the steps below:

25. Open a PowerShell console and simply run the command below, ensuring that you complete the sending and receiving email addresses plus the subject and body text:

PS C:\> Send-MailMessage -SMTPServer localhost -To xxxxx@gmail.com -From blog@vsysad.com -Subject "This is a test email" -Body "Hi Japinator, this is a test email sent via PowerShell"

The above command sent an email to my Gmail account, a screenshot of the email generated is below:

20131031223718

You can save the above command in a file with a .ps1 (PowerShell) file extension and run it whenever you need to test sending/routing of mail.

That’s all there is to it! Now you have a fully functioning STMP server that can successfully send emails. Many of the companies that I have worked with use this method to send emails generated by their web applications.

If emails are not being successfully delivered you may notice that messages are building up in specific SMTP folders. Visit this post to understand the purpose of each SMTP folder and how to approach issues when messages are queuing up in those folders.

References:
How to test outbound mail flow with a file in the Pickup folder
IIS SMTP Folder Structure and how SMTP service works

Testing SMTP mail relay with ASP.NET 4.0 C# email web form

In this post I will demonstrate how to test your SMTP mail relay server on Windows Server 2012 using an email web form application in 15 EASY STEPS. The form contains ASP.NET 4.0 and C# code and will emulate how a typical web application running on IIS sends emails via a mail relay. I have tweaked the code in the form so that it works perfectly with the SMTP Server config detailed in a previous post of mine. This is to say that it assumes the web application (the email form) runs on the same server environment as your SMTP Server and thereby points to localhost. A screenshot of the form used in this post can be seen directly below:

20141122122611

It was taken from the YouTube videos below, there are 2 parts:

Contact us page using ASP.NET and C# Part 141
Contact us page using ASP.NET and C# continued Part 142

The producer of the videos, YouTube user kudvenkat, also has a website which contains 2 posts that directly correspond to both of the videos above:

Part 141 – Contact us page using ASP.NET and C#
Part 142 – Contact us page using ASP.NET and C#

The instruction is excellent and the form itself is nice looking and contains more sophisticated code, such as error handling and form validation, than some of the more basic examples I have found on the internet.

I watched both videos attentively and created the project in Visual Web Developer 2010 Express and produced the relevant files and uploaded them to the server. The section below shows the snippets of code that needed to be changed.

As you can see from the above you need to change mailMessage.From to reflect who the email will be sent from. In my case it would be admin@vsysad.com. In the line directly below it mailMessage.To.Add needs to be changed to reflect who the email will be sent to. I like all email pertaining to my blog to go to my Gmail email address, change it to your preferred email.

MailMessage mailMessage = new MailMessage();
mailMessage.From = new MailAddress("blog@yourblog.com");
mailMessage.To.Add("youremail@gmail.com");

The only other section of code that needs to be changed is SmtpClient, and this determines the SMTP mail relay server and what port it is listening on. In my case it is localhost as the SMTP mail relay runs on the same server as the web application and runs on port 25. If the SMTP mail relay runs on another server change the code to reflect it’s fully qualified domain name or IP address and the port it is listening on.

SmtpClient smtpClient = new SmtpClient("localhost", 25);

So the relevant code block resembles the below:

MailMessage mailMessage = new MailMessage();
mailMessage.From = new MailAddress("blog@vsysad.com");
mailMessage.To.Add("thejapinator@gmail.com");
mailMessage.Subject = txtSubject.Text;

mailMessage.Body = "<b>Sender Name : </b>" + txtName.Text + "<br/>"
     + "<b>Sender Email : </b>" + txtEmail.Text + "<br/>"
     + "<b>Comments : </b>" + txtComments.Text;
mailMessage.IsBodyHtml = true;

SmtpClient smtpClient = new SmtpClient("localhost", 25);
smtpClient.Send(mailMessage);

 

Configure the ASP.NET C# code

To setup the web form application you will need all the relevant files and folder(s) (.aspx, .aspx.cs, .dll, .pdb, bin folder etc) for this to work. I have attached the Visual Studio project files you require in order to create the files to upload to your web server. Click here to download the project files.

1. The Visual Studio project files are compressed in a zip file. Extract them to a folder of your choice. I extracted them to C:\WebFormsDemo per the below:

20141130124501

2. Once the files have been extracted, open them up in your preferred version of Visual Web Developer Express by clicking on File > Open Project:

20141130124940

3. Locate the files you just extracted in Step 1 above, then select WebFormsDemo.sln and click Open:

20141130122918

4. Once the project has opened, go to the Solution Explorer in the far right pane and expand WebForm1.aspx and double-click on WebForm1.aspx.cs:

20141130115543

5. WebForm1.aspx.cs will then open to the left. Scroll down to the relevant section and change mailMessage.From to reflect who the email will be from and mailMessage.To.Add to reflect who the email will be sent to:

20141130115659

6. Hold down CTRL + S keys on your keyboard to save the changes you just made in the previous step. Then right click on WebFormsDemo in the Solution Explorer and select Publish:

20141130120014

7. Choose where you want to save your published files. I published the files to C:\WebDeploy:

20141130123350

Our work in Visual Web Developer Express is now finished.

Configure IIS

To configure IIS you will need to ensure that ASP.NET and all relevant IIS modules have been installed. I am assuming you have done this already. As my lab server does not host any live sites I have chosen to use the Default Website to serve my email form application. To configure your site:

8. Upload the files you published in Step 7 above to C:\inetpub\wwwroot\ on the server, this is the location used by the Default Website in IIS:

20141122123244

9. Open IIS, then go to Application Pools and click on DefaultAppPool:

20141122122724

10. Right-click on DefaultAppPool and select Basic Settings:

20141122153849

11. Ensure .NET Framework v4.x is selected, if not select it and save the changes:

20141122123057

12. Right-click on DefaultAppPool again and click Recycle:

20141122153920

13. On the server, open a browser window and go to http://localhost/WebForm1.aspx and the form should load per the below:

20141122122611

14. Fill in the form with valid information and click send:

20141122122517

15. An email will be delivered to your chosen destination email. In my case, the email was sent to my Gmail address:

20141122150415

That’s it! As ever, it is fairly straight-forward when you know. This email form can be used to test your SMTP mail relay or could be incorporated into your site if you require a contact or feedback page.

A special thank-you to kudvenkat for providing the code for the email form. Excellent job indeed!