Hello World,
In our previous post (Powershell Script Alternative to Telnet SMTP Connection test”), we have quickly shared a small PowerShell Script that can be used to mimic the Telnet SMTP test against Exchange (or mail relay) server. Surprisingly, the script has proven to be quite popular around us. Based on this modest success and in order to further improve the usage, we have decided to create a really simple PowerShell Script Module.
The PowerShell Module will simplify the usage of the script and will basically make available the PowerShell Cmdlet that could be used to perform a basic Telnet SMTP Test connection. Based on the success of this Module, we might want to publish it on PowerShell Gallery….
So, let’s us introduce you our simple Test-SmtpConnection Module
Overview
We thought that creating a PowerShell module would be extremely complicated. On the contrary and given our modes goal, creating such PowerShell module was quite straight forward. By reworking slighty the initial script we have released (see here) and we have created the folder structure and the additional psd1 file needed to describe the Module. Microsoft provides some good information on how to write PowerShell Modules which has helped us in building this really simple but really cool module 🙂
We have called this module Test-SmtpConnection. The module would replace the standard Telnet SMTP Test connection against an Exchange/Mail server as shown below.
Telnet <%MAIL SERVER%> 25 HELO MAIL FROM :<%SenderEmail%> RCPT TO: <%REcipientEmail%> DATA Subject : Test Message <% Your Message %> .
As the Telnet Client is not always available or simply not allowed, the Test-SmtpConnection Module would mimic these commands and provide response returned by the mail server using exclusively PowerShell technology.
How to Install
Disclaimer
The script/PowerShell Module is provided AS IS ! Use it at your own risk !!!
Easy Download & Install (Automated)
You can perform a manual installation (see below) or you can follow the instructions hereafter if you want to speed up the installation process. If you have Powershell 5.0 or later installed on your machine, you can execute the following two PowerShell commands (as administrator).
First, you will issue the following command to download the zip file into your Downloads folder
#Download the zip file to your Downloads Folder (Change Accordingly if needed)
Invoke-WebRequest -uri https://www.c-nergy.be/downloads/PSDev/Test-SmtpConnection.zip -OutFile "$HOME\Downloads\Test-SmtpConnection.zip"
Wait for the download to complete. Then from the same PowerShell Console, the next command will extract the folder from the zip file and copy it over the final location which is c:\Program Files\windowsPowerShell\Modules
#Extract zip file and copy the extract folder to PowerShell Module Location
Expand-Archive "$HOME\Downloads\Test-SmtpConnection.zip" -DestinationPath 'C:\Program Files\WindowsPowerShell\Modules'
If everything has run successfully and smoothly, you are done and you can jump to the HowTo use section….
Note : You need to have the correct administrative rights in order to be able to save the file into the correct destination folder location….
Manually Download & Install
You can obtain the module files by downloading them from this location
Unzip the File
After downloading the zip package containing the file, you will need to unzip it first. The extracted folder should contains two files
Test-SmtpConnection.psm1 which contains the script logic Test-SmtpConnection.psd1 which is the module manifest and provides information about the module
Copy the Extracted Folder to the Modules Location
To make the Module available to your system, you will simply copy the folder (Test-SmtpConnection) into the following location
'C:\Program Files\WindowsPowerShell\Modules\'
The folder structure should be look like this
Click on Picture for Better Resolution
The Folder Test-SmtpConnection should contains the following two files as depicted hereafter
Click on Picture for Better Resolution
And you are done ! You can now move to the next section to see how easy it is to use this new cmdlet…..
How to Use
Usage is really straight forward ! Since we have created a PowerShell Script module, a new cmdlet will be available in your PowerShell console and you do not need to import any modules. To check and to get used to the new cmdlet, simply issue the following command in the Powershell Console
Get-Help Test-SmtpConnection
Click on Picture for Better Resolution
After you can simply issue the following command to see that the module is loaded in your PowerShell Console
Get-Module Test-SmtpConnection
Click on Picture for Better Resolution
The easiest way to use this PowerShell Module consist of simply issuing the cmdlet
Test-SmtpConnection
Press Enter. You will then be prompted for some additional information (the ServerName, the Sender Email address and the Recipient Email Addres) and the script will try to perform the telnet SMTP connection.
Click on Picture for Better Resolution
You can also use a one liner by issuing the following command to be executed
Test-SmtpConnection -RemoteHost <%Mail_Server_Name%> -From <%SenderEmailAddress%> -To <%RecipientEmailAddress%>
Click on Picture for Better Resolution
You have other options that can be specified like Port or Authentication Method (HELO or EHLO). These parameters are not mandatory and will be using default values specified in the script.
- Default value for Port is set to 25
- Authentication method is set to HELO
- Default Message is generated using Date & Time Subject
PowerShell Script Module Files
The Test-SmtpConnection Module consists of two files
- Test-SmtpConnection.psm1 which is basically the script reformatted accordingly
- Test-SmtpConnection.psd1 which is the module manifest and provides information about the module
We are publishing the content of these file hereafter so anyone can see what the script is doing and can help you decide to use this Module or not
Test-SmtpConnection.psm1 file
#-------------------------------------------------------------------------# # Script_Name : Test-SmtpConnection PowerShell Module # Description : Emulate telnet SMTP test connection # Date : July 2020 # Written by : Griffon # # WebSite :http://www.c-nergy.be - http://www.c-nergy.be/blog # Version : 1.0 # # Notes: Fork from initial script of Glen Scales # # Disclaimer : Script provided AS IS. Use it at your own risk.... # You can use this script and distribute it as long as credits are kept # in place and unchanged #-------------------------------------------------------------------------# <# .Synopsis Emulate Telnet connection to Exchange Server using Powershell. .Description Mimic telnet SMTP Commands (HELO/MAIL FROM/RCPT TO/DATA..) and provide response returned by the mail server using exclusively PowerShell technology. Alternative solution if Telnet Client not installed or not available .Link http://c-nergy.be/blog/?p=15365 https://www.c-nergy.be/products.html .Parameter RemoteHost Server or IP address of the Exchange/SMTP Server. .Parameter Port Port to connect To. Default Port is 25. .Parameter From Email address of the Sender. .Parameter To Email address of the Recipient. .Parameter Subject Default Subject set to Test Message + Time. Can provide your own Subject for the message. .Parameter HEL Default is set to HELO but if preferred EHLO value can be passed. .Example Minium Parameters to initiate smtp connection. Test-SmtpConnection -RemoteHost 10.10.10.10 -From demo@test.com -To Target@test.com .Example Set a custom Subject Message. Test-SmtpConnection -RemoteHost 10.10.10.10 -From demo@test.com -To Target@test.com -Subject "This is a test Message" .Example Use EHLO instead of HELO. Test-SmtpConnection -RemoteHost 10.10.10.10 -From demo@test.com -To Target@test.com -Subject "This is a test Message" -HEL EHLO #> # written By Griffon - July 2020 - www.c-nergy.be function Test-SmtpConnection { param( [Parameter(Mandatory=$true)] [String] $remotehost, [Parameter(Mandatory=$true)] [String] $From, [Parameter(Mandatory=$true)] [String] $To, $port="25", [String] $Subject="Test Message $(get-date)", [String] $HEL="HELO" ) # -Default BODY MESSAGE USED WHEN MESSAGE IS SEND $testMsg=@" DATA Subject: $Subject This is a test Message . "@ function readResponse { while($stream.DataAvailable) { $read = $stream.Read($buffer, 0, 1024) write-host -n -foregroundcolor cyan ($encoding.GetString($buffer, 0, $read)) "" } } #------------------------------------# # CODE TO PERFORM SMTP CONNECTION # #------------------------------------# $socket = new-object System.Net.Sockets.TcpClient($remoteHost, $port) if($socket -eq $null) { return; } $stream = $socket.GetStream() $writer = new-object System.IO.StreamWriter($stream) $buffer = new-object System.Byte[] 1024 $encoding = new-object System.Text.AsciiEncoding readResponse($stream) #-------------------------------------------------------# # SMTP COMMAND HELO OR EHLO - DEFAULT IS HELO # #-------------------------------------------------------# write-host -foregroundcolor yellow $HEL "" $writer.WriteLine($HEL) $writer.Flush() start-sleep -m 500 readResponse($stream) #---------------------------------------------------# # SMTP COMMAND Mail FROM # #---------------------------------------------------# $command = "MAIL FROM: $from" write-host -foregroundcolor yellow "MAIL FROM: $from" $writer.WriteLine($command) $writer.Flush() start-sleep -m 500 readResponse($stream) #---------------------------------------------------# # SMTP COMMAND RCPT TO # #---------------------------------------------------# $command = "RCPT TO: $To" write-host -foregroundcolor yellow $command $writer.WriteLine($command) $writer.Flush() start-sleep -m 500 readResponse($stream) #---------------------------------------------------# # SMTP COMMAND DATA # #---------------------------------------------------# write-host -foregroundcolor yellow $testMsg $writer.WriteLine($testMsg) $writer.Flush() start-sleep -m 500 readResponse($stream) #---------------------------------------------------# # CLOSING SMTP CONNECTION # #---------------------------------------------------# $command = "QUIT" write-host -foregroundcolor yellow $command "" $writer.WriteLine($command) $writer.Flush() start-sleep -m 500 readResponse($stream) ## Close the streams $writer.Close() $stream.Close() } Export-ModuleMember -Function Test-SmtpConnection
Test-SmtpConnection.psd1 file
The content of the psd1 file is shown hereafter.
@{ RootModule = 'Test-SmtpConnection.psm1' ModuleVersion = '1.0.0' Description= 'Emulate a Telnet SMTP connection to Exchange server' Author = 'Griffon - www.c-nergy.be' PowerShellVersion = '3.0' FunctionsToExport="*" HelpInfoURI = 'http://c-nergy.be/blog/?p=15266' }
Final Notes
This is it for this post !
We hope that you will enjoy this new cmdlet. This PowerShell script is now part of our Troubleshooting Toolkit because it’ s really easy to install and use and offer really a good alternative to the venerable Telnet solution. If you wish to provide feedback on it, do not hesitate. At a later stage, as mentioned earlier, we might want to publish this module into the PowerShell Gallery to further ease the distribution
Till next time
See ya