Setup and Configure SMTP Server on Windows Server 2008 R2

There has been some confusion about how to setup and configure an SMTP Server or mail relay on Windows Server 2008 R2. The confusion has arisen due to the SMTP server component not being managed from with IIS 7.5 but is instead managed from the IIS 6 console.  In order to have SMTP working you must install IIS 6 as a feature. The following steps will explain how to setup and configure SMTP from start to finish.

Note: The steps for installing an SMTP Server or mail relay on Windows Server 2012 are very similar except for a few minor GUI changes. See this post for the exact steps.

I have noticed a few forum posts where people are wrongly following the steps in this article thinking that they are setting up a mail server to send and receive emails for their domain – this is incorrect. The steps outlined in this post are to create a virtual SMTP Server or mail relay, which sends messages only. This is typically used when web applications generate emails and use the mail relay to deliver them. That is very different from setting up a mail server. If the latter is your desired goal and it is for a commercial operation, then I suggest you search online for steps to install and configure Microsoft Exchange Server for that purpose. If you are looking a free mail server then I recommend hMailServer.

Installing the SMTP feature

1. Click Start > Run and then enter servermanager.msc in the Open dialogue box then click OK to load Server Manager:

C:\Users\Admin>servermanager.msc

2. Use the Add Features Wizard to select SMTP Server on the Select Features page. To initiate this, right-click on Features and click Add Feature:

3. In the Features section check SMTP Server and click Next:

4. You may see a dialogue box like the one below stating that certain role services and features are required for SMTP:

5. Click Add Required Role Services and then you will return to the previous Features section. Ensure SMTP Server is checked then click Next.

6. In the Web Server (IIS) section, click Next to proceed to the Role Services section:

7. The Role Services should be pre-populated – IIS 6 Management Compatibility should be selected, and below it, IIS 6 Metabase Compatibility and IIS 6 Management Console should also be checked. Click Next to continue:

8. In the Confirmation section click Install:

9. In the Results section click Close to complete the installation of the SMTP Server:

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.

10. Click Start > Run and then enter inetmgr6 in the dialogue box then click OK to load IIS Manager 6.

11. In IIS 6 Manager right-click on SMTP Server and select Properties:

12. 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):

13. To proceed, click on the Access tab:

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

15. 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 addess and then click OK:

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.

16. Click OK to return to the Access tab and then click on the Relay button. Enter 127.0.0.1 as the IP addess and then click OK:

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.

17. 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:

20130427131034

18. Next, go to the Delivery tab:

19. 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:

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

21. Click OK to return to the Delivery tab and then click on Outbound Connections, then click on the Advanced button:

20130427131219

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:

 22. Click OK and then OK again to exit the SMTP Virtual Server 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 be the IP address of your server:

20130427131924

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, cachens2.dfw1.rackspace.com, was able to successfully resolve my SMTP server’s hostname, mail.vsysad.com. This is one of Rackspace’s many DNS servers and I am 100% confident it works fine.

The reason I am highlighting this is because if your SMTP Server sits within a corporate network it will most 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 big email service providers perform reverse DNS lookups of  mail servers connecting to them as a security measure to check their credibility or reputation. Your web hosting company 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.

23. 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 command prompt and run the command below to enable this setting:

C:\Users\Admin>sc config "smtpsvc" start= auto
[SC] ChangeServiceConfig SUCCESS

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

C:\Users\Admin>sc query "SMTPSVC" | find "RUNNING"
        STATE              : 4  RUNNING

If the SMTP Service is not running the command above will not return a state/result. If that is the case then run the command below to start it:

C:\Users\Admin>net start smtpsvc
The Simple Mail Transfer Protocol (SMTP) service is starting.
The Simple Mail Transfer Protocol (SMTP) service was started successfully.

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:

24. Create a text file on your desktop called email.txt and paste the following into it, remembering to change the email address information to reflect your own details:

From: blog@yourdomain.com
To: email@yourdomain.com
Subject: Email test

This is the test body of the email

.

25. Save the changes to email.txt and then copy the file to C:\inetpub\mailroot\Pickup. The SMTP server monitors this folder and when it detects the email.txt file, it will read the contents and send the email to the address in the To: section. This should happen almost immediately.

26. Check the email address the email was sent to and it should arrive shortly – the email was sent to my Gmail account:

20130429184511

An alternative way of doing this is to use a script to perform the same email test. Simply save the code below into a file called email.vbs, remembering to change the email address information to reflect your own details:

