Rexxer

Some tips for me and other

Проверка работоспособности почтового сервера

Для проверки нам понадобится много чего 🙂 :

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/

Leave a Reply