Отправка письма из Powershell

Будучи системным администратором почты на Microsoft Exchange мне часто приходится отправлять письма. Обычно сотрудники коммерческого департамента просят отправить письмо с общего ящика. Ясное дело, мне совсем не нужно подключать эти ящики к себе. Да и отправить обычно просят простенький текст и вложение, обычно КП. Отправка письма из Powershell без подключения ящика решила мои проблемы. Для удобства добавил немного окон. Посмотрим что получилось.

Подключим использование GUI
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 

От кого отправляем письмо
$objForm = New-Object System.Windows.Forms.Form 
$objForm.Text = "Отправитель"
$objForm.Size = New-Object System.Drawing.Size(300,200) 
$objForm.StartPosition = "CenterScreen"

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

$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(75,120)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"
$OKButton.Add_Click({$objTextBox.Text;$objForm.Close()})
$objForm.Controls.Add($OKButton)

$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = New-Object System.Drawing.Size(150,120)
$CancelButton.Size = New-Object System.Drawing.Size(75,23)
$CancelButton.Text = "Cancel"
$CancelButton.Add_Click({$objForm.Close()})
$objForm.Controls.Add($CancelButton)

$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(10,20) 
$objLabel.Size = New-Object System.Drawing.Size(280,20) 
$objLabel.Text = "От какого ящика отправляем сообщение:"
$objForm.Controls.Add($objLabel) 

$objTextBox = New-Object System.Windows.Forms.TextBox 
$objTextBox.Location = New-Object System.Drawing.Size(10,40) 
$objTextBox.Size = New-Object System.Drawing.Size(260,20) 
$objForm.Controls.Add($objTextBox) 

$objForm.Topmost = $True

$objForm.Add_Shown({$objForm.Activate()})
[void] $objForm.ShowDialog()

$objTextBox.Text
От кого
Кому отправляем
$objForm2 = New-Object System.Windows.Forms.Form 
$objForm2.Text = "Получатель"
$objForm2.Size = New-Object System.Drawing.Size(300,200) 
$objForm2.StartPosition = "CenterScreen"

$objForm2.KeyPreview = $True
$objForm2.Add_KeyDown({if ($_.KeyCode -eq "Enter") 
    {$objTextBox2.Text;$objForm2.Close()}})
$objForm2.Add_KeyDown({if ($_.KeyCode -eq "Escape") 
    {$objForm2.Close()}})

$OKButton2 = New-Object System.Windows.Forms.Button
$OKButton2.Location = New-Object System.Drawing.Size(75,120)
$OKButton2.Size = New-Object System.Drawing.Size(75,23)
$OKButton2.Text = "OK"
$OKButton2.Add_Click({$objTextBox2.Text;$objForm2.Close()})
$objForm2.Controls.Add($OKButton2)

$CancelButton2 = New-Object System.Windows.Forms.Button
$CancelButton2.Location = New-Object System.Drawing.Size(150,120)
$CancelButton2.Size = New-Object System.Drawing.Size(75,23)
$CancelButton2.Text = "Cancel"
$CancelButton2.Add_Click({$objForm2.Close()})
$objForm2.Controls.Add($CancelButton2)

$objLabel2 = New-Object System.Windows.Forms.Label
$objLabel2.Location = New-Object System.Drawing.Size(10,20) 
$objLabel2.Size = New-Object System.Drawing.Size(280,20) 
$objLabel2.Text = "Кому отправляем сообщение:"
$objForm2.Controls.Add($objLabel2) 

$objTextBox2 = New-Object System.Windows.Forms.TextBox 
$objTextBox2.Location = New-Object System.Drawing.Size(10,40) 
$objTextBox2.Size = New-Object System.Drawing.Size(260,20) 
$objForm2.Controls.Add($objTextBox2) 

$objForm2.Topmost = $True

$objForm2.Add_Shown({$objForm2.Activate()})
[void] $objForm2.ShowDialog()

$objTextBox2.Text
Кому
Тема сообщения
$objForm3 = New-Object System.Windows.Forms.Form 
$objForm3.Text = "Тема"
$objForm3.Size = New-Object System.Drawing.Size(300,200) 
$objForm3.StartPosition = "CenterScreen"

$objForm3.KeyPreview = $True
$objForm3.Add_KeyDown({if ($_.KeyCode -eq "Enter") 
    {$objTextBox3.Text;$objForm3.Close()}})
$objForm3.Add_KeyDown({if ($_.KeyCode -eq "Escape") 
    {$objForm3.Close()}})

