Почтовая система для домашней машины: exim+fetchmail+procmail+bmf
Администрирование
Статья была опубликована 1 февраля 2010 года в 00:00, а последний раз правилась 1 февраля 2010 года в 10:46.
Постоянная ссылка: http://www.nixp.ru/articles/42.html
0. Предисловие.
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!
&
Примечание: Если на этом этапе возникают проблемы, а 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.)
Примечание: Для тех, кто хочет управлять почтой прямо на сервере, просматривая заголовки писем, я бы рекомендовал 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, и спама становится чуточку меньше :)
Примечание: Неплохо, конечно, время от времени проверять почтовый ящик spam — ложные срабатывания вполне возможны (у меня не было ни одного).
4. Заключение
Я постарался как можно подробнее и вместе с тем не вдаваясь в технические подробности описать настройку почтовой системы для домашней машины. Хотя такую систему вполне можно использовать и для маленького сервера с небольшим количеством пользователей, для этого достаточно установить любой pop3-сервер, к примеру, popa3d (http://www.openwall.com/popa3d/) и доработать конфигурацию exim (советую заглянуть в его конфиг по умолчанию). Если вы нашли в статье какую-либо неточность или ошибку, сообщайте.
-
Популярные в этом разделе:
- «Настройка сервера SSH (теория и практика)»,
- «Реализация отправки и приёма SMS с помощью Gnokii»,
- «Настройка сервера OpenLDAP».
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1