Автоматизация получения отчета о размерах почтовых ящиков в каждом почтовом офисе




Скачать 60.09 Kb.
НазваниеАвтоматизация получения отчета о размерах почтовых ящиков в каждом почтовом офисе
Дата публикации23.03.2013
Размер60.09 Kb.
ТипОтчет
odtdocs.ru > Бухгалтерия > Отчет
Автоматизация получения отчета о размерах почтовых ящиков в каждом почтовом офисе.


    Общие замечания.

Все это делал, когда возникла задача получать на каждое утро статистику по размерам почтовых ящиков во всех Почтовых офисах. Эти офисы расположены либо на NW, либо на LINUX и в разных городах. Отчеты надо иметь на нашем сервере.

Скрипт, который был написан, отлаживался и работает сейчас на NW6.5.

(теоретически будет работать и на другой платформе. Он не использует NW специфических функций)

GW – GW6.5SP4 и GW7+FTF6

В процессе отладки скрипта с огорчением обнаружил, что

  • отчеты, которыt присылаются с LINUX и c NW (как результат работы gwcheck) немного отличаются в формате представления НАЗВАНИЯ ОТДЕЛА русскими буквами. Скрипт создает файл в котором для русских букв используется win-1251. Однако , уважаемый читатель, может легко изменить на другю кодировку.

  • GWIA , после установки на него бета обновлений (FTF), начинает необычно отдавать по POP3 (мне так показалось). Как следствие в скрипт было внесено некоторое изменение. Что-бы по POP3 вычитывать не с первой строки (это не влияяет на полноту статистики. т.е. Строки с информацией не теряются). Место это отметил словом : A T A N T I O N

Итак:

Размер почтового ящика по каждому пользователю можно брать из журнала работы GWCHECK.

Речь идет о запуске GWCHECK

  • в режиме: MailBoxStatistics

  • и запуске как shedule task в PO

В этом случае администратору будет прислано письмо с прикреплением: файл-отчета.

Предпологается, что на сервере по cron-у будет запускаться каждый день PERL-скрипт, который будет выполнять следующие опперации:

  • вычитывать по POP3 из почтового ящика файл-отчет

  • разбирать файл-отчет и создавать в каталоге на сервере файл в формате:

gwusername;XXXX;kbytes;Имя Фамилия;Название_Отдела

Имя файла будет вида: YYYYMMDD_POSTOFSNAME.CSV


    Реализация




  1. Необходимо создать почтовые ящики для каждого ПОЧТОВОГО_ОФИСА. Например, существуют следующие ПОЧТОВЫЕ_ОФИСЫ: POST1, POSTM, POSTN. Расположим ВСЕ почтовые ящики, предназначеные для статистики (например как gwexternal entity) в POST1 и дадим им имена: 1POST1STATS, 1POSTMSTATS, 1POSTNSTATS. Эти эккаунты лучше раположить в одном контексте. Названия начинаются у всех на цифру 1 не случайно – что-бы при просмотре и поиске они распологались всегда рядом. Установим для этих почтовых ящиков пароли, например: qwerty

  2. Теперь следует настроить GWIA, что-бы разрешал обращаться к созданым почтовы ящикам по POP3

  3. В каждом ПОЧТОВОМ_ОФИСЕ нстроить ежедневный запуск GWCHECK в режиме

MailBoxStatistics и отправкой результата в адрес Вашего почтового ящика. Например для запуска в 02:30. РЕКОМЕНДАЦИЯ: создавать Sheduled events ОТДЕЛЬНО ДЛЯ КАЖДОГО POA.

  1. В Вашем почтовом офисе настроить правила (по числу ПОЧТОВЫХ ОФИСОВ) для пересылки полученой статистики в созданый Вами Почтовый ящик. Пример правила : «Act on items where (item Type is Mail) and Attachments contains 'Mailbox Statistics' and Subject contains 'domen1.post1'» то delegate это письмо адресату:1post1stats@firma.ru. Предпологается, что Ваш потовый домен: @firma.ru

  2. На сервере , где будите запускать PERL-скрипт (это совсем не обзятельно сервер с GW), создать каталог: sys:\etc\1getpost\ . В этом каталоге создать файл getpost.cfg.

Cодержимое этого файла имеет вид:

start

post1

1post1stats

qwerty

docum:\\wrk\\home\\admin\\gwsize\\post1

N

end

start

postm

1postmtats

qwerty

docum:\\wrk\home\\admin\\gwsize\\postm

N

end

