Потрудимся в честь праздника? А вместо привычной лопаты будет 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...."
$EmailTo = "yourmail address"
$Subject = "About"
$Body = "About server...."
$SmtpServer = "emailserver name"
$smtp = New-Object net.mail.smtpclient($SmtpServer)
$smtp.Send($EmailFrom, $EmailTo, $Subject, $Body)
$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()
Работу последнего скрипта не проверрял лично, он найден на просторах сети.
Успехов.
-Attachments D:\111.pdf
ReplyDeleteС яндекса удалось отправить ровно одно письмо. Остальные попытки вываливают в стектрейс ошибки, из которых понятно, что яндекс отклоняет эти письма как спам.
ReplyDeleteС Mail/ru не заработало - соединение пытается установиться и завершается по таймауту.
С рабочей почтой не заработало, там STARLETS, ругается на сертификат.