int CountOffsetsForKvitokToEmail; int ctnKvitokToEmail=99999; //имхо больше 100тыс. квитков не будет int OffsetsForKvitokToEmail[ctnKvitokToEmail]; string EmailsForKvitokToEmail[ctnKvitokToEmail]; string TnFioForKvitokToEmail[ctnKvitokToEmail]; int CheckMonthForKvitokToEmail[ctnKvitokToEmail]; int kvitokToEmail=0; //флаг отправки квитков (1- отправляем, 0- не отправляем) string fileNameForLog; // имя файла с логами отправленных квитков за тек мес int ShowMessage[2]; int cntCheckSuccessfulSend=0; bool logForKvitokToZplNet=false; //сохраняем лог в сетевом zpl Send_Checks() { string NameFile;//путь для временного файла //сохраняем печатную форму в файл CheckToFile(NameFile); //открываем файл с квитками char buf[256]; int handle = open(NameFile,O_RDONLY | O_TEXT,0); if ( handle==-1 ) { sprintf(buf,"Ошибка при открытии файла с квитками\n%s",html); AmbaMessageBox(buf,"АМБа. Ошибка при отправке квитков по email",MB_OK|MB_ICONERROR, 0); return -1; } //проверяем наличие файла с настройками SMTP сервера //если файла нет - вызываем панельку int len=256; char path[256]; //объявляем массив типа char, в который запишем путь до локального ZPL GetCurrentDirectory(len-1,path); path+="\\_infoSmtp"; if ( access(path,0) ) NetDialogs().InitSmtp(); var CMsg=CreateObject("ProgressBar"); CMsg.Initial(0,100,1); CMsg.SetShowTime(static_cast_to_int(false)); //цикл по квиткам var Month=CreateObject("KMonth"); for(int i=1;i<=CountOffsetsForKvitokToEmail;i++) { if (CMsg.Msg_Proc("Подождите немного. Идет рассылка квитков.",100.*i/CountOffsetsForKvitokToEmail)==ESC ) return 0; long l=lseek(handle,OffsetsForKvitokToEmail[i-1],SEEK_SET); char strtmp[OffsetsForKvitokToEmail[i]-OffsetsForKvitokToEmail[i-1]+1]; int r=read(handle,strtmp,OffsetsForKvitokToEmail[i]-OffsetsForKvitokToEmail[i-1]); strtmp=SubStr(strtmp,0,r); Month.SetMonth(atoi(CheckMonthForKvitokToEmail[i])); string namemonth = Month.NameMonth(); //отправляем квиток CheckToEmail(i,strtmp,namemonth); } //чистим за собой close(handle); DeleteFile(NameFile); if(cntCheckSuccessfulSend!=atoi(GetVarValue("ВСЕГО_КВИТКОВ"))) AskAndShowLogChecks(); else AmbaMessageBox("Все квитки успешно отправлены","Отправка квитков",MB_OK,0); } AskAndShowLogChecks() { if (AmbaMessageBox("Успешно отправлено " +to_string(cntCheckSuccessfulSend) + "(из "+ to_string(GetVarValue("ВСЕГО_КВИТКОВ")) + ") квитков \r Показать лог отправки?" ,"Отправка квитков",MB_YESNO|MB_ICONQUESTION,0)==IDYES) { try { ShellExecute(0,"open",fileNameForLog,0,0,1); } catch(...) { AmbaMessageBox("Ошибка при запуске notepad","",0,0); } } } InitOffsets(cnt) { ShowMessage[0]=ShowMessage[1]=0; CountOffsetsForKvitokToEmail=0; for (int i=0;i5) { //на входе текст квитка в кодировке 866, на выходе html в кодировку 1251 string html=ConvertCheckTextToHtml(to_string(text)); string subject ="Квиток за " + namemonth; //Тема сообщения //удалось отправить письмо string from="";//адрес отправителя возьмем из панельки if(!IsNullOrWhiteSpace(html)) //пустой квиток не отправляем sendStatus=NetDialogs().SendMailHtml(from,email,OemToAnsi(subject),html); } } catch(...) { //... } var infoForLog=MakeLogInfo(tn,fio,email,sendStatus); AddLogFile(fileNameForLog,infoForLog); } ConvertCheckTextToHtml(dosText) { string html=""; try { //получаем макет квитка var templatePath=CheckLayoutFilePath(); html=ReadBodyFromHtml(templatePath); if (IsNullOrWhiteSpace(html)) RaiseError(OemToAnsi("Проверьте файл с шаблоном: ")+ templatePath); //если квиток печатает дважды в одной полосе - обрежем "лишнее" перед отправкой int partsCount=MIN(atoi(GetCommonCnfStr("1","квиток")), atoi(GetCommonCnfStr("2","квиток"))); if(partsCount>1) dosText=GetOnePartTextOfCheck(dosText,partsCount); //запишем dosText в макет квитка на место подстроки "#CheckContext" /*var re = CreateObject("RE"); re.Initial("#CheckContext"); var result=re.Replace(dosText,html);*/ html=ReplaceN(html,"#CheckContext",OemToAnsi(dosText)); //NetDialogs().toLog_Debug(to_string("After Replace:" )+OemToAnsi(html)); } catch(interface IErrorInfo err) { string errDescr; err.GetDescription(errDescr); NetDialogs().toLog_Error(errDescr); SayError(err); html=""; } catch(...) { NetDialogs().toLog_Error(OemToAnsi("Неизвестная ошибка в ConvertCheckTextToHtml()")); SayUndefinedScriptError(); html=""; } return html; } GetOnePartTextOfCheck(dosText,partsCount) { int onePartLenght=0; string result=""; // SplitStr() отбрасывает пустые строчки, но в данном случае нас спасает то, что этот // код вызывается только если больше одного квитка в полосу, и при добавлении второго // (и последующийх) квитков строки "добиваются" пробелами до начала второго квитка - // соответсвенно совсем пустых строк не будет. var rows = SplitStr(dosText,"\r\n"); for (int idx=GetLBound(rows); idx <= GetUBound(rows); idx++ ) { string row = rows[idx]; //вычислим длину одной части по первой строке (в квитке длина всех строк одинакова??) if(onePartLenght==0) onePartLenght=strlen(row)/partsCount; result+=SubStr(row,0,onePartLenght)+"\n"; } return result; } CheckLayoutFilePath() { string fileName="checkHtmlPageLayout.html"; //путь до локально zpl char filePath[256],zplDir[256]; GetCurrentDirectory(255,zplDir); //проверяем наличие пользовательского шаблона string userPrefix="user_"; sprintf(filePath,"%s\\T_KVITOK\\%s%s",zplDir,userPrefix,fileName); if ( access(filePath,0)==-1 ) { userPrefix=""; sprintf(filePath,"%s\\T_KVITOK\\%s%s",zplDir,userPrefix,fileName); } return to_string(filePath); } MakeLogInfo(tn,fio,email,sendStatus) { int cntPatrInfo=6; string InfoForLog[cntPatrInfo]; /*1 - ТН 2 - ФИО 3 - email 4 - статус отправки(отправлен/не отправлен) 5 - Сообщение*/ InfoForLog[1]=tn; InfoForLog[2]=fio; InfoForLog[3]=email; if(strlen(email)>5) { if(sendStatus) { InfoForLog[4]="Отправлен"; cntCheckSuccessfulSend++; InfoForLog[5]="квиток отправлен сотруднику " + fio + " на адрес " + email; } else { InfoForLog[4]="Не отправлен"; InfoForLog[5]="ошибка при отправке квитка сотруднику " + fio + " на адрес " + email; } } else { InfoForLog[4]="Не отправлен"; InfoForLog[5]="У сотрудника "+fio+" не заполнен email"; if (!ShowMessage[0]) MsgBoxCheck(OemToAnsi(InfoForLog[5]),EXT_NAME_PR_ERR,1,"",ShowMessage[0]); } return InfoForLog; } AddLogFile(fileName,InfoForLog) { char str[1024]; if (logForKvitokToZplNet) { //сохраняем информацию вида: время отправки;ТН;ФИО;email;СтатусОтправки;Сообщение;Имя пользователя sprintf(str,"%s;%s;%s;%s;%s;%s;%s",GetTimeForMessage(),InfoForLog[1],InfoForLog[2],InfoForLog[3],InfoForLog[4],InfoForLog[5],GetUserName()); } else { //сохраняем информацию вида: время;ТН;ФИО;email;СтатусОтправки;Cообщение sprintf(str,"%s;%s;%s;%s;%s;%s",GetTimeForMessage(),InfoForLog[1],InfoForLog[2],InfoForLog[3],InfoForLog[4],InfoForLog[5]); } try { NetDialogs().AddStringToFile(to_string(fileName), OemToAnsi(str)); NetDialogs().toLog_Debug(OemToAnsi(str)); } catch(...) { ; } } GetTimeForMessage() { char IDTime[256]; struct SYSTEMTIME st; GetLocalTime(st); sprintf(IDTime,"%02d.%02d.%04d %02d:%02d:%02d",st.wDay,st.wMonth,st.wYear, st.wHour, st.wMinute, st.wSecond); return to_string(IDTime); }