После того как я перешел с диалапа на
эзернет, у меня появились ряд проблем. В первую очередь связанные с трафиком.
Многие провайдеры разделяют Интернет на 3 зоны:
- Интранет (халява).
- Город (городской тариф, может отсутствовать).
- Внешка (самый дорогой трафик).
Вернемся к моей проблеме. Имея несколько почтовых ящиков, находящихся в зоне 3, мне приходилось регулярно стягивать почту с них. Причем у меня был доступ и к ящику в зоне 1. Возникает вопрос: как мне получать мыло на халяву? (на внешние ящики регулярно сыпались важные письма с аттачами размером 5-7Мб). Вполне резонно будет заявить: "поставь редирект и не имей проблем". Я этого сделать не мог по трем простым причинам:
- Один из ящиков был создан для секурной переписки, установить редирект на нем не разрешали админы.
- Второй ящик юзал другой человек. Ставить перенаправление при этом было нельзя.
- Иногда редиректить письма было нецелесообразно (при мелких размерах).
И тогда я придумал простой выход из положения.
Написал программу, которая коннектилась к почтовому серверу, выкачивала из ящика все сообщения и... слала их на указанный ящик. Некий автоматический редиректинг. Программа запускалась на удаленном шелле и была написана на... Perl :). В довесок, я реализовал богатый выбор опций для нужд пользователя. Скрипт юзает известный модуль Net::POP3, а также нуждается в настроенном sendmail для перенаправления сообщений.
В общем, смотри сам.
#!/usr/bin/perl
## Mail redirector by Forb (forb@real.xakep.ru).
use Net::POP3;
use Getopt::Std; ## Подгружаем почтовый модуль и парсинг командной строки.
usage()
if ($ARGV[0] eq "-h"); ## Если параметр -h - выполняем процедуру
usage().
getopt("ftsupdm"); ## Обрабатываем параметры.
$host= $opt_f || 'mail.ru'; ## Хост POP3 сервера.
$user= $opt_u || 'forb_mail'; ## Имя пользователя.
$pass= $opt_p || 'password'; ## Пароль
$subject= $opt_s || 'blank'; ## Тема по умолчанию (если в письме ее нет).
$redirect='forb@localhosting.net' || $opt_t; ## Хост куда перенаправлять сообщения (с
SMTPD).
## Приоритет для всех параметров динамический. В случае отсутствия опции берется дефолтовое значение.
$pop=Net::POP3->new($host) || die print "cannot make connection\n"; ## Коннектимся на сервер.
$opt_m eq 1 ? $mess=$pop->apop($user,$pass) : $mess=$pop->login($user,$pass); ##
Если указано авторизоваться с помощью MD5 - используем функцию apop(), иначе просто
login().
if (!defined $mess || $mess eq "0E0") {
$mess ne "0E0" ? $reason = "Wrong password" : $reason = "No messages"; ## Если писем нет, либо пароль неверный - сообщаем об этом.
$pop->quit();
exit print "$reason\n"; ## И корректно выходим.
}
for ($i=1;$i<=$mess;$i++) { ## Организуем цикл по количеству сообщений.
$message=$pop->get($i); ## Получаем текущее (по счетчику).
$flag=0,$subj=$subject;
undef @footer; ## Обнуляем переменные,
использующиеся в цикле (это важно!).
foreach $head (@$message) { ## По каждому элементу массива-сообщения...
$head=~s/\r|\n//g; ## Удаляем из него символ возврата каретки и перевода строки.
$subj=$1
if ($head=~/Subject:\s(.*)/); ## Выделяем тему
$from=$1
if ($head=~/From:\s(.*)/); ## А также поле
From.
$flag++
if ($head eq ''); ## Если закончился хеадер - увеличиваем переменную-флаг.
push(@footer,$head)
if ($flag >= 1); ## Если флаг > 1 - формируем тело сообщения (первая его строка будет =
\n).
}
open(SM,"|/usr/sbin/sendmail -t"); ## Открываем дескриптор с вводом для
sendmail.
print SM "From: $from\n";
print SM "To: $redirect\n";
print SM "Subject: $subj\n";
print SM "Content-type: text/plain\n"; ## Передаем ему все важные поля+контент (следует делать plain, чтобы все аттачи корректно передавались.
$letter=join("\n",@footer); ## Затем соединяем все письмо в отдельную переменную
$letter.
print SM "$letter"; ## Пишем в sendmail тело письма,
print SM "\n"; ## Символ перевода строки,
close SM; ## И закрываем дескриптор.
$pop->delete($i)
if ($opt_d); ## Если указана опция для удаления всех сообщений - удаляем мессагу.
}
print "Redirected $mess messages.\n"; ## Сообщаем о результате,
$pop->quit; ## И корректно выходим.
sub usage {
print "Usage: $0 [options]...\n";
print "Options are:
-f: Hostname of pop3 server
-u: Username for login
-p: Password for login
-t: Hostname of smtp server
-s: Default subject (if none)
-m: Md5 authorization (disabled by default)
-d: Delete ALL messages after redirecting
-h: This help\n";
exit
} ## Процедура для разъяснения всех входных параметров (вызывается через -h).
Теперь просто запускаем скрипт с некоторыми параметрами. Например, perl redirector.pl -f pop.hotbox.ru -u master -p m4st3r -t master@pisem.net -s 'none' -m 1
-d - прога стянет все твои сообщения с pop3 и передаст на smtp. При этом авторизация пройдет через команду APOP, а все сообщения с первого почтовика будут удалены.
Применение моего редиректора может быть не только для экономии трафика. Например, когда необходимо для каких-либо нужд сделать зеркало ящика - сценарий все выполнит без особых проблем. Удачи!