Укрощаем мобилу. Пишем mail-forwarder

Дмитрий Докучаев aka Forb

Xakep, номер #050, стр. 050-090-3


for ($i=1;$i<=$#$msg;$i++) {

my($mess)=$msg->[$i];

chomp($mess);

push(@send,$mess) if $stop; ## Записываем его тело в массив @send

$stop = 1 if ($mess eq '');

break if ($mess eq '.');

}

}

if ($messages eq '0E0') { ## Если сообщений нет, вернем 0 при дебаге, либо просто завершим скрипт

return 0 if $debug;

exit

}

$pobject->delete(1) if (($delete && $step) || (!$step)); ## Удалим сообщение, если стоит опция $delete, либо если проверяем реквестовый ящик

$pobject->quit;

return 1; ## Успешно выходим...

}

sub sendmessage {

my(@what)=@_;

my($scal)=0; ## Получаем тело сообщения и обнуляем переменную для получения размера

open(MAIL,"|/usr/sbin/sendmail -t") || die "cant send email $!\n"; ## Открываем sendmail для записи данных в него

print MAIL << "EOF";

From: Center <$mcenter>

To: $smsmail

Content-type: text/plain

EOF

## Пишем в него заголовок сообщения: адрес отправителя и ящик адресата

foreach (@what) {

$scal+=length($_); ## Получаем размер каждой строки тела сообщения, суммируя его в $scal

break if ($scal > $maxsize); ## Прерываем цикл при достижении максимального размера

print MAIL "$_\n" ## Пишем тело сообщения в дескриптор sendmail'а

}

close(MAIL); ## Закрываем поток

}

Как видишь, все просто. Суть скрипта - это вызов mconnect() 2 раза для проверки обоих ящиков и в случае, когда на обоих есть сообщения, пересылка последнего сообщения на мобилу. Метод $self->login() возвращает количество сообщений на ящике, либо 0E0, когда сообщений нет. Затем происходит тонкая работа с элементами массива, ссылка на который возвращается методом $self->get(). Переменная $step нужна, чтобы не переписывать одну и ту же процедуру несколько раз. Как видишь, у меня это получилось =).

А теперь немного расскажу, как юзать эту штуковину. После успешного создания скрипта на всякий случай проверь его синтаксис командой perl -c mail.pl, где mail.pl - твой скрипт. Затем запусти редактор кронтаба командой crontab -e. В нем войди в режим ввода текста (ESC, i) и забивай туда примерно следующее:

0,10,20,30,40,50 * * * * /usr/bin/perl /home/login/work/mail.pl >/dev/null 2>&1 &

где 0,10,20,30,40,50 - время в минутах для запуска скрипта (в моем случае скрипт будет запускаться каждые 10 минут). Все сообщения, которые он будет выводить, уйдут в /dev/null (если бы этого не было, они бы ушли тебе на почтовый ящик).

Вариации на тему

Ты можешь модифицировать этот скрипт, добавив, например, туда чистку от html-сообщений, либо создав проверку более одного реквестового ящика, по которой можно судить, какой ящик следует проверять и с какого перенаправлять =). Таким образом ты создашь мультипользовательскую среду в одном скрипте. Фантазия тут безгранична. Я же ограничился вышеизложенным вариантом и пользуюсь этой фичей уже больше недели.

Теперь можно с уверенностью сказать, что прежде чем тратиться на дорогой мобильник, следует подумать, а не сделать ли тебе из старого то, что ты давно хотел иметь? Ведь старый друг лучше новых двух.

Назад на стр. 050-090-2  Содержание