После того как я перешел с диалапа на
эзернет, у меня появились ряд проблем. В первую очередь связанные с трафиком.
Многие провайдеры разделяют Интернет на 3 зоны: 

  1. Интранет (халява).
  2. Город (городской тариф, может отсутствовать).
  3. Внешка (самый дорогой трафик).

Вернемся к моей проблеме. Имея несколько почтовых ящиков, находящихся в зоне 3, мне приходилось регулярно стягивать почту с них. Причем у меня был доступ и к ящику в зоне 1. Возникает вопрос: как мне получать мыло на халяву? (на внешние ящики регулярно сыпались важные письма с аттачами размером 5-7Мб). Вполне резонно будет заявить: «поставь редирект и не имей проблем». Я этого сделать не мог по трем простым причинам:

  1. Один из ящиков был создан для секурной переписки, установить редирект на нем не разрешали админы.
  2. Второй ящик юзал другой человек. Ставить перенаправление при этом было нельзя.
  3. Иногда редиректить письма было нецелесообразно (при мелких размерах).

И тогда я придумал простой выход из положения.
Написал программу, которая коннектилась к почтовому серверу, выкачивала из ящика все сообщения и… слала их на указанный ящик. Некий автоматический редиректинг. Программа запускалась на удаленном шелле и была написана на… 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, а все сообщения с первого почтовика будут удалены.

Применение моего редиректора может быть не только для экономии трафика. Например, когда необходимо для каких-либо нужд сделать зеркало ящика — сценарий все выполнит без особых проблем. Удачи!

Оставить мнение

Check Also

Микросервисы по-микрософтовски. Пакуем приложения ASP.NET Core с помощью Docker

Кажется, Microsoft все больше и больше любит Linux! Приложения ASP.NET Core теперь по-наст…