$OKButton3 = New-Object System.Windows.Forms.Button
$OKButton3.Location = New-Object System.Drawing.Size(75,120)
$OKButton3.Size = New-Object System.Drawing.Size(75,23)
$OKButton3.Text = "OK"
$OKButton3.Add_Click({$objTextBox3.Text;$objForm3.Close()})
$objForm3.Controls.Add($OKButton3)

$CancelButton3 = New-Object System.Windows.Forms.Button
$CancelButton3.Location = New-Object System.Drawing.Size(150,120)
$CancelButton3.Size = New-Object System.Drawing.Size(75,23)
$CancelButton3.Text = "Cancel"
$CancelButton3.Add_Click({$objForm3.Close()})
$objForm3.Controls.Add($CancelButton3)

$objLabel3 = New-Object System.Windows.Forms.Label
$objLabel3.Location = New-Object System.Drawing.Size(10,20) 
$objLabel3.Size = New-Object System.Drawing.Size(280,20) 
$objLabel3.Text = "Напишите тему сообщения:"
$objForm3.Controls.Add($objLabel3) 

$objTextBox3 = New-Object System.Windows.Forms.TextBox 
$objTextBox3.Location = New-Object System.Drawing.Size(10,40) 
$objTextBox3.Size = New-Object System.Drawing.Size(260,20) 
$objForm3.Controls.Add($objTextBox3) 

$objForm3.Topmost = $True

$objForm3.Add_Shown({$objForm3.Activate()})
[void] $objForm3.ShowDialog()

$objTextBox3.Text
Тема сообщения
Текст письма
$objForm4 = New-Object System.Windows.Forms.Form 
$objForm4.Text = "Текст сообщения"
$objForm4.Size = New-Object System.Drawing.Size(300,200) 
$objForm4.StartPosition = "CenterScreen"

$objForm4.KeyPreview = $True
$objForm4.Add_KeyDown({if ($_.KeyCode -eq "Enter") 
    {$objTextBox4.Text;$objForm4.Close()}})
$objForm4.Add_KeyDown({if ($_.KeyCode -eq "Escape") 
    {$objForm4.Close()}})

$OKButton4 = New-Object System.Windows.Forms.Button
$OKButton4.Location = New-Object System.Drawing.Size(75,120)
$OKButton4.Size = New-Object System.Drawing.Size(75,23)
$OKButton4.Text = "OK"
$OKButton4.Add_Click({$objTextBox4.Text;$objForm4.Close()})
$objForm4.Controls.Add($OKButton4)

$CancelButton4 = New-Object System.Windows.Forms.Button
$CancelButton4.Location = New-Object System.Drawing.Size(150,120)
$CancelButton4.Size = New-Object System.Drawing.Size(75,23)
$CancelButton4.Text = "Cancel"
$CancelButton4.Add_Click({$objForm4.Close()})
$objForm4.Controls.Add($CancelButton4)

$objLabel4 = New-Object System.Windows.Forms.Label
$objLabel4.Location = New-Object System.Drawing.Size(10,20) 
$objLabel4.Size = New-Object System.Drawing.Size(280,20) 
$objLabel4.Text = "Напишите текст сообщения:"
$objForm4.Controls.Add($objLabel4) 

$objTextBox4 = New-Object System.Windows.Forms.TextBox 
$objTextBox4.Location = New-Object System.Drawing.Size(10,40) 
$objTextBox4.Size = New-Object System.Drawing.Size(260,20) 
$objForm4.Controls.Add($objTextBox4) 

$objForm4.Topmost = $True

$objForm4.Add_Shown({$objForm4.Activate()})
[void] $objForm4.ShowDialog()

$objTextBox4.Text
$telo = $objTextBox4.Text | Out-String
Напишите сообщение
С уважением
$objForm5 = New-Object System.Windows.Forms.Form 
$objForm5.Text = "Кем представляемся?"
$objForm5.Size = New-Object System.Drawing.Size(300,200) 
$objForm5.StartPosition = "CenterScreen"

$objForm5.KeyPreview = $True
$objForm5.Add_KeyDown({if ($_.KeyCode -eq "Enter") 
    {$objTextBox5.Text;$objForm5.Close()}})
$objForm5.Add_KeyDown({if ($_.KeyCode -eq "Escape") 
    {$objForm5.Close()}})

$OKButton5 = New-Object System.Windows.Forms.Button
$OKButton5.Location = New-Object System.Drawing.Size(75,120)
$OKButton5.Size = New-Object System.Drawing.Size(75,23)
$OKButton5.Text = "OK"
$OKButton5.Add_Click({$objTextBox5.Text;$objForm5.Close()})
$objForm5.Controls.Add($OKButton5)

$CancelButton5 = New-Object System.Windows.Forms.Button
$CancelButton5.Location = New-Object System.Drawing.Size(150,120)
$CancelButton5.Size = New-Object System.Drawing.Size(75,23)
$CancelButton5.Text = "Cancel"
$CancelButton5.Add_Click({$objForm5.Close()})
$objForm5.Controls.Add($CancelButton5)

$objLabel5 = New-Object System.Windows.Forms.Label
$objLabel5.Location = New-Object System.Drawing.Size(10,20) 
$objLabel5.Size = New-Object System.Drawing.Size(280,20) 
$objLabel5.Text = "С уважением, :"
$objForm5.Controls.Add($objLabel5) 

$objTextBox5 = New-Object System.Windows.Forms.TextBox 
$objTextBox5.Location = New-Object System.Drawing.Size(10,40) 
$objTextBox5.Size = New-Object System.Drawing.Size(260,20) 
$objForm5.Controls.Add($objTextBox5) 

$objForm5.Topmost = $True

$objForm5.Add_Shown({$objForm5.Activate()})
[void] $objForm5.ShowDialog()

$objTextBox5.Text
$otkogo = $objTextBox5.Text | Out-String
Подпись
Указываем папку с вложениями
$fold = "C:\scripts\files"

В данном случае все файлы находящиеся по указанному пути будут отправлены скриптом. Поэтому не забывайте удалять файлы после отправки сообщения.


Создаем письмо и отправляем
$emailBody = @"
<p>$telo</p>
<p>С уважением,<BR>
$otkogo</p>
"@
$att = Get-ChildItem $fold | Where {-NOT $_.PSIsContainer} | foreach {$_.fullname} 
if ($att -ne $null) { 
send-mailmessage -to $objTextBox2.Text -from $objTextBox.Text -subject $objTextBox3.Text -Body "$emailBody" -BodyAsHtml -Attachments $att -Encoding ([System.Text.Encoding]::UTF8) -SmtpServer smtp.newadmin.ru
} else {
send-mailmessage -to $objTextBox2.Text -from $objTextBox.Text -subject $objTextBox3.Text -Body "$emailBody" -BodyAsHtml -Encoding ([System.Text.Encoding]::UTF8) -SmtpServer smtp.newadmin.ru
}

В моем случае адрес сервера отправки smtp.newadmin.ru . Вы указываете свой. Также у меня не используется авторизация, т.к. отправляю от пользователя администратора Microsoft Exchange. Если хотим выбрать пользователя с какого отправлять, указываем параметр -Credential в командлете send-mailmessage.

Скрипт отправки письма из Powershell полностью

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
$objForm = New-Object System.Windows.Forms.Form 
$objForm.Text = "Отправитель"
$objForm.Size = New-Object System.Drawing.Size(300,200) 
$objForm.StartPosition = "CenterScreen"
$objForm.KeyPreview = $True
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter") 
    {$objTextBox.Text;$objForm.Close()}})
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape") 
    {$objForm.Close()}})
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(75,120)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"
$OKButton.Add_Click({$objTextBox.Text;$objForm.Close()})
$objForm.Controls.Add($OKButton)
$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = New-Object System.Drawing.Size(150,120)
$CancelButton.Size = New-Object System.Drawing.Size(75,23)
$CancelButton.Text = "Cancel"
$CancelButton.Add_Click({$objForm.Close()})
$objForm.Controls.Add($CancelButton)
$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(10,20) 
$objLabel.Size = New-Object System.Drawing.Size(280,20) 
$objLabel.Text = "От какого ящика отправляем сообщение:"
$objForm.Controls.Add($objLabel) 
$objTextBox = New-Object System.Windows.Forms.TextBox 
$objTextBox.Location = New-Object System.Drawing.Size(10,40) 
$objTextBox.Size = New-Object System.Drawing.Size(260,20) 
$objForm.Controls.Add($objTextBox) 
$objForm.Topmost = $True
$objForm.Add_Shown({$objForm.Activate()})
[void] $objForm.ShowDialog()
$objTextBox.Text
$objForm2 = New-Object System.Windows.Forms.Form 
$objForm2.Text = "Получатель"
$objForm2.Size = New-Object System.Drawing.Size(300,200) 
$objForm2.StartPosition = "CenterScreen"
$objForm2.KeyPreview = $True
$objForm2.Add_KeyDown({if ($_.KeyCode -eq "Enter") 
    {$objTextBox2.Text;$objForm2.Close()}})
$objForm2.Add_KeyDown({if ($_.KeyCode -eq "Escape") 
    {$objForm2.Close()}})
