Проверка работоспособности почтового сервера
Для проверки нам понадобится много чего 🙂 :
1. Аккаунт на gmail.com c активированным календарем и IMAP4 (SSL).
2. Возможность доступа к нашему серверу по IMAP4 (SSL).
3. FreeBSD (у меня 8я) c Perl + Python + дополнительные библиотеки (список ниже, в статье).
4. Сам скрипт и терпение.
Итак, делаем п1. – думаю с этим проблем нет. Далее на FreeBSD8 (виртуалка) установил из портов Perl, Python и библиотеки указанные в начале скрипта.
Т.к. украинские операторы закрыли возможность отправки смс через интернет (mail), то нам придется воспользоваться услугами Google Calendar и статьей brOziliy. Выдержка из статьи:
Нас интересуют уведомления для календаря по-умолчанию — выставляем уведомление за 1 минуту до события по SMS.
Также нужно привязать к этому аккаунту номер своего мобильного (это делается там же, в настройках календаря).
Далее, следуем по этой ссылке: code.google.com/p/gcalcli/ и качаем GCalCLI — консольная утилита на Python, которая позволяет работать с гугловым календарём.
Всё, что требуется для работы утилиты — описано на странице проекта, там буквально пара Python-модулей.
Для нормальной работы gcalcli нужно его немного допилить (куда ж без этого).
Открываем файл на редактирование идём на строку 226 и меняем её на это:
feedPrefix = 'https?://www.google.com/calendar/feeds/'
Думаю, все понятно: скачать консольную утилиту и пару модулей к ней, скомпилировать, допилить :). На FreeBSD8 у меня все прошло на УРА.
Аглоритм такой: логинимся на Жмыло по IMAP4, очищаем INBOX, отсылаем через наш сервер письмо, ждем 90сек, проверяем письма в INBOX на предмет конкретной темы, то же самое проделываем для нашего сервера. Если письмо не обнаружилось – создается запись в ГуглКалендаре и через минуту приходит СМС. У меня работает на МТС. Теперь сам скрипт (mail.pl):
#!/usr/bin/env perl
use strict;
use warnings;
use Mail::IMAPClient;
use IO::Socket::SSL;
use Net::SMTP;
use Net::SMTP::SSL;# Readmail and verify
sub read_mail {my $to = $_[0];
my $subject = $_[1];
my $body = $_[2];
my $sendserver = $_[3];
my $from = $_[4];
my $password = $_[5];
my $readserver = $_[6];
my $user = $_[7];
my $password2 = $_[8];# Connect to the IMAP server via SSL
my $socket = IO::Socket::SSL->new(
PeerAddr => $readserver,
PeerPort => 993,
)
or die “socket(): $@”;# Build up a client attached to the SSL socket.
# Login is automatic as usual when we provide User and Password
my $client1 = Mail::IMAPClient->new(
Socket => $socket,
User => $user,
Password => $password2,
)
or die “new(): $@”;# Auth and list folders
print “I’m authenticated at $readservern” if $client1->IsAuthenticated();
#my @folders = $client1->folders();
#print join(“n* “, ‘Folders:’, @folders), “n”;# Print messages in INBOX
$client1->select(“INBOX”) or die “Select ‘INBOX’ error: “, $client1->LastError, “n”;
my @msgs = $client1->messages or warn “No messages: $@n”;
print join(“n* “, ‘Messages:’, @msgs), “n”;# Delete messages
print “Clearing INBOX …n”;
scalar(@msgs) and $client1->delete_message(@msgs) or warn “Cannot mark messages as deleted: $@n”;
$client1->expunge() or warn “Cannot clear INBOXn”;# Send mail
print “Sending mail via $sendserver…n”;
my $smtp;
if ($sendserver eq ‘192.168.1.17’) {
if (not $smtp = Net::SMTP->new($sendserver, Port => 26, Debug => 1)) { die “Could not connect to servern”; }
}
if ($sendserver ne ‘192.168.1.17’) {
if (not $smtp = Net::SMTP::SSL->new($sendserver, Port => 465, Debug => 1)) { die “Could not connect to servern”; }
$smtp->auth($from, $password) || die “Authentication failed!n”;
}
$smtp->mail($from . “n”);
$smtp->to($to . “n”);
$smtp->data();
$smtp->datasend(“From: ” . $from . “n”);
$smtp->datasend(“To: ” . $to . “n”);
$smtp->datasend(“Subject: ” . $subject . “n”);
$smtp->datasend(“n”);
$smtp->datasend($body . “n”);
$smtp->dataend();
$smtp->quit;# Sleep for waiting mail
my $i;
print “Waiting for mail 90sec …n”;
sleep 90;print “Verifying for new messages in mailbox at $readserver …n”;
# Getting messages again …
$client1->select(“INBOX”) or die “Select ‘INBOX’ error: “, $client1->LastError, “n”;
my @msgs2 = $client1->messages or warn “No messages: $@n”;
print join(“n* “, ‘Messages:’, @msgs2), “n”;# Verify and SMS
# Search message with SUBJECT
my $msgs1 = $client1->search(‘SUBJECT “Testmail”‘);
if (@$msgs1) {
print “Found: @$msgs1n”;
}
if (!@$msgs1)
{
print “Not Found!n”;
my $sec = ”;
my $min = ”;
my $hour = ”;
($sec, $min, $hour) = (localtime(time))[0,1,2];
$min = $min + 2;
my $theTime = “$hour:$min”;
print “Set alert to $theTimen”;
print “Sending SMS …n”;
system(“gcalcli –user my.alert@gmail.com –pw password quick ‘$theTime MailServer Error!'”);
}
# Say bye
$client1->logout();
}# ***** Main Program *****
# Verify send from Gmail and read on Exchange
&read_mail(‘test@my.com’, ‘Testmail’, ‘Test’, ‘smtp.gmail.com’, ‘my.alert@gmail.com’, ‘password’, ‘192.168.1.17’, ‘test@ls.my.com’, ‘password’);
# Verify send from Exchange and read on Gmail
&read_mail(‘my.alert@gmail.com’, ‘Testmail’, ‘Test’, ‘192.168.1.17’, ‘test@my.com’, ‘password’, ‘imap.gmail.com’, ‘my.alert@gmail.com’, ‘password’);
Внимание! В тексте встречаются переменные которые не объявлены в начале, но используются при проверке. Кому надо – допилите под себя :).
Огромное спасибо brOziliy за статью на Хабре: http://habrahabr.ru/blogs/sysadm/96099/
Squid + 2 провайдера FreeBSD – NATD – restart