SMTP_Relay_Test.ps1

<#==============================================================================
         File Name : SMTP_Relay_Test.ps1
   Original Author : Kenneth C. Mazie (kcmjr AT kcmjr.com)
                   :
       Description : This script will send an email to the selected user,
                   : SMTP host, and SMTP port.
                   :
                   : The target email and server IP are stored and recalled for
                   : subsequent runs.
                   :
             Notes : Normal operation is with no command line options.
                   :
          Warnings : None
                   :
             Legal : Public Domain. Modify and redistribute freely. No rights reserved.
                   : SCRIPT PROVIDED "AS IS" WITHOUT WARRANTIES OR GUARANTEES OF
                   : ANY KIND. USE AT YOUR OWN RISK. NO TECHNICAL SUPPORT PROVIDED.
                   : That being said, please let me know if you find any bugs.
                   :
           Credits : Code snippets and/or ideas came from many sources including but
                   : not limited to the following:
                   :
    Last Update by : Kenneth C. Mazie
   Version History : v1.00 - 06-26-12 - Original
                   : #>

$CurrentVersion = "1.00"
               <# :
    Change History : v1.10 - 00-00-00 -
                   :
===============================================================================#>

<#PSScriptInfo
.VERSION 1.00
.GUID 3d2c1f4a-a9fe-4b46-9864-d32a40326be7
.AUTHOR Kenneth C. Mazie (kcmjr AT kcmjr.com)
.DESCRIPTION
GUI drive SMTP test. Sends a quick and dirty test email to the recipient of your choice via the SMTP server of your choice.
#>


Clear-Host
[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") | Out-null 
[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null

#--[ Variables ]--
[string]$Username = "user@domain.com"     #--[ SSL authentication user. Adjust per environment
[string]$Password = "Password"            #--[ SSL password. Adjust per environment
$erroractionpreference = "continue"

if (!(Test-Path -pathtype Container "C:\Scripts")){
    new-item C:\Scripts -itemType Directory -Force                                                  #--[ Create local scripts folder.
}

if (Test-Path c:\Scripts\eMailRecipient.txt) {
    [string]$eMailRecipient = Get-Content c:\Scripts\eMailRecipient.txt           #--[ This should be stored as email@domain.com, one line, one entry only
    [string]$eMailDomain = $eMailRecipient.Split("@")[1]
}else{
    [string]$eMailRecipient = ""
    [string]$eMailDomain = ""
} 

if (Test-Path c:\Scripts\eMailServer.txt) {
    [string]$SMTPserver = Get-Content c:\Scripts\eMailServer.txt                        #--[ This should be stored as one line, one entry only
}else{
    [string]$SMTPserver = ""
}

$date = Get-Date
[int]$FormWidth = 350
[int]$FormHeight = 240
$fcenter = ($fswidth / 2)
[int]$ButtonLeft = 55
[int]$ButtonTop = 167

#--[ FQDN of the local computer ]--
$objCompSys = Get-WmiObject win32_computersystem
$localComputer = $objCompSys.name+"."+$objCompSys.domain
Remove-Variable objCompSys

#--[ Functions ]--
Function ProcessMessage {
    New-Item c:\Scripts\eMailRecipient.txt -type file -Value "$eMailRecipient@$eMailDomain" -Force -Confirm:$false        #--[ Who to send status email to.
    New-Item c:\Scripts\eMailServer.txt -type file -Value "$SMTPserver" -Force -Confirm:$false          #--[ What server to send through.
    $MailMessage = New-Object System.Net.Mail.MailMessage
    $MailMessage.IsBodyHtml = $true
    $SMTPserverClient = New-Object System.Net.Mail.smtpClient
    $SMTPserverClient.host = $SMTPserver
    If ($P465RadioButton.checked){
        $SMTPport = 465
        $SMTPserverClient.EnableSsl = $true
        $SMTPserverClient.Credentials = New-Object System.Net.NetworkCredential($Username, $Password);
    }

    If ($P25RadioButton.checked){
        $SMTPport = 25
        $SMTPserverClient.EnableSsl = $false
        $SMTPserverClient.Credentials = $null
    }
    
    #--[ Build Message Body ]--
    $strBody = "
    <html><body>
    <p>This is a SMTP test email. Below are the details specific to this test email:
    <p>
    <table border='1'>
        <TR>
            <th WIDTH='50%'>Originating Computer</th>
            <th WIDTH='50%'>$localComputer</th>
        </TR>
        <TR>
            <th WIDTH='50%'>SMTP Server Address</th>
            <th WIDTH='50%'>$SMTPserver</th>
        </TR>
        <TR>
            <th WIDTH='50%'>SMTP Server Port</th>
            <th WIDTH='50%'>$SMTPport</th>
        </TR>
        <TR>
            <th WIDTH='50%'>Return Address (Sender)</th>
            <th WIDTH='50%'>SMTPtest@$eMailDomain</th>
        </TR>
        <TR>
            <th WIDTH='50%'>Recipient</th>
            <th WIDTH='50%'>$eMailRecipient@$eMailDomain</th>
        </TR>
        <TR>
            <th WIDTH='50%'>Date / Time</th>
            <th WIDTH='50%'>$date</th>
        </TR>
    </table>
    <p> The SMTP test has <b>COMPLETED SUCCESSFULLY</b> if you receive this email!
    </body></html>
    "


    $Recipient = New-Object System.Net.Mail.MailAddress("$eMailRecipient@$eMailDomain")
    $Sender = New-Object System.Net.Mail.MailAddress("SMTPtest@$eMailDomain")
    $SMTPserverClient.port = $SMTPport
    $MailMessage.Subject = "Test SMTP email over port $SMTPport from $SMTPserver"
    $MailMessage.Sender = $Sender
    $MailMessage.From = $Sender
    $MailMessage.To.add($Recipient)
    $MailMessage.Body = $strBody

    Try {
        $SMTPserverClient.Send($MailMessage)
    } Catch {
        [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
        [Windows.Forms.MessageBox]::Show($Error[0], "Error Sending Email", [Windows.Forms.MessageBoxButtons]::OK, [Windows.Forms.MessageBoxIcon]::Information)
    }
    $objForm.Close()
}

#-----------------------------[ Main Process ]----------------------------------
#--[ Create Form ]--
$objForm = new-object System.Windows.Forms.form
$objForm.Text = "SMTP Test Script"
$objForm.size = new-object System.Drawing.Size($FormWidth,$FormHeight)
$objForm.StartPosition = "CenterScreen"

$objForm.KeyPreview = $true
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter"){$Recipient=$objTextBox.Text;$objForm.Close()}})
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape"){$objForm.Close();$Stop = $true}})

#--[ Add Form Label ]--
$objFormLabelBox = new-object System.Windows.Forms.Label
$objFormLabelBox.Font = new-object System.Drawing.Font("New Times Roman",9,[System.Drawing.FontStyle]::Bold)
$objFormLabelBox.Location = new-object System.Drawing.Size(38,5)
$objFormLabelBox.size = new-object System.Drawing.Size(400,20)
$objFormLabelBox.Text = "Select SMTP test parameters to use:"
$objForm.Controls.Add($objFormLabelBox)

#--[ Add port 25 Radio Button ]--
$P25RadioButton = New-Object Windows.Forms.radiobutton
$P25RadioButton.text = "Use Port 25 (anonymous connection)"
$P25RadioButton.height = 20
$P25RadioButton.width = 220
$P25RadioButton.top = 113
$P25RadioButton.left = 65
$P25RadioButton.checked = $true
$objForm.controls.add($P25RadioButton)

#--[ Add SSL Radio Button ]--
$P465RadioButton = New-Object Windows.Forms.radiobutton
$P465RadioButton.text = "Use Port 465 (SSL connection)"
$P465RadioButton.height = 20
$P465RadioButton.width = 220
$P465RadioButton.top = 135
$P465RadioButton.left = 65
#$P465RadioButton.checked = $true
$objForm.controls.add($P465RadioButton)

#--[ Add Email Form Label ]--
$objLabel1 = New-Object System.Windows.Forms.Label
$objLabel1.Location = New-Object System.Drawing.Point(20,25)
$objLabel1.Size = New-Object System.Drawing.Size(280,20)
$objLabel1.Text = "Enter the email address where results should be sent:"
$objLabel1.TextAlign = [System.Drawing.ContentAlignment]::MiddleCenter
$objForm.Controls.Add($objLabel1)

#--[ Add Email Text Input Box ]--
$objTextBox1 = New-Object System.Windows.Forms.TextBox
$objTextBox1.Location = New-Object System.Drawing.Size(54,48)
$objTextBox1.Size = New-Object System.Drawing.Size(100,20)
#if (Test-Path c:\Scripts\eMailRecipient.txt) {
    $objTextBox1.Text = $eMailRecipient.split("@")[0]
#}
$objForm.Controls.Add($objTextBox1)

#--[ Add Email Domain Input Box ]--
$objLabel2 = New-Object System.Windows.Forms.Label
$objLabel2.Location = New-Object System.Drawing.Point(153,50)
$objLabel2.Size = New-Object System.Drawing.Size(14,20)
$objLabel2.Text = "@"
$objForm.Controls.Add($objLabel2)

#--[ Add Email @ Label ]--
$objTextBox2 = New-Object System.Windows.Forms.TextBox
$objTextBox2.Location = New-Object System.Drawing.Point(170,48)
$objTextBox2.Size = New-Object System.Drawing.Size(100,20)
$objTextBox2.Text = $eMailDomain
$objForm.Controls.Add($objTextBox2)
#$eMailDomain = $objTextBox2.Text

#--[ Add SMTP Host Form Lable ]--
$objLabel3 = New-Object System.Windows.Forms.Label
$objLabel3.Location = New-Object System.Drawing.Point(25,70)
$objLabel3.Size = New-Object System.Drawing.Size(280,20)
$objLabel3.Text = "Enter the SMTP server to use:"
$objLabel3.TextAlign = [System.Drawing.ContentAlignment]::MiddleCenter
$objForm.Controls.Add($objLabel3)

#--[ Add SMTP Host Input Box ]--
$objTextBox3 = New-Object System.Windows.Forms.TextBox
$objTextBox3.Location = New-Object System.Drawing.Size(115,93)
$objTextBox3.Size = New-Object System.Drawing.Size(100,20)
#if (Test-Path c:\Scripts\eMailServer.txt) {
 $objTextBox3.Text = $SMTPserver
#}
$objForm.Controls.Add($objTextBox3)
#$SMTPserver = $objTextBox3.Text

#--[ Add GO Button ]--
$objProcessButton = new-object System.Windows.Forms.Button
$objProcessButton.Location = new-object System.Drawing.Size($ButtonLeft,$ButtonTop)
$objProcessButton.Size = new-object System.Drawing.Size(100,25)
$objProcessButton.Text = "Send Email"
$objProcessButton.Add_Click({$to=$objTextBox1.Text;$SMTPserver=$objTextBox3.Text;$eMailRecipient=$objTextBox1.Text;$eMailDomain=$objTextBox2.Text;ProcessMessage;$objForm.Close()})
$objForm.Controls.Add($objProcessButton)

#--[ Add STOP Button ]--
$objCloseButton = new-object System.Windows.Forms.Button
$objCloseButton.Location = new-object System.Drawing.Size(($ButtonLeft+125),$ButtonTop)
$objCloseButton.Size = new-object System.Drawing.Size(100,25)
$objCloseButton.Text = "Cancel/Close"
$objCloseButton.Add_Click({$objForm.close()})
$objForm.Controls.Add($objCloseButton)

#--[ Open Form ]--
$objForm.topmost = $true
$objForm.Add_Shown({$objForm.Activate()})
$objForm.ShowDialog()