$OKButton2 = New-Object System.Windows.Forms.Button
$OKButton2.Location = New-Object System.Drawing.Size(75,120)
$OKButton2.Size = New-Object System.Drawing.Size(75,23)
$OKButton2.Text = "OK"
$OKButton2.Add_Click({$objTextBox2.Text;$objForm2.Close()})
$objForm2.Controls.Add($OKButton2)
$CancelButton2 = New-Object System.Windows.Forms.Button
$CancelButton2.Location = New-Object System.Drawing.Size(150,120)
$CancelButton2.Size = New-Object System.Drawing.Size(75,23)
$CancelButton2.Text = "Cancel"
$CancelButton2.Add_Click({$objForm2.Close()})
$objForm2.Controls.Add($CancelButton2)
$objLabel2 = New-Object System.Windows.Forms.Label
$objLabel2.Location = New-Object System.Drawing.Size(10,20) 
$objLabel2.Size = New-Object System.Drawing.Size(280,20) 
$objLabel2.Text = "Кому отправляем сообщение:"
$objForm2.Controls.Add($objLabel2) 
$objTextBox2 = New-Object System.Windows.Forms.TextBox 
$objTextBox2.Location = New-Object System.Drawing.Size(10,40) 
$objTextBox2.Size = New-Object System.Drawing.Size(260,20) 
$objForm2.Controls.Add($objTextBox2) 
$objForm2.Topmost = $True
$objForm2.Add_Shown({$objForm2.Activate()})
[void] $objForm2.ShowDialog()
$objTextBox2.Text
$objForm3 = New-Object System.Windows.Forms.Form 
$objForm3.Text = "Тема"
$objForm3.Size = New-Object System.Drawing.Size(300,200) 
$objForm3.StartPosition = "CenterScreen"
$objForm3.KeyPreview = $True
$objForm3.Add_KeyDown({if ($_.KeyCode -eq "Enter") 
    {$objTextBox3.Text;$objForm3.Close()}})
$objForm3.Add_KeyDown({if ($_.KeyCode -eq "Escape") 
    {$objForm3.Close()}})
$OKButton3 = New-Object System.Windows.Forms.Button
$OKButton3.Location = New-Object System.Drawing.Size(75,120)
$OKButton3.Size = New-Object System.Drawing.Size(75,23)
$OKButton3.Text = "OK"
$OKButton3.Add_Click({$objTextBox3.Text;$objForm3.Close()})
$objForm3.Controls.Add($OKButton3)
$CancelButton3 = New-Object System.Windows.Forms.Button
$CancelButton3.Location = New-Object System.Drawing.Size(150,120)
$CancelButton3.Size = New-Object System.Drawing.Size(75,23)
$CancelButton3.Text = "Cancel"
$CancelButton3.Add_Click({$objForm3.Close()})
$objForm3.Controls.Add($CancelButton3)
$objLabel3 = New-Object System.Windows.Forms.Label
$objLabel3.Location = New-Object System.Drawing.Size(10,20) 
$objLabel3.Size = New-Object System.Drawing.Size(280,20) 
$objLabel3.Text = "Напишите тему сообщения:"
$objForm3.Controls.Add($objLabel3) 
$objTextBox3 = New-Object System.Windows.Forms.TextBox 
$objTextBox3.Location = New-Object System.Drawing.Size(10,40) 
$objTextBox3.Size = New-Object System.Drawing.Size(260,20) 
$objForm3.Controls.Add($objTextBox3) 
$objForm3.Topmost = $True
$objForm3.Add_Shown({$objForm3.Activate()})
[void] $objForm3.ShowDialog()
$objTextBox3.Text
$objForm4 = New-Object System.Windows.Forms.Form 
$objForm4.Text = "Текст сообщения"
$objForm4.Size = New-Object System.Drawing.Size(300,200) 
$objForm4.StartPosition = "CenterScreen"
$objForm4.KeyPreview = $True
$objForm4.Add_KeyDown({if ($_.KeyCode -eq "Enter") 
    {$objTextBox4.Text;$objForm4.Close()}})
$objForm4.Add_KeyDown({if ($_.KeyCode -eq "Escape") 
    {$objForm4.Close()}})
