ShS's Blog

Just another sysadmin's weblog

Скрипт для контроля состояния почтового ящика, доступного по POP3-протоколу

Posted by shs на 2009/12/03

К сожалению, у многих  мелких (и не очень) организаций до сих пор используется следующая схема работы с электронной почтой: MX-записи указывают на почтовый сервер хостера, куда приходит вся входящая почта. В самой организации также имеется локальный почтовый сервер, который периодически забирает почту от хостера по POP3-протоколу и раскладывает ее по локальным почтовым ящикам.

Не говоря о том, что при данной схеме работы не возможна полноценная борьба со спамом (многие эффективные методы фильтрации спама невозможно применить), письма могут дублироваться и т.д., и т.п., так еще и могут возникнуть проблемы другого рода. Например, если софт, отвечающий за получение почты от хостера, «не страдает» надежностью и локальный почтовый сервер перестает забирать почту, то квота, выделенная хостером для хранения писем вашей организации, может быть исчерпана. Это, в свою очередь, приведет к тому, что хостер перестанет принимать всю входящую почту, адресованную вашей организации. Правильным выходом из этой ситуации является, конечно же, отказ от подобной схемы работы с почтой. Но, если по каким-то причинам сделать это невозможно, то нужно придумать какой-нибудь «workaround», чтобы каким-либо образом контролировать состояние капризного сервиса.

Этот скрипт был написан как раз для таких целей. Он не пытается контролировать непосредственно сам сервис (по разным причинам это может оказаться неудобно и/или невозможно сделать), вместо этого он делает следующее:

скрипт опрашивает хостера по POP3-протоколу и контролирует состояние одного из двух параметров почтового ящика на стороне хостера. Таковыми параметрами являются количество писем или суммарный объем писем в почтовом ящике. Если проверяемый параметр превышает заданный порог, то скрипт отправляет на заранее определенный e-mail адрес письмо об этом событии. Адрес, на который будет отправлено письмо о превышении указанного порога, задается  в функции SendAlert.

////////////////////////////////////////////////////////////////////
// POP3checker.js shs 20071113
// Опрос заданного п.я. по протоколу POP3 и отправка предупреждающего сообщения
// по e-mail, в случае превышения заданного порога
// Для опроса POP3 п.я. скрипт использует COM-объекты из библиотеки OSPOP3.dll
// (http://http://www.ostrosoft.com)
// OstroSoft POP3 Component доступен для скачивания по следующему адресу:
// http://www.ostrosoft.com/pop3_component.asp
//
// Пример запуска: cscript POP3checker.js <pop3_login> <pop3_пароль> <pop3_сервер> <тип_критерия::=0|1> <пороговое_значение::={количество_писем|суммарный_объем_писем}>
////////////////////////////////////////////////////////////////////

var sPOPServer; //FQDN-имя или IP-адрес POP3-сервера
var iPOPPort;	//№ порта для обращения к POP3 серверу по POP3 протоколу
var sLogin;		//логин пользователя на POP3-сервере
var sPass;		//пароль пользователя на POP3-сервере
var iType; 		//0 - оцениваем количество сообщений; 1 - оцениваем суммарный объем сообщений
var iThreshold; //Порог, превышение которого вызывает рассылку предупреждения
var iAlert;		//Флаг. 0 -не рассылать предупреждение; 1 - рассылать предупреждение
var objError;	//Error object, необходимый для обработки ошибок
var oPOP3;		//объект POP3 (COM-object библиотеки OSPOP3.dll), необходимый для обращения к POP3-серверу

//WScript.Echo(WScript.Arguments.Count());
if (WScript.Arguments.Count()<5)
{
	WScript.Echo("Ошибка! Недостаточное количество аргументов. \n"+
	"cscript "+WScript.ScriptName +
	" <pop3_login> <pop3_пароль> <pop3_сервер> <тип_критерия::={0|1}> {<количество писем>|<сумарный объем писем>}")
}
else
{
	//sPOPServer = "pop.mail.ru";
	//iPOPPort=110;
	//sLogin="pupkin";
	//sPass="password";
	//
	sLogin		= WScript.Arguments.Item(0);
	sPass		= WScript.Arguments.Item(1);
	sPOPServer	= WScript.Arguments.Item(2);
	iType		= WScript.Arguments.Item(3);
	iThreshold	= WScript.Arguments.Item(4)
	iPOPPort	= 110;
	//
	objError=""

	try
	{
		oPOP3 = WScript.CreateObject("OSPOP3.Session");
	}
	catch (objError)
	{
		WScript.Echo("Произошла ошибка #" + objError.number + "\n Описание ошибки :"+objError.description+
		"\n Скорее всего в вашей ОС не зарегистрированна OSPOP3.dll \n (загрузить эту библиотеку можно здесь: http://www.ostrosoft.com/pop3_component.asp)");
	}
	if (objError=="")
	{
		bSuccessfullPolling = false;
		bSuccessfullPolling = oPOP3.OpenPOP3(sPOPServer, iPOPPort, sLogin, sPass);
		WScript.Echo ("bSuccessfullPolling	= " +bSuccessfullPolling);

		if (bSuccessfullPolling)
		{
  			oPOP3.GetMailboxSize();
  			oPOP3.ClosePOP3();
  			WScript.Echo ("iType			= "+iType+
  						"\niThreshold		= "+iThreshold+
  						"\nMailboxSize		= " + oPOP3.MailboxSize+
  						"\nMessageCount		= " + oPOP3.MessageCount);
  			iAlert = 0;
  			if (iType==0)
  			{//оцениваем количество сообщений
  				if (iThreshold<oPOP3.MessageCount) iAlert=1 ;
  			}
  			else
  			{//оцениваем сумарный объем сообщений
  				if (iThreshold<oPOP3.MailboxSize) iAlert=1;
  			}
  			if (iAlert==1)
  			{
  				try
  				{
  					SendAlert()
  				}
  				catch (objError)
  				{
  					WScript.Echo("Ошибка при отправке административного предупреждения #:"+objError.number+" "+objError.description);
  				}
  			}
  			//
		}
		else
		{
			WScript.Echo("Ошибка соединения с сервером "+sPOPServer +
			"\n Возможно имя пользователя и пароль заданы неправильно");
		}
		oPOP3 = null;
	}
}
//
//Рассылка предупреждения админам
function SendAlert ()
{
	objEmail = WScript.CreateObject("CDO.Message");
	objEmail.From = "robot@dandelion.ru";
	objEmail.To = "admin@dandelion.ru";
	//objEmail.Subject = "!!! "+sLogin+" mailbox > "+ iThreshold+" !!!";
	objEmail.Subject = "!!! "+sLogin+". "+((iType==0)?" Message count":"Mailbox size")+"="+((iType==0)?oPOP3.MessageCount:oPOP3.MailboxSize)+" > "+

iThreshold+" !!!";
	objEmail.Textbody = "The threshold of "+ ((iType==0)?"message count":"mailbox size")+
	" for mailbox with LogonName = "+sLogin+" on the POP3-server = "+ sPOPServer +" has been exceeded\nThe threshold = "+ iThreshold+
	"\nThe current value = "+((iType==0)?oPOP3.MessageCount:oPOP3.MailboxSize);

	objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2;
	objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mail";
	objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25;
	objEmail.Configuration.Fields.Update();

	objEmail.Send();
}

Использование:
cscript POP3checker.js <pop3_login> <pop3_пароль> <pop3_сервер> <тип_критерия::={0|1}>
<пороговое_значение::={количество_писем|суммарный_объем_писем}>

Аргументы:
pop3_login — имя пользователя почтового ящика pop3
pop3_пароль — пароль пользователя почтового ящика pop3
pop3_сервер — IP-адрес или DNS-имя pop3 сервера
тип_критерия — задает один из 2х возможных критериев контроля почтового ящика
0 — количество писем
1 — суммарный объем писем в ящике
пороговое значение — число, определяющее порогововое значение,
превышение которого приводит к отправке уведомления администраторам.
если тип_критерия=0, то пороговое значение = количеству писем (ед. изм. — штуки)
если тип_критерия=1, то пороговое значение = суммарному объему писем (ед. изм. — байты)Для запуска этого скрипта из планировщика задач можно использовать простые batch-файлы. Например,

— для проверки того, что суммарный объем писем в  почтовом ящике,  доступном на сервере pop.mail.ru для пользователя с именем login1 и паролем password1, не превышает 50 Мб (52428800 байт) можно использовать такой командный файл:

@echo off
echo.>>%~dpn0.log
echo.>>%~dpn0.log
echo ================>>%~dpn0.log
date /t >>%~dpn0.log
time /t >>%~dpn0.log
echo.>>%~dpn0.log
cscript //NoLogo POP3Checker.js login1 password1 pop.mail.ru 1 52428800>>%~dpn0.log
time /t >>%~dpn0.log

— для проверки того, что количество писем в  почтовом ящике,  доступном на сервере pop.mail.ru для пользователя с именем login2 и паролем password2, не превышает 100 штук  можно использовать такой командный файл:

@echo off
echo.>>%~dpn0.log
echo.>>%~dpn0.log
echo ================>>%~dpn0.log
date /t >>%~dpn0.log
time /t >>%~dpn0.log
echo.>>%~dpn0.log
cscript //NoLogo POP3Checker.js login2 password2 pop.mail.ru 0 100>>%~dpn0.log
time /t >>%~dpn0.log

PS Скрипт использует в своей работе COM-объекты из библиотеки OSPOP3.dll (http://www.ostrosoft.com ), которая доступна для скачивания на сайте производителя. Эта библиотека может быть использована в соответствии с достаточно короткой, но странной лицензией, смысл которой мне не совсем понятен (что такое коммерческое предприятие – знаю, а что такое коммерческая программа – мой мозг понимать отказывается, возможно, вам повезет больше ;)). Так, что обязательно прочитайте перед тем, как принимать решение о возможности ее использования.

Реклама

Один ответ to “Скрипт для контроля состояния почтового ящика, доступного по POP3-протоколу”

  1. […] shs на 2009/12/11 В скрипте, опубликованном ранее, имеется функция отправки сообщения по e-mail. В этом […]

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

 
%d такие блоггеры, как: