Created
May 25, 2015 09:25
-
-
Save ser1zw/a6292f382a4b9dca2fe4 to your computer and use it in GitHub Desktop.
E-mail tool in PowerShell
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
################################################################################ | |
# E-mail tool in PowerShell | |
# | |
# 0. Set execution policy to "RemoteSighed" in PowerShell | |
# Set-ExecutionPolicy RemoteSigned | |
# | |
# 1. Right click this file and select "Run with PowerShell" from context menus. | |
# Or run the following command in cmd.exe. | |
# powershell -Sta -File send-message.ps1 | |
# | |
# 2. Drag & drop *.eml files to send. | |
# | |
# 3. Configure "Server", "Port", "MAIL FROM", "RCPT TO". | |
# | |
# 4. Click [Send] button. | |
################################################################################ | |
Add-Type -AssemblyName PresentationFramework | |
$encoding = New-Object System.Text.AsciiEncoding | |
Function SendCommand($stream, $writer, $command) { | |
# Send command | |
foreach ($line in $command) { | |
$writer.WriteLine($line) | |
} | |
$writer.Flush() | |
Start-Sleep -m 100 | |
# Get response | |
$buff = New-Object System.Byte[] 4096 | |
$output = "" | |
while ($True) { | |
$size = $stream.Read($buff, 0, $buff.Length) | |
if ($size -gt 0) { | |
$output += $encoding.GetString($buff, 0, $size) | |
} | |
if (($size -lt $buff.Length) -or ($size -le 0)) { | |
break | |
} | |
} | |
if ([int]::Parse($output[0]) -gt 3) { | |
throw $output | |
} | |
$output | |
} | |
Function SendMessage($server, $port, $mailfrom, $rcptto, $filename) { | |
try { | |
$socket = New-Object System.Net.Sockets.TcpClient($server, $port) | |
$stream = $socket.GetStream() | |
$stream.ReadTimeout = 1000 | |
$writer = New-Object System.IO.StreamWriter $stream | |
$endOfMessage = "`r`n." | |
SendCommand $stream $writer ("EHLO " + $server) | |
SendCommand $stream $writer ("MAIL FROM: <" + $mailfrom + ">") | |
SendCommand $stream $writer ("RCPT TO: <" + $rcptto + ">") | |
SendCommand $stream $writer "DATA" | |
$content = (Get-Content $filename) -join "`r`n" | |
SendCommand $stream $writer ($content + $endOfMessage) | |
SendCommand $stream $writer "QUIT" | |
} | |
finally { | |
if ($writer -ne $Null) { | |
$writer.Close() | |
} | |
if ($socket -ne $Null) { | |
$socket.Close() | |
} | |
} | |
} | |
Function Main() { | |
[Xml]$xaml = @" | |
<Window | |
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |
Title="SendMessage" Height="400" Width="360" AllowDrop="True"> | |
<StackPanel Orientation="Vertical" Margin="3"> | |
<Grid Margin="10" Height="120"> | |
<Grid.RowDefinitions> | |
<RowDefinition Height="30"/> | |
<RowDefinition Height="30"/> | |
<RowDefinition Height="30"/> | |
<RowDefinition Height="30"/> | |
</Grid.RowDefinitions> | |
<Grid.ColumnDefinitions> | |
<ColumnDefinition Width="100"/> | |
<ColumnDefinition Width="*"/> | |
</Grid.ColumnDefinitions> | |
<Label VerticalAlignment="Top">Server:</Label> | |
<TextBox Name="server" Text="localhost" VerticalAlignment="Top" Grid.Column="1" /> | |
<Label VerticalAlignment="Top" Margin="0" Grid.Row="1">Port:</Label> | |
<TextBox Name="port" Text="25" VerticalAlignment="Top" Grid.Row="1" Grid.Column="1"/> | |
<Label VerticalAlignment="Top" Grid.Row="2">MAIL FROM:</Label> | |
<TextBox Name="mailFrom" Text="[email protected]" VerticalAlignment="Top" Grid.Row="2" Grid.Column="1"/> | |
<Label VerticalAlignment="Top" Grid.Row="3">RCPT TO:</Label> | |
<TextBox Name="rcptTo" Text="[email protected]" VerticalAlignment="Top" Grid.Row="3" Grid.Column="1"/> | |
</Grid> | |
<Label Width="Auto">Files:</Label> | |
<ListBox Name="files" Width="Auto" Height="Auto" MinHeight="120"></ListBox> | |
<Button Name="send" Content="Send" /> | |
<Button Name="clear" Content="Clear" /> | |
</StackPanel> | |
</Window> | |
"@ | |
$reader = New-Object System.Xml.XmlNodeReader $xaml | |
$window = [Windows.Markup.XamlReader]::Load($reader) | |
$textbox = $window.FindName("server") | |
$listBox = $window.FindName("files") | |
$sendButton = $window.FindName("send") | |
$sendButton.add_Click.Invoke({ | |
$server = $window.FindName("server").Text | |
$port = $window.FindName("port").Text | |
$mailfrom = $window.FindName("mailFrom").Text | |
$rcptto = $window.FindName("rcptTo").Text | |
foreach ($filename in $listBox.ItemsSource) { | |
try { | |
SendMessage $server $port $mailfrom $rcptto $filename | |
} | |
catch [Exception] { | |
[System.Windows.MessageBox]::Show($Error[0], "Error") | |
} | |
} | |
}) | |
$clearButton = $window.FindName("clear") | |
$clearButton.add_Click.Invoke({ | |
$listBox.ItemsSource = @() | |
}) | |
$listBox.ItemsSource = @() | |
$window.add_Drop({ | |
foreach ($file in $_.Data.GetFileDropList()) { | |
Write-Host $file | |
if ($file -is [IO.FileInfo]) { | |
$listBox.ItemsSource += $file | |
} | |
else { | |
$listBox.ItemsSource += dir $file -recurse | ? { $_ -is [IO.FileInfo] } | % { $_.FullName } | |
} | |
} | |
}) | |
$window.ShowDialog() | Out-Null | |
} | |
$execState = [Threading.Thread]::CurrentThread.GetApartmentState() | |
if ($execState -eq "STA") { | |
Main | Out-Null | |
} | |
else { | |
powershell -Sta -File $MyInvocation.MyCommand.Path | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment