# encoding: ascii
# api: csharp
# title: PoSh Email Tester GUI
# description: GUI front-end for Send-MailMessage set up as a Testing program. Useful for Email Administrators who want to send a quick test email.
# version: 1.0
# type: script
# author: Bryan Jaudon
# license: CC0
# function: OpenFile-Dialog
# x-poshcode-id: 3733
# x-archived: 2012-11-04T00:26:07
# x-published: 2012-10-31T13:24:00
#
# Script tested and works fully in PowerShell 3.0 and Windows 8. PowerShell Version 2.0 seems to have an issue bringing up the Get-Credentials dialog from the form, but otherwise works fine for Anonymous authentication.
#
<#

    .NOTES
    Name     : PoSh Email Tester GUI
    Author   : Bryan Jaudon <bryan.jaudon@gmail.com>
    Version  : 1.0
    Date     : 10/30/2012

    .Description
    GUI Email tester program utilizing PowerShell Send-MailMessage cmdlet.

#>

#requires -version 2

#region IconExtrator TypeDef
$code = @"
using System;
using System.Drawing;
using System.Runtime.InteropServices;

namespace System
{
	public class IconExtractor
	{

	 public static Icon Extract(string file, int number, bool largeIcon)
	 {
	  IntPtr large;
	  IntPtr small;
	  ExtractIconEx(file, number, out large, out small, 1);
	  try
	  {
	   return Icon.FromHandle(largeIcon ? large : small);
	  }
	  catch
	  {
	   return null;
	  }

	 }
	 [DllImport("Shell32.dll", EntryPoint = "ExtractIconExW", CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
	 private static extern int ExtractIconEx(string sFile, int iIndex, out IntPtr piLargeVersion, out IntPtr piSmallVersion, int amountIcons);

	}
}
"@

Add-Type -TypeDefinition $code -ReferencedAssemblies System.Drawing
#endregion

#region Import the Assemblies
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null
[System.Windows.Forms.Application]::EnableVisualStyles()
#endregion

#Generated Form Function
function GenerateForm {
########################################################################
# Code Generated By: SAPIEN Technologies PrimalForms (Community Edition) v1.0.10.0
# Generated On: 10/30/2012 8:26 AM
# Generated By: bjaudon
########################################################################

#region Generated Form Objects
$frmTester = New-Object System.Windows.Forms.Form
$lnkCredential = New-Object System.Windows.Forms.LinkLabel
$lblCredential = New-Object System.Windows.Forms.Label
$cbSSL = New-Object System.Windows.Forms.CheckBox
$tbSMTPServer = New-Object System.Windows.Forms.TextBox
$lblSMTPServer = New-Object System.Windows.Forms.Label
$lblAttachment = New-Object System.Windows.Forms.Label
$btnBrowse = New-Object System.Windows.Forms.Button
$tbAttachment = New-Object System.Windows.Forms.TextBox
$btnSend = New-Object System.Windows.Forms.Button
$btnExit = New-Object System.Windows.Forms.Button
$tbBody = New-Object System.Windows.Forms.TextBox
$tbSubject = New-Object System.Windows.Forms.TextBox
$lblSubject = New-Object System.Windows.Forms.Label
$tbFrom = New-Object System.Windows.Forms.TextBox
$lblFrom = New-Object System.Windows.Forms.Label
$tbTo = New-Object System.Windows.Forms.TextBox
$lblTo = New-Object System.Windows.Forms.Label
$pbIcon = New-Object System.Windows.Forms.PictureBox
$lblTitle = New-Object System.Windows.Forms.Label
$openFileDialog1 = New-Object System.Windows.Forms.OpenFileDialog
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
#endregion Generated Form Objects

#----------------------------------------------
#Generated Event Script Blocks
#----------------------------------------------
#Provide Custom Code for events specified in PrimalForms.


$handler_lnkCredential_LinkClicked= 
{
#TODO: Place custom script here
    try { $script:Credentials=Get-Credential -Message "Please enter your SMTP Server credentials." }
    catch { $script:Credentials=$null }
    finally { 
        if ($script:Credentials -eq $null) { $lnkCredential.Text = "Anonymous" }
        else { $lnkCredential.Text = $script:Credentials.UserName }
    }

}

$btnBrowse_OnClick= 
{
#TODO: Place custom script here
    $tbAttachment.Text=OpenFile-Dialog
}

$btnSend_OnClick= 
{
#TODO: Place custom script here

    $GUID=[guid]::NewGuid()

    try { SendMail -To $tbTo.Text -From $tbFrom.Text -Subject $tbSubject.Text -SMTPServer $tbSMTPServer.Text -Attachment $tbAttachment.Text -Body "$($tbBody.Text)`r`n`r`nEmail ID: $GUID" -SSL $cbSSL.Checked -Credential $Script:Credentials }
    catch { ShowPrompt -Message $_ -Icon Error -Buttons OK; return }
    ShowPrompt -Message "Email was sent successfully!`n`nEmail ID: $GUID" -Icon Information -Buttons OK
}

$OnLoadForm_StateCorrection=
{#Correct the initial state of the form to prevent the .Net maximized form issue
	$frmTester.WindowState = $InitialFormWindowState
}

#----------------------------------------------
#region Generated Form Code
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 469
$System_Drawing_Size.Width = 553
$frmTester.ClientSize = $System_Drawing_Size
$frmTester.DataBindings.DefaultDataSourceUpdateMode = 0
$frmTester.FormBorderStyle = 1
$frmTester.Name = "frmTester"
$frmTester.Text = "PoSh Email Tester"
$frmTester.Icon = [System.IconExtractor]::Extract("shell32.dll",156,$true)

$lnkCredential.AutoEllipsis = $True
$lnkCredential.DataBindings.DefaultDataSourceUpdateMode = 0

$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 392
$System_Drawing_Point.Y = 68
$lnkCredential.Location = $System_Drawing_Point
$lnkCredential.Name = "lnkCredential"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 146
$lnkCredential.Size = $System_Drawing_Size
$lnkCredential.TabIndex = 1
$lnkCredential.TabStop = $True
$lnkCredential.Text = "Anonymous"
$lnkCredential.TextAlign = 16
$lnkCredential.VisitedLinkColor = [System.Drawing.Color]::FromArgb(255,0,0,255)
$lnkCredential.add_LinkClicked($handler_lnkCredential_LinkClicked)

$frmTester.Controls.Add($lnkCredential)

$lblCredential.DataBindings.DefaultDataSourceUpdateMode = 0

$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 327
$System_Drawing_Point.Y = 68
$lblCredential.Location = $System_Drawing_Point
$lblCredential.Name = "lblCredential"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 59
$lblCredential.Size = $System_Drawing_Size
$lblCredential.TabIndex = 15
$lblCredential.Text = "Credential:"
$lblCredential.TextAlign = 16

$frmTester.Controls.Add($lblCredential)


$cbSSL.DataBindings.DefaultDataSourceUpdateMode = 0

$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 13
$System_Drawing_Point.Y = 434
$cbSSL.Location = $System_Drawing_Point
$cbSSL.Name = "cbSSL"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 140
$cbSSL.Size = $System_Drawing_Size
$cbSSL.TabIndex = 6
$cbSSL.Text = "Send &using SSL/TLS"
$cbSSL.UseVisualStyleBackColor = $True

$frmTester.Controls.Add($cbSSL)

$tbSMTPServer.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 94
$System_Drawing_Point.Y = 71
$tbSMTPServer.Location = $System_Drawing_Point
$tbSMTPServer.Name = "tbSMTPServer"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 20
$System_Drawing_Size.Width = 216
$tbSMTPServer.Size = $System_Drawing_Size
$tbSMTPServer.TabIndex = 0

$frmTester.Controls.Add($tbSMTPServer)

$lblSMTPServer.DataBindings.DefaultDataSourceUpdateMode = 0

$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 13
$System_Drawing_Point.Y = 69
$lblSMTPServer.Location = $System_Drawing_Point
$lblSMTPServer.Name = "lblSMTPServer"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 75
$lblSMTPServer.Size = $System_Drawing_Size
$lblSMTPServer.TabIndex = 14
$lblSMTPServer.Text = "SMTP Server:"
$lblSMTPServer.TextAlign = 16

$frmTester.Controls.Add($lblSMTPServer)

$lblAttachment.DataBindings.DefaultDataSourceUpdateMode = 0

$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 13
$System_Drawing_Point.Y = 204
$lblAttachment.Location = $System_Drawing_Point
$lblAttachment.Name = "lblAttachment"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 75
$lblAttachment.Size = $System_Drawing_Size
$lblAttachment.TabIndex = 13
$lblAttachment.Text = "Attachment:"
$lblAttachment.TextAlign = 16

$frmTester.Controls.Add($lblAttachment)


$btnBrowse.DataBindings.DefaultDataSourceUpdateMode = 0

$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 463
$System_Drawing_Point.Y = 207
$btnBrowse.Location = $System_Drawing_Point
$btnBrowse.Name = "btnBrowse"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 75
$btnBrowse.Size = $System_Drawing_Size
$btnBrowse.TabIndex = 4
$btnBrowse.Text = "B&rowse..."
$btnBrowse.UseVisualStyleBackColor = $True
$btnBrowse.add_Click($btnBrowse_OnClick)

$frmTester.Controls.Add($btnBrowse)

$tbAttachment.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 94
$System_Drawing_Point.Y = 208
$tbAttachment.Location = $System_Drawing_Point
$tbAttachment.Name = "tbAttachment"
$tbAttachment.ReadOnly = $True
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 20
$System_Drawing_Size.Width = 363
$tbAttachment.Size = $System_Drawing_Size
$tbAttachment.TabIndex = 0
$tbAttachment.TabStop = $False

$frmTester.Controls.Add($tbAttachment)


$btnSend.DataBindings.DefaultDataSourceUpdateMode = 0

$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 382
$System_Drawing_Point.Y = 434
$btnSend.Location = $System_Drawing_Point
$btnSend.Name = "btnSend"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 75
$btnSend.Size = $System_Drawing_Size
$btnSend.TabIndex = 7
$btnSend.Text = "&Send"
$btnSend.UseVisualStyleBackColor = $True
$btnSend.add_Click($btnSend_OnClick)

$frmTester.Controls.Add($btnSend)


$btnExit.DataBindings.DefaultDataSourceUpdateMode = 0
$btnExit.DialogResult = 2

$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 463
$System_Drawing_Point.Y = 434
$btnExit.Location = $System_Drawing_Point
$btnExit.Name = "btnExit"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 75
$btnExit.Size = $System_Drawing_Size
$btnExit.TabIndex = 8
$btnExit.Text = "E&xit"
$btnExit.UseVisualStyleBackColor = $True

$frmTester.Controls.Add($btnExit)

$tbBody.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 13
$System_Drawing_Point.Y = 241
$tbBody.Location = $System_Drawing_Point
$tbBody.Multiline = $True
$tbBody.Name = "tbBody"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 173
$System_Drawing_Size.Width = 526
$tbBody.Size = $System_Drawing_Size
$tbBody.TabIndex = 5
$tbBody.Text = "This is a test email message from PoSh Email Tester. "

$frmTester.Controls.Add($tbBody)

$tbSubject.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 94
$System_Drawing_Point.Y = 167
$tbSubject.Location = $System_Drawing_Point
$tbSubject.Name = "tbSubject"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 20
$System_Drawing_Size.Width = 445
$tbSubject.Size = $System_Drawing_Size
$tbSubject.TabIndex = 3
$tbSubject.Text = "PoSh Email Tester - Test Email"

$frmTester.Controls.Add($tbSubject)

$lblSubject.DataBindings.DefaultDataSourceUpdateMode = 0

$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 13
$System_Drawing_Point.Y = 165
$lblSubject.Location = $System_Drawing_Point
$lblSubject.Name = "lblSubject"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 75
$lblSubject.Size = $System_Drawing_Size
$lblSubject.TabIndex = 6
$lblSubject.Text = "Subject:"
$lblSubject.TextAlign = 16

$frmTester.Controls.Add($lblSubject)

$tbFrom.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 94
$System_Drawing_Point.Y = 102
$tbFrom.Location = $System_Drawing_Point
$tbFrom.Name = "tbFrom"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 20
$System_Drawing_Size.Width = 445
$tbFrom.Size = $System_Drawing_Size
$tbFrom.TabIndex = 1
$tbFrom.Text = "test@test.com"

$frmTester.Controls.Add($tbFrom)

$lblFrom.DataBindings.DefaultDataSourceUpdateMode = 0

$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 13
$System_Drawing_Point.Y = 100
$lblFrom.Location = $System_Drawing_Point
$lblFrom.Name = "lblFrom"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 75
$lblFrom.Size = $System_Drawing_Size
$lblFrom.TabIndex = 4
$lblFrom.Text = "From:"
$lblFrom.TextAlign = 16

$frmTester.Controls.Add($lblFrom)

$tbTo.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 94
$System_Drawing_Point.Y = 134
$tbTo.Location = $System_Drawing_Point
$tbTo.Name = "tbTo"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 20
$System_Drawing_Size.Width = 445
$tbTo.Size = $System_Drawing_Size
$tbTo.TabIndex = 2

$frmTester.Controls.Add($tbTo)

$lblTo.DataBindings.DefaultDataSourceUpdateMode = 0

$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 13
$System_Drawing_Point.Y = 132
$lblTo.Location = $System_Drawing_Point
$lblTo.Name = "lblTo"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 75
$lblTo.Size = $System_Drawing_Size
$lblTo.TabIndex = 2
$lblTo.Text = "To:"
$lblTo.TextAlign = 16

$frmTester.Controls.Add($lblTo)


$pbIcon.BackgroundImageLayout = 3
$pbIcon.DataBindings.DefaultDataSourceUpdateMode = 0

$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 13
$System_Drawing_Point.Y = 9
$pbIcon.Location = $System_Drawing_Point
$pbIcon.Name = "pbIcon"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 48
$System_Drawing_Size.Width = 48
$pbIcon.Size = $System_Drawing_Size
$pbIcon.SizeMode = 1
$pbIcon.TabIndex = 1
$pbIcon.TabStop = $False
$pbIcon.Image = [System.IconExtractor]::Extract("shell32.dll",156,$true)

$frmTester.Controls.Add($pbIcon)

$lblTitle.DataBindings.DefaultDataSourceUpdateMode = 0
$lblTitle.Font = New-Object System.Drawing.Font("Trebuchet MS",9.75,1,3,1)

$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 76
$System_Drawing_Point.Y = 21
$lblTitle.Location = $System_Drawing_Point
$lblTitle.Name = "lblTitle"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 463
$lblTitle.Size = $System_Drawing_Size
$lblTitle.TabIndex = 0
$lblTitle.Text = "PoSh Email Tester 1.0"
$lblTitle.TextAlign = 16

$frmTester.Controls.Add($lblTitle)

$openFileDialog1.Filter = "All Files (*.*)|*.*"
$openFileDialog1.ShowHelp = $True

#endregion Generated Form Code

#Save the initial state of the form
$InitialFormWindowState = $frmTester.WindowState
#Init the OnLoad event to correct the initial state of the form
$frmTester.add_Load($OnLoadForm_StateCorrection)
#Show the Form
$frmTester.ShowDialog()| Out-Null

} #End Function


Function OpenFile-Dialog {
    $open=$OpenFileDialog1.ShowDialog()
    #If the Open button is pressed
    if ($open -eq "OK") { 
        #If our source and destination are the same file
        
        #Set our source to the chosen file
        return $OpenFileDialog1.FileName
        
    }
    #If cancel is pressed
    else { return }
}

Function ShowPrompt {
    param ($Message,$Buttons,$Icon,$DefaultButton="button1")
    return [System.Windows.Forms.MessageBox]::Show($Message,$frmTester.Text,$Buttons,$Icon,$DefaultButton)
}

Function SendMail {
    param ($To,$From,$Subject,$Attachment,$SMTPServer,$Body,$SSL,$Credential)
    $MailMessageParams=@{
        "To"=$To
        "From"=$From
        "Subject"=$Subject
        "SMTPServer"=$SMTPServer
        "Body"=$Body
        "UseSSL"=$SSL
    }
    if ($Attachment) { $MailMessageParams.Add("Attachment",$Attachment) }
    if ($Credential) { $MailMessageParams.Add("Credential",$Credential) }
    Send-MailMessage @MailMessageParams -ErrorAction STOP
    
}


#Call the Function
GenerateForm