Подробнее о содержимом этого файла:

  • start – ключевое слово начала

  • post1 – название почтового офиса, в данном случае: post1

  • 1post1stats – почтовй ящик в который приходит результат работы GWCHECK

  • qwerty – пароль доступа к этому почтовому ящику

  • docum:\\wrk\\home\\admin\\gwsize\\post1 – путь к каталогу в котором будет создаваться файл с отчетом. Вам необходимо СОЗДАТЬ эти катлоги до использования скрипта.

  • L – указывает на какой платформе работает данный post1 – на Linux или NW. Дело в том, что есть некоторая разница как вписывает русские буквы с названием Отдела агент, когда он нработает на Linux и на NW. (на Win – не проверял)

  • end – завершающее слово




  1. Необходимо решить в каком месте на сервере будет распологаться РАБОЧИЙ КАТАЛОГ, необходимый во время работы скрипта. Например пусть это будет так: sysdata:\results\getpost\log

  2. В каталоге sys:\perl\scripts создайте файл: getpost.pl с содержимым

#

# Read from POSTOFFICE LOG file with stats

# read over POP3 (over POP3)

# and Parse and save it to the file

#

use Encode 'from_to';

use Net::POP3;

use MIME::Base64;

# IP адрес Вашего сервера , где расположен GWIA

$mail_server="192.168.0.10";

$postname;

$username="XXXXXXXXX";

$password="XXXXXXXXX";

$dstdir="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";

$ostype='L';

my $READCONF="sys:\\etc\\1getpost\\getpost.cfg";

my $TMPFILE="sysdata:\\results\\getpost\\tfile.log";
# Where the COMMON logs live.

$log_dir="SYSDATA:results\\getpost\\log";
# Exit if the log directory's not there.

die "Log folder $log_dir does not exist" if (not -d $log_dir);
# The overall log file. Indicidual job logs will have incremental numbers

$log_file="$log_dir\\getpost.log";
mylog (" \n", $log_file);

mylog("***************************************************", $log_file);

mylog(" Start Get Post Stats", $log_file);
open (FL1, "<$READCONF") || die("Did not Open Source File !!");

$cmd1="";

$cmd1=readline(FL1);

$cmd1 =~ s/\n//g;
open (FL1, "<$READCONF") || die("Did not Open Source File !!");

$cmd1="";

$cmd1=readline(FL1);

$cmd1 =~ s/\n//g;
while (not eof(FL1) )

{

if ( $cmd1 eq 'start' )

{

$cmd1=readline(FL1);

$cmd1 =~ s/\n//g;

$postname = $cmd1;

$cmd1=readline(FL1);

$cmd1 =~ s/\n//g;

$username = $cmd1;

$cmd1=readline(FL1);

$cmd1 =~ s/\n//g;

$password = $cmd1;

$cmd1=readline(FL1);

$cmd1 =~ s/\n//g;

$dstdir = $cmd1;

$cmd1=readline(FL1);

$cmd1 =~ s/\n//g;

$ostype = $cmd1;

# print "user=[".$username."]\n";

# print "pasword=[".$password."]\n";

# print "dsdir=[".$dstdir."]\n";

# print "ostype=[".$ostype."]\n";

# run my script !!!

$trez='A';

$trez=getlogfile($username,$password);

if ($trez eq '0')

{

mylog("Not Get info from $username", $log_file);

# print "Not Get info from $username\n";

}

else

{

mylog("Get info from $username", $log_file);

#---

# print "Get info from $username\n";

# print "Will bi run parslogfile\n";

parslogfile($postname,$dstdir,$ostype);

;

}

# end my scripts

}

$cmd1=readline(FL1);

$cmd1 =~ s/\n//g;

}

close(FL1);

exit(0);
#------------------------

sub getlogfile {

#$_[0] - username

#$_[1] - password

# Get LogFile and store in the temporary file.

# get over POP3.

my $rootDir;

my $dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks;

my $entry1=$TMPFILE;

$size = 0;

open (FL2, ">$TMPFILE") || die("Did not Open Target File !!");
$pop = Net::POP3->new($mail_server)

or die "Can't open connection to $mail_server : $!\n";

defined ($pop->login($_[0], $_[1]))

or die "Can't authenticate: $!\n";

$messages = $pop->list

or die "Can't get list of undeleted messages: $!\n";

$sw=0;

foreach $msgid (keys %$messages) {

$message = $pop->get($msgid);

$tm=@$message;

#!!!!!!!!!!!!************************************

# ! ! ! ! ! ! !****** A T A N T I O N ***************

$tm1=25;

#********************************************

$sw=0;

while ($tm1 < $tm)

{

$tres=@$message[$tm1];

$tres=decode_base64($tres);

# $tres =~ s/\n//g;

print FL2 $tres;

$tm1=$tm1+1;

}

$pop->delete($msgid);

# unless (defined $message)

# {

# warn "Couldn't fetch $msgid from server: $!\n";

# next;

# }

# $message is a reference to an array of lines

$sw=0;

next;

}

close(FL2);

$pop->quit();
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,

$atime,$mtime,$ctime,$blksize,$blocks)=lstat($entry1);

