Скрипт для автоматизации отправки файла cons*.* на заданный email-адрес по электронной почте
Posted by shs на 2009/12/16
По просьбе одного своего знакомого написал небольшой скрипт для автоматизации отправки по электронной почте файла cons*.*. (IIUC, этот файл, содержит некую отчетную информацию о работе сотрудников, выполняющих обновление правовой системы «КонсультантПлюс»). Интересующий нас файл создается в папке RECEIVE (которая находится внутри той папки, куда был установлен «КонсультантПлюс») после запуска программы cons.exe с ключами /adm /usr /base*
Вот, что у меня получилось:
//////////////////////////////////////////////////////////////////////////// // JScript 20091019 shs // Формирование и отправка на e-mail отчета "Консультатн+" // /////////////////////////////////////////////////////////////////////////// strPath2RootCons = "c:\\ConsultantPlus"; //Абсолютный путь к корневой папке, в которую был установлен "Консультант+" strPathFromRootCons = "RECEIVE"; //Относительный путь (относительно папки strPath2RootCons) к папке, //в которой "Консультант+" создает файл cons*.USR strFileMask = "^cons.+"; //Регулярное выражение для поиска файла, //подлежащего отправке по электронной почте mailaddrTo = "consultant@mail.ru"; //e-mail, на который будем отправлять письмо //Проверяем существование в заданной папке файла, //соответствующего шаблону, хранящемуся в strFileMask strFileName=GetFileName(strPath2RootCons+"\\"+strPathFromRootCons,strFileMask); if (strFileName=="") { //если файл не существует, то его надо создать //путем запуска CONS.EXE /adm /usr /base* WshShell = WScript.CreateObject("WScript.Shell"); WshShell.Run(strPath2RootCons+"\\cons.exe /adm /usr /base*", 1, true); } //Снова проверяем наличие нужного нам файла (создался ли?) strFileName=GetFileName(strPath2RootCons+"\\"+strPathFromRootCons,strFileMask); if (strFileName!="") { //Если файл найден, то отправляем его адресату //по email objEmail = WScript.CreateObject("CDO.Message"); objEmail.From = "admin@sunflower.ru"; objEmail.To = mailaddrTo; objEmail.Subject = "Consultant+"; objEmail.Textbody = "JSC SunFlower"; objEmail.AddAttachment(strFileName); // objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2; objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mailservername" objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25; objEmail.Configuration.Fields.Update(); // objEmail.Send(); } //Функция, которая ищет в указанной папке файл, согласно заданной маске (маска задается в виде регулярного выражения) //Если таковой файл находится в заданной папке, то функция вернет его полное имя, иначе - пустую строку // function GetFileName(strPath2File, strFileSpec) { //создаем объект FileSystemObject var fso = new ActiveXObject("Scripting.FileSystemObject"); //создаем объект RegExp var regexFileName= new RegExp (strFileSpec,"i"); //получаем объект - целевую папку var objFolder = fso.GetFolder(strPath2File); //получаем коллекцию файлов в целевой папке var colFiles = new Enumerator (objFolder.Files); var strFileName=""; //перебираем все файлы в коллекции for(;!colFiles.atEnd();colFiles.moveNext()) { //проверяем соответствие текущего файла заданному шаблону if (regexFileName.test(colFiles.item().Name)) { strFileName=colFiles.item(); } } return(strFileName); }
E-mail отправляем с использованием, уже упоминавшегося ранее, COM-объекта: “CDO.Message”.
Для проверки наличия в папке нужного нам файла пришлось написать небольшую функцию, т.к. метод FileExist объекта FileSystemObject, к сожалению, не умеет работать с символами подстановки. Мне же требовалось проверить наличие в папке файла, чье имя соответствует маске cons*.*. Оказалось, что сделать это очень просто, если вспомнить о существовании регулярных выражений. Вместо маски cons*.*, используемой для фильтрации файлов в проводнике и cmd.exe, в данном конкретном случае можно использовать регулярное выражение ^cons.+, что и было проделано:
1) Определяем “pattern” (шаблон)
... strFileMask = "^cons.+"; ...
2) Создаем объект RegExp
... var regexFileName= new RegExp (strFileSpec,"i"); ...
3) Проверяем имя файла на соответствие шаблону
... if (regexFileName.test(colFiles.item().Name)) ...
Ну, и на последок. Есть замечательный ресурс, посвященный регулярным выражениям: http://www.regular-expressions.info/. Если же вы испытываете трудности с пониманием «импортного» текста ;) и/или хотите ознакомиться с тем, как использовать регулярные выражения в PowerShell, то советую вам обратить внимание на цикл заметок, которые начал выкладывать у себя в блоге Василий Гусев (AKA Xaegr).
bob said
помогите, скрипт не работает.. все вроде сделал-на мыло usr не отправляются… код ошибки 80040213 в 43 строке вроде .источник CDO.Message.1
shs said
про эту ошибку я писал в предыдущем посте: https://shss.wordpress.com/2009/12/11/script-send-mail-smtp/
вы не зыбли в скрипте изменить mailservername на имя вашего smtp-сервера?
bob said
да забыл…Спасибо! теперь другая ошибка код 8004020E //щас почитаю пост
shs said
по новой ошибке (8004020E), проще всего воспользоваться гуглем ;)
гугль говорит, что это означает, что у вас что-то не в порядке с адресом отправителя.
objEmail.From = «admin@sunflower.ru»; вы в этой строчке что указали?
bob said
////////////////////////////////////////////////////////////////////////////
// JScript 20091019 shs
// Формирование и отправка на e-mail отчета «Консультатн+»
//
///////////////////////////////////////////////////////////////////////////
strPath2RootCons = «c:\\ConsultantPlus»; //Абсолютный путь к корневой папке, в которую был установлен «Консультант+»
strPathFromRootCons = «RECEIVE»; //Относительный путь (относительно папки strPath2RootCons) к папке,
//в которой «Консультант+» создает файл cons*.USR
strFileMask = «^cons.+»; //Регулярное выражение для поиска файла,
//подлежащего отправке по электронной почте
mailaddrTo = «igor-kukhtenkov@yandex.ru»; //e-mail, на который будем отправлять письмо
//Проверяем существование в заданной папке файла,
//соответствующего шаблону, хранящемуся в strFileMask
strFileName=GetFileName(strPath2RootCons+»\\»+strPathFromRootCons,strFileMask);
if (strFileName==»») {
//если файл не существует, то его надо создать
//путем запуска CONS.EXE /usr /base*
WshShell = WScript.CreateObject(«WScript.Shell»);
WshShell.Run(strPath2RootCons+»\\cons.exe /usr /base*», 1, true);
}
//Снова проверяем наличие нужного нам файла (создался ли?)
strFileName=GetFileName(strPath2RootCons+»\\»+strPathFromRootCons,strFileMask);
if (strFileName!=»») {
//Если файл найден, то отправляем его адресату
//по email
objEmail = WScript.CreateObject(«CDO.Message»); //создаем объект CDO.Message
objEmail.From = «igor-kukhtenkov@yandex.ru»; //адрес отправителя
objEmail.To = mailaddrTo; //адрес получателя
objEmail.BodyPart.CharSet = «utf-8»; //задаем кодовую страницу сообщения
objEmail.Subject = «Градиент_ЮСР»; //тема письма
objEmail.Textbody = «Файлы ЮСР»;
objEmail.AddAttachment(strFileName); //добавляем к письму вложение: файл
//Зададим значения для полей конфигурации
with (objEmail.Configuration.Fields) {
Item(«http://schemas.microsoft.com/cdo/configuration/sendusing») = 2; //посылать сообщения по сети, используя SMTP
Item(«http://schemas.microsoft.com/cdo/configuration/smtpserver») = «smtp.yandex.ru»
Item(«http://schemas.microsoft.com/cdo/configuration/smtpserverport») = 25;
Item(«http://schemas.microsoft.com/cdo/configuration/smtpauthenticate») = 1; // используем basic authentication
Item(«http://schemas.microsoft.com/cdo/configuration/sendusername») = «igor-kukhtenkov»; //имя пользователя
Item(«http://schemas.microsoft.com/cdo/configuration/sendpassword») = «?????????»; //пароль пользователя
Update();
}
try {
objEmail.Send();
}
catch(e) {
WScript.Echo(e.number); //выводим номер ошибки
WScript.Echo(e.message); //выводим соощение об ошибке
}
//Функция, которая ищет в указанной папке файл, согласно заданной маске (маска задается в виде регулярного выражения)
//Если таковой файл находится в заданной папке, то функция вернет его полное имя, иначе — пустую строку
function GetFileName(strPath2File, strFileSpec)
{
//создаем объект FileSystemObject
var fso = new ActiveXObject(«Scripting.FileSystemObject»);
//создаем объект RegExp
var regexFileName= new RegExp (strFileSpec,»i»);
//получаем объект — целевую папку
var objFolder = fso.GetFolder(strPath2File);
//получаем коллекцию файлов в целевой папке
var colFiles = new Enumerator (objFolder.Files);
var strFileName=»»;
//перебираем все файлы в коллекции
for(;!colFiles.atEnd();colFiles.moveNext()) {
//проверяем соответствие текущего файла заданному шаблону
if (regexFileName.test(colFiles.item().Name)) {
strFileName=colFiles.item();
}
}
return(strFileName);
}
}
bob said
В чем косяк то!??
bob said
все вроде в идеале-инет работает ,на диске C создал папку ConsultantPlus в ней RECEIVE,там лежит настоящий файл usr… и чет скриптик не тянет дело —Help!
bob said
Все разобрался))) SHS -спасибо что ты есть!-респект и уважуха тебе-за дело твое))))))