ShS's Blog

Just another sysadmin's weblog

Скрипт для автоматизации отправки файла 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).

комментариев 8 to “Скрипт для автоматизации отправки файла cons*.* на заданный email-адрес по электронной почте”

  1. 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

            В чем косяк то!??

  2. bob said

    все вроде в идеале-инет работает ,на диске C создал папку ConsultantPlus в ней RECEIVE,там лежит настоящий файл usr… и чет скриптик не тянет дело —Help!

  3. bob said

    Все разобрался))) SHS -спасибо что ты есть!-респект и уважуха тебе-за дело твое))))))

Ответить на bob Отменить ответ