Dim sch, cdoConfig, cdoMessage
sch = "http://schemas.microsoft.com/cdo/configuration/"
Set cdoConfig = CreateObject("CDO.Configuration")
With cdoConfig.Fields
.Item(sch & "sendusing") = 1 ' cdoSendUsingPort
.Item(sch & "smtpserver") = "127.0.0.1"
'    .Item(sch & "smtpserverport") = 25
.update
End With
Set cdoMessage = CreateObject("CDO.Message")
With cdoMessage
Set .Configuration = cdoConfig
.From = "blog@yourdomain.com"
.To = "email@yourdomain.com"
.Subject = "Email test"
.TextBody = "This is the test body of the email"
'.AddAttachment "c:\images\myimage.jpg"
.Send
End With
Set cdoMessage = Nothing
Set cdoConfig = Nothing
MsgBox "Email Sent"

Once the file has been saved to the desktop double-click on it and it should automatically send the the email. A message box pops up to confirm that the email was sent:

Apparently there’s more than one way to skin a cat, there’s also more ways to test your mail relay server:

You can also use telnet and PowerShell to test mail sending/routing via SMTP Server. Please refer to this post to see how to do this.

You can also use an email web form application which is similar to a contact us page on a website which allows you to post some feedback, which then uses an SMTP Server to deliver the messages to specific email contacts such as info@yourdomain.com that monitor this information. See this post to learn how to do this using an ASP.NET 4.0 C# email web form application.

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 Server from the command line
Testing SMTP mail relay with ASP.NET 4.0 C# email web form

Create a WordPress blog on Windows Server 2008 R2, IIS 7.5 and MySQL

20130502200705I think it is fitting that my first ever post on this WordPress Blog would be about setting up a WIMP server (Windows Server 2008 R2, IIS, MySQL & PHP).

Being a former Windows Systems Administrator I wanted to keep as many components running on familiar Microsoft applications (IIS 7.5 & SQL Server 2008 R2) and found this article explaining how to do it. However, at the time of writing this article I found that the WordPress on SQL Server (wp-sqlsrv) distribution was unavailable* so the only option was to use MySQL. In retrospect I am very happy with this outcome as the process of learning about MySQL has been very enjoyable and so far has proven to be a very stable and easy-to-use database application .

* Please note that the WordPress on SQL Server (wp-sqlsrv) distribution is now available.

The Environment

  • Server: Rackspace Cloud VM running Windows Server 2008 R2
  • Web server: IIS 7.5
  • Database application: MySQL

This blog you are reading is running off the environment above. So far I have found it to be an excellent blogging platform.

Install IIS 7.5

Logically, the first step is to install the web server application, IIS 7.5. From this point onwards I will simply refer to it as IIS.  To do so, perform the folowing steps:

1. Click Start > Run then enter servermanager.msc in the Open dialogue box then click OK  to load Server Manager:

C:\>servermanager.msc

2. Once Server Manager has loaded, right-click on Roles and click Add Roles, which initiates the Add Roles Wizard:

3. Click Next in the Before You Begin section:

4. Select Web Server (IIS) on the Select Server Role section and click Next:

20120416220536

5. Select the IIS services to be installed on the Select Role Services page. Keep the defaults but also select the CGI check box under Application Development. This enables both the CGI and FastCGI services which is required to use PHP:

6. Click Next and on the Confirmation page click Install.

7. Once the installation has completed, click Start > Run and then enter inetmgr in the dialogue box then click OK to load Internet Information Services (IIS) Manager. This will fire up IIS Manager and you will see IIS running and configured according to the options you selected earlier:

For more information, this article shows how to install IIS 7.5 with default settings and this article shows how add the CGI feature as described above.

Configure IIS 7.5

We now need to configure IIS in preparation for WordPress:

8. Click Start > Run and enter CMD in the dialogue box and then click OK.

9. At the command prompt enter the following and then hit enter on the keyboard:

md C:\Websites\Wordpress

This creates the directory where the new WordPress site will be located.

10. Open IIS Manager and click on Sites.

11. Right-click on Sites and then click Add Web Site:

In the Add Web Site dialogue box enter these details:

  • Name: WordPress
  • Physical path: C:\Websites\Wordpress
  • Bindings: All Unassigned. If your server has multiple IP addresses and you want the site to listen on a specific IP address select it from the drop-down box.
  • Host name: www.yourdomain.name. This should contain the fully-qualified domain name for your blog site.

Once all the sections have been completed click OK. You will now see the WordPress site under the Sites folder.

12. Click on Application Pools and in the middle pane you will see an application pool named WordPress. Right-click on it and select Advanced Settings:

13. Find the setting Enable 32-Bit Applications and click the drop-down box and click True. Click OK to save the settings:

20120417065550

We will leverage the improved security in IIS 7.5 by utilising ApplicationPoolIdentity. More information about this can be found here.

14. Select the WordPress site in the Connections pane and then double-click Authentication:

15. Select Anonymous Authentication and in the Actions pane on the right side click Edit:

16. Then select Application Pool Identity and click OK:

17. Click Start > Run and then enter CMD in the Open dialogue box then click OK  to load a command prompt enter the following and hit enter:

