Достаточно часто системные администраторы для мониторинга различных серверов или сетевых служб используют скрипты на языке сценариев Visual Basic Script (vbs).
Вот и передо мной возникла задача написания скрипта для мониторинга определенных событий на сервере и в случае их наступления отправки почты на почтовых ящик администратора.
Я уже описывал несколько способов отправки почты (отправка почты при помощи скрипта на PowerShell, также почтовое сообщение можно отправить прямо из командной строки при помощи telnet). Однако так как в текущей задача скрипт мониторинга написан на vbs, то и разумнее бы было отправлять письмо прямо из кода скрипта vbs. Как же отправить email из vbs?
В паутине интернета находится огромное количество всевозможных скриптов для отправки электронной почты из vbs (Visual Basic Script), однако проблема в том, что подавляющее большинство из них используют программные интерфейсы либо Mapi (Outlook), либо SMTP сервера. А т.к. ни устанавливать Outlook на сервер, ни настраивать службы локального SMTP сервера, в мои планы не входило, такие варианты скриптов отправки почты из vbscript не подходили.
К счастью, удалось найти нормальный скрипт отправки email из vbs, который не требует установки чего бы то ни было на сервер:
Function sendMail() strSmtpServer="msg-01" ' имя почтового сервера, в моем случае это Exchange strSmtpPort=25 strSmtpAuth="no" strSmtpSsl="no" strDate=date strSendingEmail="[email protected]" ' Имя отправителя strReportEmail="[email protected]" ' Имя получателя 'WScript.Echo logPath & "\backup" & strDate & ".html" Set objMessage = CreateObject("CDO.Message")
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = strSmtpServer objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = strSmtpPort If strSmtpAuth = "yes" Then objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1 'use '2' for NTLM authentication objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = strSmtpUser objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = strSmtpPass End If If strSmtpSsl = "yes" Then objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True End If objMessage.Configuration.Fields.Update objMessage.Subject = "Тема письма" & strDate & "." objMessage.From = strSendingEmail objMessage.To = strReportEmail objMessage.HTMLBody = "Текст сообщения" objMessage.Send End Function
Прекрасно, помогло, даже немножко подкорректировал скрипт и сделал что-то на подобии Email Sender Delux, позже выложу на своем сайте, обязательно буду ссылаться на Вас.
Спасибо, отличный скрипт!
Подскажите, пожалуйта, как прикрепить вложение
Попробуйте:
objMessage.HTMLBody = strHTML
objMessage.AddAttachment(«file://C:\Test\test.txt»)
Да,все получилось,спасибо!
Очень полезный скрипт.
А что значит & strDate & в заголовке письма? И как можно указать дату в заголовке?
Пропущен назначение текущей даты переменной strDate.
Скрипт поправлен (strDate=date), теперь в теме письма будет содержатся дата.
К сожалению, не отправляет почту, но и ошибку не выдает…
Проверьте, что почтовый сервер доступен с машины, на которой выполняется скрипт, по 25 порту
Прошу прощение… Подскажите, как это сделать.
Спасибо.
Как это сделать описано тут https://winitpro.ru/index.php/2010/08/25/otpravka-elektronnoj-pochty-cherez-komandnuyu-stroku/
Telnet servername 25
Возможны проблемы с кодировкой (например, если винда на английском).
Тогда поможет добавление такого кусочка кода пере objMessage.Send:
objMessage.BodyPart.Charset = «UTF-8»
objMessage.HtmlBodyPart.Charset = «UTF-8»
objMessage.HtmlBodyPart.ContentMediaType = «text/html; charset=UTF-8»
а как прицепить все файлы в директории, а не один конкретный?
Получаете список файлов в папке и добавляете в письмо через цикл:
Set objFSO = CreateObject("Scripting.FileSystemObject")
objStartFolder = "C:\PS"
Set objFolder = objFSO.GetFolder(objStartFolder)
Set colFiles = objFolder.Files
For Each objFile in colFiles
objMessage.AddAttachment("file://"+"objFile.path")
Next