#print "size=[$size]\n";

mylog("size=[$size]", $log_file);

if ($size == 0)

{return '0'; }

else

{return '1';}

}

#exit(0);

#exit(0);
#

#--------------------------------

#

sub parslogfile {

# $_[0] - postoffice name

# $_[1] - dstdir

# $_[2] - ostype

# N - NetWare

# L - Linux

#

my $lweek;

my $lmonth;

my $lday;

my $lyear;

my $lpostname=$_[0];

my $ldstdir=$_[1];

my $lostype=$_[2];

my $lresfile;

my $user;

my $gid;

my $tgfnm;

my $i;

my $end1;

my $end2;

my $gsize;

my $gt;

my $size;

#

#print "+++In the PARSLOG Procedure\n";

#print "+++will be open for read file($TMPFILE)\n";

open (FL2, "<$TMPFILE") || die("Did not Open Target File !!");

while (not eof(FL2) )

{

$lstr=readline(FL2);

# print "**$lstr**";

if ($lstr =~ /Processed on (\w+), (\w+) (\w+), (\w+)/)

{

$lweek = $1;

$lmonth = $2;

$lday = $3;

$lyear = $4;

$lresfile = $ldstdir;

$lresfile.="\\\\";

$lresfile.=$lyear;

if ($lmonth eq "October") { $lmonth="10"; }

if ($lmonth eq "November") { $lmonth="11"; }

if ($lmonth eq "December") { $lmonth="12"; }

if ($lmonth eq "January") { $lmonth="01"; }

if ($lmonth eq "February") { $lmonth="02"; }

if ($lmonth eq "March") { $lmonth="03"; }

if ($lmonth eq "April") { $lmonth="04"; }

if ($lmonth eq "May") { $lmonth="05"; }

if ($lmonth eq "June") { $lmonth="06"; }

if ($lmonth eq "July") { $lmonth="07"; }

if ($lmonth eq "August") { $lmonth="08"; }

if ($lmonth eq "September") { $lmonth="09"; }

$lresfile.=$lmonth;

if ($lday < 10) { $lday="0".$lday;}

$lresfile.=$lday;

$lresfile.="_";

$lresfile.=$lpostname;

$lresfile.="\.csv";

# print "Will be Open file for wirte:($lresfile)\n";

open (FL3, ">$lresfile") || die("Did not Open Target File !!");

}

#

# PARSING !!!

if ($lstr =~ /Checking user = (\w+)/)

{

$user = $1;

$gid = substr($lstr,34,3);

$tgfnm = substr($lstr,71);

$i=0;

$end1=0;

$end2=0;

$gsize=0;

# will be pars $qfnm

#print "====888===\n";

while ($i < 165 )

{

$gt = substr($tgfnm,$i,1);

if ($gt eq '[')

{

$end1 = $i;

}

if ($gt eq ']')

{

$end2 = $i;

}

$i=$i+1;

}
if ($lostype eq 'N')

{

#--------------Start when file from Netware

# print "From !!!!!!! NetWare\n";

if (substr($tgfnm,0,1) eq ' ')

{

$gfnm = substr($tgfnm,1,$end1-2);

if (substr($tgfnm,$end1-2,1) eq ' ')

{

$gfnm = substr($tgfnm,1,$end1-2);

}

}

else

{

$gfnm = substr($tgfnm,0,$end1-1);

if (substr($tgfnm,$end1-2,1) eq ' ')

{

$gfnm = substr($tgfnm,0,$end1-2);

}

}

$gdep = " ";

$gdep = substr($tgfnm,$end1+4,$end2-$end1-4);

#------end for file from NetWare

}

else

{

#------Star for file from Linux

# print "From !!!!!!! Linux\n";

if (substr($tgfnm,0,1) eq ' ')

{

$gfnm = substr($tgfnm,1,$end1-2);

if (substr($tgfnm,$end1-2,1) eq ' ')

{

$gfnm = substr($tgfnm,1,$end1-2);

}

}

else

{

$gfnm = substr($tgfnm,0,$end1-1);

if (substr($tgfnm,$end1-2,1) eq ' ')

{

$gfnm = substr($tgfnm,0,$end1-2);

}

}

$gdep = " ";

$gdep = substr($tgfnm,$end1+1,$end2-$end1-1);
#------end for file from Linux

}

}

if ($lstr =~ /(\d+) (\w+) in use by user's mail/)

{

$size = $1.' '.$2;

$gsize = $1;

}

if ($user && $size)

{

if ($gdep eq '')

{

;

}

else

{
if ($lostype eq 'N') {from_to($gdep,"cp866","cp1251"); };

print FL3 "$user;$gsize;kbytes;$gfnm;$gdep\n";

}

$user = '';

$size = '';

$gfnm = '';

$gdep = '';

}
# end PARSING

next;

} #close while

close FL2;

close FL3;

}
#----------------

sub mylog {

# log output to screen and (optionally) to file

# $_[0] is the string to be logged, $_[1] is the logfile
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime;
$out=sprintf("%02d",$mday);

$out.="/";

$out.=sprintf("%02d",$mon+1);

$out.="/";

$out.=1900+$year;

$out.=" ";

$out.=sprintf("%02d",$hour);

$out.=":";

$out.=sprintf("%02d",$min);

$out.=":";

$out.=sprintf("%02d",$sec);

$out.=" $_[0]";

$out.="\n";

# print $out;

if ($_[1]) {

^ $LOGFILE=">>" . $_[1];

open LOGFILE or die "Can't open log file $_[1]: $!";

print LOGFILE $out;

close LOGFILE;

}

}



  1. В каталоге sys:\system создайте файл: 0getpost.ncf c содержимым: perl sys:\perl\scripts\getpost.pl --noscreen --autodestroy



  2. Удобным Вам способом запланируйте запуск скрипта: sys:\system\0getpost.ncf каждый день, например - в 6 утра




Как проверить работоспособность.


  • Первым делом проверте, что правильно отрабатывают правила в Вашем почтовм ящике, пересылающие результат gwcheck В нужный ящик. Для этого из C1 руками запустите для POST1 проверку gwcheck В режиме : Mailbox stats и пересылкой результата в Ваш почтовый ящик. Убедитесь, что файл отчета оказался в почтовом ящике: 1poststats.

  • В файле sys:\etc\1getpost\getpost.cfg оставте запись только для post1 и запустите с консоли сревера РУКАМИ скрипт так: perl sys:\perl\scripts\getpost.pl. Если все нормально пройдет – в указаном Вами каталоге будет создан файл с отчетом.





P.S.: Спасибо всем, кто дочитал до конца этот текст.

Если возникнут коментарии, пожелания или вопросы, то: skoltogyan@mail.ru

Колтогян Сергей Рубенович

Украина, г. Донецк

НПП АМИ

Добавить документ в свой блог или на сайт

Похожие:

Название popa3d
Пользователи могут могут подсоединяться в любое время для проверки своих почтовых ящиков и забирать накопившуюся почту. Выгода от...

Newsletter / boletín de noticias / boletim / Бюллетень
Это информационный бюллетень для всех администраторов почтовых рассылок и пользователей почтовых аккаунтов. В нём содержится важная...

Пожар в квартире или офисе
Запах дыма в квартире или офисе ни в коем случае не должен вызвать у вас панику. Быстро обойдите все помещения и найдите источник...

[en] This newsletter is for all riseup net list admins and mail account...
Это информационный бюллетень для всех администраторов почтовых рассылок и пользователей почтовых аккаунтов. В нём содержится важная...

Информационных технологий и массовых коммуникаций по центральному федеральному округу
ФЗ) право на предъявление претензии имеют отправитель или получатель почтовых отправлений. Сведения о передаваемых по сетям почтовой...

Отчет по расчету заработной платы является одним из основных аналитических...
Для формирования отчета выберите пункт меню Операции/Зарплата/Начисления и расчет/ Отчет по расчету заработной платы. Перед формированием...

Подписку на газету «ЮК» можно оформить в любом почтовом отделении...
Подписку на газету «ЮК» можно оформить в любом почтовом отделении ао «Казпочта» и подписных организациях: тоо «Евразия-Пресс», «Ернур-Пресс»,...

Тамбовской области постановление
Рабочей группы по работе с обращениями граждан из специализированных ящиков «Для обращений граждан по вопросам коррупции», положения...

Тамбовской области постановление
Рабочей группы по работе с обращениями граждан из специализированных ящиков «Для обращений граждан по вопросам коррупции», положения...

Список электронных ящиков для родителей (законных представителей)

Вы можете разместить ссылку на наш сайт:
Школьные материалы


При копировании материала укажите ссылку © 2013
контакты
odtdocs.ru
Главная страница