$OKButton4 = New-Object System.Windows.Forms.Button
$OKButton4.Location = New-Object System.Drawing.Size(75,120)
$OKButton4.Size = New-Object System.Drawing.Size(75,23)
$OKButton4.Text = "OK"
$OKButton4.Add_Click({$objTextBox4.Text;$objForm4.Close()})
$objForm4.Controls.Add($OKButton4)
$CancelButton4 = New-Object System.Windows.Forms.Button
$CancelButton4.Location = New-Object System.Drawing.Size(150,120)
$CancelButton4.Size = New-Object System.Drawing.Size(75,23)
$CancelButton4.Text = "Cancel"
$CancelButton4.Add_Click({$objForm4.Close()})
$objForm4.Controls.Add($CancelButton4)
$objLabel4 = New-Object System.Windows.Forms.Label
$objLabel4.Location = New-Object System.Drawing.Size(10,20) 
$objLabel4.Size = New-Object System.Drawing.Size(280,20) 
$objLabel4.Text = "Напишите текст сообщения:"
$objForm4.Controls.Add($objLabel4) 
$objTextBox4 = New-Object System.Windows.Forms.TextBox 
$objTextBox4.Location = New-Object System.Drawing.Size(10,40) 
$objTextBox4.Size = New-Object System.Drawing.Size(260,20) 
$objForm4.Controls.Add($objTextBox4) 
$objForm4.Topmost = $True
$objForm4.Add_Shown({$objForm4.Activate()})
[void] $objForm4.ShowDialog()
$objTextBox4.Text
$telo = $objTextBox4.Text | Out-String
#От кого сообщение? "С Уважением ......"
$objForm5 = New-Object System.Windows.Forms.Form 
$objForm5.Text = "Кем представляемся?"
$objForm5.Size = New-Object System.Drawing.Size(300,200) 
$objForm5.StartPosition = "CenterScreen"
$objForm5.KeyPreview = $True
$objForm5.Add_KeyDown({if ($_.KeyCode -eq "Enter") 
    {$objTextBox5.Text;$objForm5.Close()}})
$objForm5.Add_KeyDown({if ($_.KeyCode -eq "Escape") 
    {$objForm5.Close()}})
$OKButton5 = New-Object System.Windows.Forms.Button
$OKButton5.Location = New-Object System.Drawing.Size(75,120)
$OKButton5.Size = New-Object System.Drawing.Size(75,23)
$OKButton5.Text = "OK"
$OKButton5.Add_Click({$objTextBox5.Text;$objForm5.Close()})
$objForm5.Controls.Add($OKButton5)
$CancelButton5 = New-Object System.Windows.Forms.Button
$CancelButton5.Location = New-Object System.Drawing.Size(150,120)
$CancelButton5.Size = New-Object System.Drawing.Size(75,23)
$CancelButton5.Text = "Cancel"
$CancelButton5.Add_Click({$objForm5.Close()})
$objForm5.Controls.Add($CancelButton5)
$objLabel5 = New-Object System.Windows.Forms.Label
$objLabel5.Location = New-Object System.Drawing.Size(10,20) 
$objLabel5.Size = New-Object System.Drawing.Size(280,20) 
$objLabel5.Text = "С уважением, :"
$objForm5.Controls.Add($objLabel5) 
$objTextBox5 = New-Object System.Windows.Forms.TextBox 
$objTextBox5.Location = New-Object System.Drawing.Size(10,40) 
$objTextBox5.Size = New-Object System.Drawing.Size(260,20) 
$objForm5.Controls.Add($objTextBox5) 
$objForm5.Topmost = $True
$objForm5.Add_Shown({$objForm5.Activate()})
[void] $objForm5.ShowDialog()
$objTextBox5.Text
$otkogo = $objTextBox5.Text | Out-String
#Указать папку с вложениями
$fold = "C:\scripts\files"
$emailBody = @"
<p>$telo</p>
<p>С уважением,<BR>
$otkogo</p>
"@
$att = Get-ChildItem $fold | Where {-NOT $_.PSIsContainer} | foreach {$_.fullname} 
if ($att -ne $null) { 
send-mailmessage -to $objTextBox2.Text -from $objTextBox.Text -subject $objTextBox3.Text -Body "$emailBody" -BodyAsHtml -Attachments $att -Encoding ([System.Text.Encoding]::UTF8) -SmtpServer smtp.newadmin.ru
} else {
send-mailmessage -to $objTextBox2.Text -from $objTextBox.Text -subject $objTextBox3.Text -Body "$emailBody" -BodyAsHtml -Encoding ([System.Text.Encoding]::UTF8) -SmtpServer smtp.newadmin.ru
}

В данной статье мы увидели что отправка письма из Powershell позволяет облегчить отправку писем с разных ящиков. Возможность отправки писем из Powershell можно легко интегрировать с другими скриптами. Добавляя блоками различный функционал можно провести любые автоматизации.

Больше интересных скриптов на Powershell смотрите тут. Знакомство с Powershell можно начать с официального сайта.


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *