Главная

Sunday, 1 May 2016

Отправка почты с помощью Powershell.

Всем привет.

Потрудимся в честь праздника? А вместо  привычной лопаты будет Powershell.

Вот была у меня необходимость читать логи сервера по утрам. Всегда важно прийти на работу, открыть почту и вот они логи. Вначале я любил задействовать для этого почтового  клиента ThеBat. О, великий ТheВat мог многое из комадной строки:

thebat.exe /SEND<account mask1>[;account mask2[;account mask3[...]]]


Но с переходом на VB-скрипты необходимость  в нем для таких задача отпала. Потому как на VBScript отправка, к примеру, файла server.log по e-mail выглядела просто так:


Set objEmail = CreateObject("CDO.Message")
objEmail.From = "mymail address"
objEmail.To = "yourmail address"
objEmail.Subject = "About our server"
objEmail.Configuration.Fields.Item _
 ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
objEmail.Configuration.Fields.Item _
 ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "our email-server name"
objEmail.Configuration.Fields.Item _
 ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
objEmail.Configuration.Fields.Update


Set FSO=WScript.CreateObject("Scripting.FileSystemObject")
Set F=FSO.OpenTextFile("servel.log",1)
retval=""
retval=F.ReadAll
F.Close
objEmail.Textbody = retval
objEmail.Send


Была одна сложность до которой, честно, руки не дошли. Файл server.log должен был содержать только английские (латынь) буквы или цифры. С кириллицей были проблемы, не читалась сообщение нормально у получателя (кодировка), иначе надо было его предварительно архивировать и добавлять в почту так:


objEmail.AddAttachment "d:\server.zip"


Так было. Но вчера еще один клиент попросил сделать такую же автоматическую рассылку с... MS Outlook, по расписанию. Скажу сразу что для MS Outlook расписания по отправке почты в общепринятом понимании нет.  Есть там отложенная разовая отправка, и все. Поэтому я опять же обратил свой взор на Powershell. Как тут дела у нас с отправкой почты по расписанию?  Неплохо, очень даже неплохо.

Первый вариант скрипта:

$EmailFrom = "mymail address"
$EmailTo   = "yourmail address"
$Subject   = "About"
$Body = "About server...."
$SmtpServer = "emailserver name"
$smtp = New-Object net.mail.smtpclient($SmtpServer)
$smtp.Send($EmailFrom, $EmailTo, $Subject, $Body)


А можно вообще одной строкой:


Send-MailMessage -From mymail -To yourmail -SmtpServer emailrsever -Subject "About" `
-Body "About server...."


Берем такой PS-скрипт и вставляем его запуск в шедулер сервера. Важное отличие здесь в том что во втором варианте с кириллицей опять же могут возникнуть проблемы. Но это скорее зависит от шрифта который подвязан для самого Powershell.


А если почтовый сервер в интернете, например yandex.ru?
Нет проблем! Пишем:


$serverSmtp = "smtp.yandex.ru"
$port = 587
$From = "login@yandex.ru"
$To = "MyMail@mail.ru"
$subject = "Письмо с вложением"
$user = "login"
$pass = "01234567"


//Путь к файлу
$file = "D:\arhive.zip"


//Создаем два экземпляра класса
$att = New-object Net.Mail.Attachment($file)
$mes = New-Object System.Net.Mail.MailMessage


//Формируем данные для отправки
$mes.From = $from
$mes.To.Add($to)
$mes.Subject = $subject
$mes.IsBodyHTML = $true
$mes.Body = "<h1>Тестовое письмо</h1>"


//Добавляем файл
$mes.Attachments.Add($att)


//Создаем экземпляр класса подключения к SMTP серверу
$smtp = New-Object Net.Mail.SmtpClient($serverSmtp, $port)


//Сервер использует SSL
$smtp.EnableSSL = $true
Создаем экземпляр класса для авторизации на сервере яндекса
$smtp.Credentials = New-Object System.Net.NetworkCredential($user, $pass);


//Отправляем письмо, освобождаем память
$smtp.Send($mes)
$att.Dispose()


Работу последнего скрипта не проверрял лично, он найден на просторах сети.


Успехов.

2 comments:

  1. -Attachments D:\111.pdf

    ReplyDelete
  2. С яндекса удалось отправить ровно одно письмо. Остальные попытки вываливают в стектрейс ошибки, из которых понятно, что яндекс отклоняет эти письма как спам.
    С Mail/ru не заработало - соединение пытается установиться и завершается по таймауту.
    С рабочей почтой не заработало, там STARLETS, ругается на сертификат.

    ReplyDelete

А что вы думаете по этому поводу?