Ключевые слова:exim, fetchmail, procmail, mutt, mail, pop3, spam, (найти похожие документы)
From: ilya voronin <ivoronin аt ivoronin.pp.ru>
Newsgroups: http://www.nixp.ru/
Date: Mon, 17 May 2004 18:21:07 +0000 (UTC)
Subject: Почтовая система для домашней машины на базе exim и fetchmail
Оригинал: http://www.nixp.ru/cgi-bin/go.pl?q=articles;a=mta-home
0. Предисловие.
В настоящее время в web можно найти множество статей о том, как
настроить почтовый сервер для небольшой организации или огромной
компании, как реализовать аутентификацию с помощью LDAP или MySQL, как
настроить SSL и DNSBL или даже как хранить все письма в SQL-базе, но
нет практически ни одной о том, как настроить почтовую систему для
работы на обыкновенной домашней машине. Автор не несет никакой
отвественности за ваши испорченные нервы, потерянную почту и все
остальное, что может случиться :).
0.1 Некоторые термины, сокращения и соглашения
Имена хостов, пользователей, имена файлов, почтовые адреса и некоторые
термины выделены в тексте вот так.
В статье предполагается, что вы работаете на машине с UNIX-like OS с
правами некоего пользователя, и этот пользователь не root (хотя права
root нам тоже понадобятся). Назовем его jdoe. Имя машины --
jdoe.local.provider.net. Ваш провайдер предоставляет вам
smtp-сервер -- smtp.provider.net, через который вы можете свободно,
без какой-либо аутентификации (исключая аутентификацию по вашему
адресу) отправлять почту и pop3 сервер -- pop3.provider.net, где у вас
есть почтовый ящик jdoe@provider.net. Также у вас есть почтовый ящик
на одном из бесплатных серверов -- jdoe@zzzmail.com (pop3-сервер --
pop3.zzzmail.com).
Программы, которые требуется запускать с правами суперпользователя в
примерах имеют в качестве приглашения интерпретатора знак #, программы
запускаемые от имени пользователя (jdoe) -- знак $.
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 для
вашей системы, проверьте ;). Если ваши версии немного отличаются от
рассматриваемых -- ничего страшного, думаю, все будет работать. (за
исключением 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).
Прежде немного теории. Во-первых, из каких частей состоит почтовый
адрес? RFC 2822 дает ответ на этот вопрос: часть адреса до <<@>>
называется local part, часть адрес после <<@>> -- domain part. В
адресе jdoe@zzzmail.com: local part -- jdoe, domain part --
zzzmail.com. В файле конфигурации exim можно использовать переменную
$local_part (и еще множество других), которая содержит локальную часть
адреса.
Приблизительный файл конфигурации (то, что начинается с #, -- мои
коментарии, неплохо бы их читать):
# Здесь вместо '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, что совсем не хорошо, поэтому
# мы будем переписывать адрес источника в них.
# Здесь:
# jdoe@jdoe.local.provider.net -- оригинальный адрес источника
# jdoe@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. Одним словом обратитесь к документации на
вашу ОС ;)
Для управления очередью сообщений необходимо периодически запускать
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 Mon Jan 01 00:01 14/450 test!
& 1
Message: 1
From jdoe@jdoe.local.provider.net Mon Jan 01 00:01:00 2235
Envelope-to: jdoe@jdoe.local.provider.net
To: jdoe@jdoe.local.provider.net
Subject: test!
From: 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 -- это очень мощный почтовый клиент (особенно если ознакомиться с
документацией ;)). Для начала запишем следующие строки в ~/.muttrc:
# Кодировка для ввода/вывода текста
set charset="koi8-r"
# Кодировки для исходящих сообщений
set send_charset="us-ascii:iso-8859-1:koi8-r"
Запустим 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 вручную :). Поэтому можно
заставить работать его демоном, проверяя наличие почты на серверах
через заданный промежуток времени. Изменим немного ~/.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) и отправим его, если с соединением все в порядке,
то через полчаса (или что вы там указали в ~/.fetchmailrc) мы получим
его обратно. Обратите внимание на адрес отправителя: если у вас все
правильно работает, он будет тем, что вы указали в секции rewriting в
файле конфигурации exim.
3. Для тех кому этого мало.
В данный момент наша почтовая система настроена и прекрасно
функционирует. Но как же такие веши как сортировка почты и фильтрация
спама? ;)
3.1 Сортировка писем.
Для сортировки почты вы воспользуемся procmail. Для начала создадим
файл ~/.forward, в который запишем всего одну строку:
"|/usr/bin/procmail"
(Если у вас procmail находится в другом месте, исправьте эту строку на
правильную).
Создадим директорию ~/.mail -- теперь вся почта у нас будет храниться
там:
$ mkdir ~/.mail
Допустим, вы подписаны на несколько списков рассылки, ну, скажем
users@lists.youros.org и security@lists.youros.org, а также часто
получаете письма с места работы (домен yourcompany.com) и не хотели бы
их смешивать в одном почтовом ящике. Вот сценарий procmail, который
реализует это:
# Сюда будет помещаться почта, не подходящая ни под одно из
# следующих правил.
DEFAULT=$HOME/.mail/inbox
# Файл, содержащий протокол работы procmail.
LOGFILE=$HOME/.procmail/procmail.log
:0:
* ^X-Mailing-List: <users@lists.youros.org>
$HOME/.mail/youros-users
:0:
* ^X-Mailing-List: <security@lists.youros.org>
$HOME/.mail/youros-security
:0:
* ^From:.*<.+@yourcompany.com>
$HOME/.mail/yourcompany
Также отредактируем конфиг mutt (файл ~/.muttrc):
# Не имеет к сортировке почты никакого отношения, просто позволит вам отвечать
# в списки рассылки.
lists users@lists.youros.org
lists 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"
Запускаем 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 <f9> "|bmf -S\n" "SPAM"
macro index <f10> "|bmf -N\n" "NOSPAM"
macro pager <f9> "|bmf -S\n" "SPAM"
macro pager <f10> "|bmf -N\n" "NOSPAM"
Как только встречается очередное подобное письмо, просто нажимаем F9,
и спама становится чуточку меньше :)
(PS: неплохо, конечно, время от времени проверять почтовый ящик
spam -- ложные срабатывания вполне возможны (у меня не было ни
одного)).
4. Заключение.
Я постарался как можно подробнее и вместе с тем не вдаваясь в
технические подробности описать настройку почтовой системы для
домашней машины (хотя такую систему вполне можно использовать и для
маленького сервера с небольшим количеством пользователей, для этого
достаточно установить любой pop3-сервер, к примеру popa3d,
http://www.openwall.com/popa3d/ и доработать конфигурацию exim
(советую заглянуть в его конфиг по умолчанию)), получилось или нет --
не знаю ;). Если вы нашли в статье какую-либо неточность или ошибку,
сообщайте.