1. Что нам понадобится. Список прграмм, которые нам понадобятся: * Exim, http://www.exim.org/, рассматриваемая в статье версия - 4.31 * Fetchmail, http://catb.org/~esr/fetchmail/, 6.2.4 * Procmail, http://www.procmail.org/, 3.22 * Bmf, http://sourceforge.net/projects/bmf/, 0.9.4 * Mutt, http://www.mutt.org/, 1.4.1i * Ваш любимый текстовый редактор То что здесь указаны URL'ы домашних страниц программ, не значит что надо качать оттуда исходники, собирать их самому и ставить как попало в систему. Наверняка эти программы есть в виде портов/пакетов/etc для вашей системы, проверьте Eye-wink . Если ваши версии немного отличаются от рассматриваемых - ничего страшного, думаю все будет работать. (за исключением exim - формат конфигурационного файла версий 3.X и более ранних совершенно несовместим с форматом exim 4.X) 2. Настройка. 2.1 Exim. Итак приступим. (процесс сборки программ не расматривается). Начнём мы с exim. Exim - это Mail Transfer Agent, т.е. как понятно из названия - программа, занимающаяся передачей почты. Конфигурационный файл программы обычно находится в /etc/exim/exim.conf или /usr/local/etc/exim/exim.conf. Работа exim основана на логических элементах - драйверах: роутерах и транспортах. Роутер производит операции над адресом и определяет как дальше пойдёт процесс доставки сообщения - оно будет передано транспорту или его адрес будет переписан (например на основе файла aliases). Также роутер может прервать процесс доставки (например если указанный в адресе назначения пользователь не существует на сервере). Транспорты передают копию сообщения из почтовой очереди exim в указанное место назначения (файл, pipe, удаленный хост, etc). Приблизительный файл конфигурации (то что начинается с # - мои коментарии, неплохо бы их читать): # здесь вместо 'jdoe' укажите пользователя, под которым вы обычно работаете, это даст ему # возможность управлять exim'ом без прав root. trusted_users = jdoe queue_list_requires_admin = false # # Роутеры. # порядок следования роутеров в файле конфигурации очень важен. # begin routers # # если домен адреса назначения в письме не является локальным ( 'domains = !@', символ '@' # означает 'имя локальной машины'.), для всех доменов отправить его через сервер указанный # в переменной smarthost, при помощи транспорта remote_smtp (см. дальше). # smarthost: driver = manualroute domains = !@ transport = remote_smtp route_list = * smtp.provider.net # # если адрес назначения в письме встречается в первом столбце в файле /etc/aliases # изменить его на адрес находящийся во втором столбце и начать прохождение по списку роутеров снова. # Если файл alias'ов в вашей системе находится в другом месте ( например /etc/mail/aliases ), # исправьте здесь его имя. # aliases: driver = redirect data = ${lookup{$local_part}lsearch{/etc/aliases}} file_transport = address_file pipe_transport = address_pipe # # если в домашнем каталоге пользователя существует файл .forward, продолжить обработку письма # в соотвествии с инструкциями в этом файле (man 5 forward). # dotforward: driver = redirect check_local_user = true file = $home/.forward file_transport = address_file pipe_transport = address_pipe # # Ну и наконец, если письмо достигло этого роутера, и пользователь, которому предназначено письмо # сущестует в системе (check_local_user = true) - передать его транспорту local_delivery. # если пользователь не существует - будет сформировано сообщение об ошибке доставки письма. # local_user: driver = accept check_local_user = true transport = local_delivery # # Транспорты. # begin transports # # Доставка локальному пользователю - берем письмо, и просто добавляем его к файлу # /var/mail/$local_part. # local_delivery: driver = appendfile # если почтовый каталог в вашей системе находится не в /var/mail, а скажем в /var/spool/mail, # исправьте эту строку. file = /var/mail/$local_part # # в файле alias'ов или в .forward файле можно определить альтернативный почтовый ящик. # например в aliases: # # bgates: /mail/bgates # # в остальном работает также как транспорт local_delivery. # address_file: driver = appendfile # # передать письмо указанной программе на stdin. опять же на примере aliases: # # bgates: |/usr/bin/bmf -S # address_pipe: driver = pipe return_output # # отправить письмо через указанный хост по smtp. # remote_smtp: driver = smtp # # Переписывание адресов. # Имя вашей машины - jdoe.local.provider.net, и все письма исходящие с неё # будут иметь адрес источника user@jdoe.local.provider.net.">user@jdoe.local.provider.net, что совсем не хорошо, поэтому # мы будем переписывать адрес источника в них. # Здесь: # jdoe@jdoe.local.provider.net.">jdoe@jdoe.local.provider.net - оригинальный адрес источника # jdoe@provider.net.">jdoe@provider.net - на этот адрес в письмах будет заменяться jdoe@jdoe.local.provider.net.">jdoe@jdoe.local.provider.net. # Ffrs - некоторая 'магическая' комбинация флагов, особо любопытные могут прочитать подробнее # в документации на exim, в разделе 'ADDRESS REWRITING'. # begin rewrite jdoe@jdoe.local.provider.net jdoe@provider.net Ffrs # # Если письмо не удалось доставить сразу повторять попыпытки в первые сутки - каждые час, # затем ежедневно в течении недели. # После истечения этого срока будет сформировано письмо на исходящий адрес сообщения # с объяснением причин невозможности доставки. # begin retry * * F,1d,1h; F,7d,1d Минимальный файл alias'ов должен состоять из одной строчки: root: jdoe таким образом вся почта, предназначенная пользователю root (сообщения от различных демонов, средств наблюдения за системой, etc) будет пересылаться вашему пользователю. Теперь необходимо убедиться что exim в вашей системе - основной MTA, для этого выполним команду: $ /usr/sbin/sendmail -bV если её вывод совсем не похож на Exim version 4.31 #3 built 05-Apr-2004 02:01:05 Copyright (c) University of Cambridge 2004 [...] необходимо настроить вашу ОС таким образом чтобы exim был основным MTA. В некоторых системах нужно отредактировать /etc/mailer.conf или /etc/mail/mailer.conf, в Debian GNU/Linux выполнить команду: update-alternatives --config mail-transport-agent и выбрать в списке exim. Одним словом обратитесь к документации на вашу ОС Eye-wink Для управления очередью сообщений необходимо периодически запускать exim с ключём -q, для этого добавим в файл /etc/crontab (или другой подобный файл в вашей системе, к примеру /var/cron/tabs/root) строку: @hourly /usr/sbin/sendmail -q и выполним команду: # crontab /etc/crontab Всё. с настройкой exim покончено, теперь вы можете попробовать послать письмо самому себе с помощью программы mail, $ mail jdoe Subject: test! test! ^D $ mail Mail version 8.1.2 01/15/2001. Type ? for help. "/var/mail/jdoe": 1 message 1 unread >N 1 jdoe@jdoe.local.p.">jdoe@jdoe.local.p Mon Jan 01 00:01 14/450 test! & 1 Message: 1 From jdoe@jdoe.local.provider.net.">jdoe@jdoe.local.provider.net Mon Jan 01 00:01:00 2235 Envelope-to: jdoe@jdoe.local.provider.net.">jdoe@jdoe.local.provider.net To: jdoe@jdoe.local.provider.net.">jdoe@jdoe.local.provider.net Subject: test! From: jdoe@jdoe.local.provider.net.">jdoe@jdoe.local.provider.net Date: Mon Jan 01 00:01:00 2235 test! & PS: если на этом этапе возникают проблемы а exim пишет в логи о том что невозможно создать lockfile, выполните команду (если почтовый каталог в вашей системе не /var/mail - замените этот путь на правильный): # chmod 1777 /var/mail 2.2 Mutt Mutt это очень мощный почтовый клиент (особенно если ознакомиться с документацией Eye-wink ). Для начала запишем следующие строки в ~/.muttrc: # Кодировка для ввода/вывода текста set charset="koi8-r" # Кодировки для исходящих сообщений set send_charset="us-ascii:iso-8859-1:koi8-r:utf-8" Запустим mutt: $ mutt вы должны увидеть содержимое своего почтового ящика - письмо из пункта 2.1 2.3 Fetchmail. Теперь надо как-нибудь забирать почту с POP серверов. Мы будем делать это с помощью fetchmail. Fetchmail получает письма с POP (или IMAP) сервера и передаёт их локальному MTA (т.е. exim). Конфигурационный файл программы - ~/.fetchmailrc довольно прост, вот его пример: # по умолчанию fetchmail ожидает что наш MTA слушает порт 127.0.0.1:25, но # поскольку это не так - мы указываем другой способ доставки почты. defaults mda "/usr/sbin/sendmail -t -f %F %T" # опрос сервера: # poll <адрес сервера> proto pop3 user <имя пользователя> pass <пароль> poll pop3.zzzmail.com proto pop3 user "jdoe" pass "mYsEcReT" poll pop3.provider.net proto pop3 user "jdoe" pass "AnOtHer" теперь просто запускаем: $ fetchmail и почта попадает в наш почтовый ящик. (проверьте с помощью mutt). (PS: для тех кто хочет управлять почтой прямо на сервере, просматривая заголовки писем я бы рекомендовал Prepop, http://freshmeat.net/projects/prepop/) 2.3.1 Запуск fetchmail демоном. Да, мне тоже лень запускать fetchmail вручную Smiling . Поэтому можно заставить работать его демоном, проверяя наличие почты на серверах через заданный промежуток времени. Изменим немного ~/.fetchmailrc # проверять почту каждые полчаса set daemon 1800 set logfile /home/jdoe/.fetchmail/fetchmail.log defaults mda "/usr/sbin/sendmail -t -f %F %T" poll pop3.zzzmail.com proto pop3 user "jdoe" pass "mYsEcReT" poll pop3.provider.net proto pop3 user "jdoe" pass "AnOtHer" создаём директрию ~/.fetchmail, а в ней файл fetchmail.log $ mkdir ~/.fetchmail $ touch ~/.fetchmail/fetchmail.log туда будет записываться протокол работы fetchmail. Осталось только как-нибудь заставить fetchmail автоматически запускаться при старте системы. Для этого воспользуемся услугами cron: создадим файл ~/.fetchmail/fetchmail.cron: PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin @reboot fetchmail выполним команды: $ crontab ~/.fetchmail/fetchmail.cron $ fetchmail 2.4 Тест Напишем самому себе письмо на один из наших адресов (скажем на jdoe@provider.net.">jdoe@provider.net) и отправим его, если с соединением всё в порядке то через полчаса (или что вы там указали в ~/.fetchmailrc) мы получим его обратно. Обратите внимание на адрес отправителя - если у вас всё правильно работает - он будет тем что вы указали в секции rewriting в файле конфигурации exim. 3. Для тех кому этого мало. В данный момент наша почтовая система настроена и прекрасно функционирует. Но как же такие веши как сортировка почты и фильтрация спама? Eye-wink 3.1 Сортировка писем. Для сортировки почты вы воспользуемся procmail. Для начала создадим файл ~/.forward, в который запишем всего одну строку: "|/usr/bin/procmail" (Если у вас procmail находится в другом месте - исправьте эту строку на правильную). Создадим директорию ~/.mail - теперь вся почта у нас будет храниться там. $ mkdir ~/.mail Допустим вы подписаны на несколько списков рассылки, ну скажем users@lists.youros.org.">users@lists.youros.org и security@lists.youros.org.">security@lists.youros.org, а также часто получаете письма с места работы (домен yourcompany.com) и не хотели бы их смешивать в одном почтовом ящике. Вот сценарий procmail, который реализует это: # Сюда будет помещаться почта, не подходящая ни под одно из # следующих правил. DEFAULT=$HOME/.mail/inbox # Файл, содержащий протокол работы procmail. LOGFILE=$HOME/.procmail/procmail.log :0: * ^X-Mailing-List: $HOME/.mail/youros-users :0: * ^X-Mailing-List: $HOME/.mail/youros-security :0: * ^From:.*<.+@yourcompany.com> $HOME/.mail/yourcompany Также отредактируем конфиг mutt (файл ~/.muttrc): # не имеет к сортировке почты никакого отношения, просто позволит вам отвечать # в списки рассылки. lists users@lists.youros.org.">users@lists.youros.org lists security@lists.youros.org.">security@lists.youros.org # Директория с почтовыми ящиками (в последствии можно обращаться к этому значению, # записывая знак '=') set folder="~/.mail" # проверять наличие почты в этих ящиках и сообщать об этом пользователю mailboxes =inbox =youros-users =youros-security =yourcompany # сюда складывать прочитанную почту set mbox="=readed" # сюда - посланную set record="=sent" # сюда - черновики писем set postponed="=postponed" # начинать работу с отображения этого ящика set spoolfile="=inbox" set charset="koi8-r" set send_charset="us-ascii:iso-8859-1:koi8-r:utf-8" Запускаем mutt - видим содержимое ящика ~/.mail/inbox, нажимаем 'c' а потом '?' - получаем список почтовых ящиков. 3.2 Фильтрация спама Cэкономьте на профессиональных грyзoпepевoзках, APEНДА КВAРTИР в МOCKВE, Лучшие туры для отдыха в России и Зарубежом. Брр! Письма подобного содержания валятся сотнями и казалось бы нет способа избавить себя от чтения этого мусора. Для выделения таких писем и помещения их в отдельный почтовый ящик мы будем использовать bmf (или другую подобную программу). Работа bmf основана на ведении статистики 'хороших' и 'плохих' слов и анализе писем на наличие этих слов. Немного модифицируем ~/.procmailrc: # Сюда будет помещаться почта, не подходящая ни под одно из # следующих правил. DEFAULT=$HOME/.mail/inbox # Файл, содержащий протокол работы procmail. LOGFILE=$HOME/.procmail/procmail.log PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin :0fw | bmf -p :0: * ^X-Spam-Status: Yes $HOME/.mail/spam :0: * ^X-Mailing-List: $HOME/.mail/youros-users :0: * ^X-Mailing-List: $HOME/.mail/youros-security :0: * ^From: .* <.+@yourcompany.com> $HOME/.mail/yourcompany Таким образом весь спам будет помещаться в почтовый ящик ~/.mail/spam Осталось только создать базы 'плохих' и 'хороших' слов для bmf. Отредактируем файл ~/.muttrc - добавим к нему следующие строки: # bayesian mail filter macro index "|bmf -S\n" "SPAM" macro index "|bmf -N\n" "NOSPAM" macro pager "|bmf -S\n" "SPAM" macro pager "|bmf -N\n" "NOSPAM" Как только встречается очередное подобное письмо - просто нажимаем F9, и спама становится чуточку меньше Smiling (PS: неплохо конечно время от времени проверять почтовый ящик spam - ложные срабатывания вполне возможны (у меня не было ни одного)).
|