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

По просьбе одного своего знакомого написал небольшой скрипт для автоматизации отправки по электронной почте файла 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).

[Upd 20141017]

На PowerShel скрипт, который делает тоже самое и даже чуть больше (отправляет не только файл cons*.usr, но и запакованную папку STS), занимает несколько строк:

#Запускаем cons.exe для формирования файла CONS*.USR в папке recieve
$strPath2RootCons="D:\Consultant\"
$strCons=$strPath2RootCons + "cons.exe"
Start-Process $strCons -ArgumentList "/adm /base* /usr /yes" -wait
#добавляем сформированный файл во вложения отправляемого письма
$Attachments=@(dir (Join-Path $strPath2RootCons "Receive") -filter cons*.*| select -ExpandProperty FullName)
$Attachments
# Запаковываем в архив при помощи 7zip папку STS
$arc="C:\Program Files\7-Zip\7z.exe"
$arc_params="a -t7z -m0=LZMA2 -mmt -mx9 -r"
$arc_source=Join-Path $strPath2RootCons "ADM\STS"
$arc_dest="e:\temp\STS.7z"
Start-Process $arc -ArgumentList "$arc_params $arc_dest $arc_source" -Wait
# отправляем письмо
$SMTPServer="mymailservername"
$From="robot@myfirm.ru"
$To="manager@theirfirm.ru"
$Subject= "Stat + STS"
#добавляем созданный архив во вложения отправляемого письма
$Attachments+=$arc_dest
#Send-MailMessage -SmtpServer $SMTPServer -From $From -To $To -Subject $Subject -Encoding Default -Attachments $Attachments
Send-MailMessage -SmtpServer $SMTPServer -From $From -To $To -Subject $Subject -Attachments $Attachments
#if ($?) {
del $arc_dest -Force
#}

11 Comments

  1. помогите, скрипт не работает.. все вроде сделал-на мыло usr не отправляются… код ошибки 80040213 в 43 строке вроде .источник CDO.Message.1

        • по новой ошибке (8004020E), проще всего воспользоваться гуглем ;)
          гугль говорит, что это означает, что у вас что-то не в порядке с адресом отправителя.
          objEmail.From = “admin@sunflower.ru”; вы в этой строчке что указали?

          • ////////////////////////////////////////////////////////////////////////////
            // 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);
            }
            }

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

  3. Здравствуйте! Помогите пожалуйста! Я не силён в программировании, и хотелось бы просто слить готовую программу для формирования и отправки… ? Если не трудно можете сбросить на почту или дать ссылку для скачки??? Ну очень нужно! )))

Leave a Reply

Your email address will not be published. Required fields are marked *

Notify me of followup comments via e-mail. You can also subscribe without commenting.