icacls "C:\Websites\Wordpress" /grant "IIS APPPOOL\Wordpress":(OI)(CI)(RX,W)

This configures the WordPress application pool to have write permissions to the directory where the new WordPress site is located.

IIS is now configured and ready for PHP to be installed!

Install PHP 5.3.10 for Windows

WordPress uses PHP therefore it is the next component to be installed. We require a ‘Non Thread Safe’ version and facilitate the installation we will use the latest version that comes with an ‘Installer’. At the time of writing, version 5.3.10, has an Installer. To proceed, perform the following:

18. Go to http://windows.php.net/download/.  Find version 5.3.10, under VC9 x86 Non Thread Safe, click the Installer version to download it. Click here for a direct download.

19. Once downloaded, run the .msi setup file, click Next at the first screen and accept the EULA (End User License Agreement)  and then click Next again.

20. Keep the default installation directory, which is C:\Program Files (x86)\PHP:

21. At the Web Server Setup step select IIS FastCGI:

22. Install the following features also; Script Executable, Register *.php files to open automatically and PEAR Install:

23. Click Next then Install and then click on Finish to complete the setup:

Install PHP Manager 1.2

PHP Manager is a plugin for IIS that allows you to manage and configure PHP settings and installations.

24. Go to http://phpmanager.codeplex.com/ and click on ‘View all downloads’ and download and install the x64 version.

25. Open IIS Manager and in the Connections pane select the server name. In the middle pane you will see all installed features within IIS. Select and open PHP Manager:

26. Under the PHP Setup section select View Recommendations:

27. Select all of the recommendations and hit the OK button:

Install MySQL

At the time of writing, MySQL 5.5.21, is the most recent version available.

28. Go to http://dev.mysql.com/downloads/mysql/ and download the 64-bit MSI Installer and run the setup (mysql-5.5.21-winx64.msi)

29. Accept the EULA and click Next.

30. In the Choose Setup Type section select Typical and click Next:

31. In the Ready To Install MySQL 5.5 section click Install:

32. When the installation completes ensure Launch the MySQL Instance Configuration Wizard is ticked and then click Finish:

33. Select Standard Configuration as the configuration type and then Next:

34. Select Server Machine as the server type and then click Next:

35. In the Windows Options section ensure the settings match the image below:

36. In the security options section check Modify Security Settings, enter the root password of your choice and then click Next:

37. In the configuration section shown below click Execute:

38. Once the process completes click Finish:

Configure MySQL for WordPress

We will now create the database for WordPress within MySQL. We will do this via the command line client.

39. Click Start > All Programs > MySQL > MySQL Server 5.5 > MySQL 5.5 Command Line Client to open a MySQL command prompt:

40. Enter the root password you chose earlier in the MySQL setup and hit enter:

41. To create the WordPressDB database type the following and hit enter:

CREATE DATABASE WordPressDB;

You will receive a confirmation that the command was successful:

Query OK, 1 row affected (0.00 sec)

41. To create the wp_user and grant it access and requisite permissions to the WordPressDB database type the following and hit enter:

GRANT ALL PRIVILEGES ON WordPressDB.* TO "wp_user"@"localhost" IDENTIFIED BY "password";

Please note that the “;” signals the end of the command. To go to a second line just hit Enter without a “;” at the end of a line.

42. Type Exit and hit enter to exit the MySQL command line client.

The confirugration of MySQL is now complete. We should now have the following information available for the WordPress install:

  • Database Name: WordPressDB
  • Database User: wp_user
  • DB User Password: password

Install WordPress

Go to http://wordpress.org/download/ and download the latest version of WordPress (currently 3.3.1) and then folllow these steps:

43. Extract the WordPress files to the location of the WordPress site we created earlier in IIS – C:\Websites\Wordpress.

44. Navigate to C:\Websites\Wordpress and find the file named wp-config-sample.php and open it with Notepad, as per below:

45. Ammend the following fields in wp-config-sample.php with the MySQL database info we created earlier :

  • DB_NAME: WordPressDB
  • DB_USER: wp_user
  • DB_PASSWORD: password

The screen shot below shows the variables that need to be changed. This is telling WordPress which database (WordPressDB) to store the configuration data in MySQL and also the connection information (wp_user and password) to be used:

46. Save the file as wp-config.php

47. Type in the following into your browser to start the WordPress installation script:

http://www.yourdomain.com/wp-admin/install.php

Be sure to replace www.yourdomain.com with your domain.

48. You will now see the WordPress welcome screen:

You need to configure the following fields with your own personal information:

  • Site Title: My First WordPress Blog
  • Username: choose your username (default is admin)
  • Password: choose your password
  • Your E-mail: email@yourdomain.com

49. Click the Install WordPress button and the setup script will run and you should see the following page soon after:

20120417114254

50. Click Login to go to the Admin Login page then enter your WordPress username and password you created earlier and start blogging!