The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Почтовая система для домашней машины на базе exim и fetchmail (exim fetchmail procmail mutt mail pop3 spam)


<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>
Ключевые слова: 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, где у вас есть почтовый ящик [email protected]. Также у вас есть почтовый ящик на одном из бесплатных серверов -- [email protected] (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. В адресе [email protected]: 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, и все письма, исходящие с нее, # будут иметь адрес источника [email protected], что совсем не хорошо, поэтому # мы будем переписывать адрес источника в них. # Здесь: # [email protected] -- оригинальный адрес источника # [email protected] -- на этот адрес в письмах будет заменяться [email protected]. # Ffrs -- некоторая 'магическая' комбинация флагов, особо любопытные могут прочитать подробнее # в документации по exim, в разделе 'ADDRESS REWRITING'. # begin rewrite [email protected] [email protected] 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 [email protected] Mon Jan 01 00:01 14/450 test! & 1 Message: 1 From [email protected] Mon Jan 01 00:01:00 2235 Envelope-to: [email protected] To: [email protected] Subject: test! From: [email protected] 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 Тест Напишем самому себе письмо на один из наших адресов (скажем, на [email protected]) и отправим его, если с соединением все в порядке, то через полчаса (или что вы там указали в ~/.fetchmailrc) мы получим его обратно. Обратите внимание на адрес отправителя: если у вас все правильно работает, он будет тем, что вы указали в секции rewriting в файле конфигурации exim. 3. Для тех кому этого мало. В данный момент наша почтовая система настроена и прекрасно функционирует. Но как же такие веши как сортировка почты и фильтрация спама? ;) 3.1 Сортировка писем. Для сортировки почты вы воспользуемся procmail. Для начала создадим файл ~/.forward, в который запишем всего одну строку: "|/usr/bin/procmail" (Если у вас procmail находится в другом месте, исправьте эту строку на правильную). Создадим директорию ~/.mail -- теперь вся почта у нас будет храниться там: $ mkdir ~/.mail Допустим, вы подписаны на несколько списков рассылки, ну, скажем [email protected] и [email protected], а также часто получаете письма с места работы (домен yourcompany.com) и не хотели бы их смешивать в одном почтовом ящике. Вот сценарий procmail, который реализует это: # Сюда будет помещаться почта, не подходящая ни под одно из # следующих правил. DEFAULT=$HOME/.mail/inbox # Файл, содержащий протокол работы procmail. LOGFILE=$HOME/.procmail/procmail.log :0: * ^X-Mailing-List: <[email protected]> $HOME/.mail/youros-users :0: * ^X-Mailing-List: <[email protected]> $HOME/.mail/youros-security :0: * ^From:.*<[email protected]> $HOME/.mail/yourcompany Также отредактируем конфиг mutt (файл ~/.muttrc): # Не имеет к сортировке почты никакого отношения, просто позволит вам отвечать # в списки рассылки. lists [email protected] lists [email protected] # Директория с почтовыми ящиками (в последствии можно обращаться к этому значению, # записывая знак '=') 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: .* <[email protected]> $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 (советую заглянуть в его конфиг по умолчанию)), получилось или нет -- не знаю ;). Если вы нашли в статье какую-либо неточность или ошибку, сообщайте.

<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>

Обсуждение [ RSS ]
  • 1, Имя (?), 16:38, 06/11/2006 [ответить]  
  • +/
    для борьбы со спамом я использую такие правила deny condition lookup ... большой текст свёрнут, показать
     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру