Next Previous Contents

Зачем вам может понадобится почтовый сервер на локальной машине? На этот вопрос наиболее полно и убедительно объяснено в документации по установке и настройке Linux-Mandrake RE Spring 2001 [1], пункт 6.3 [2], поэтому повторяться не буду. Почему выбор пал на qmail? Тогда - так получилось. Сейчас могу сказать, что мне понравился qmail тем, что он поддерживает формат maildir - это оказалось очень удобно для контроля за корреспонденцией. Мнение чисто субъективное. Уверен, для себя вы найдётё свою причину, не менее важную. Более подробную информацию о том, какими достоинствами обладает qmail, вы можете найти на русскоязычном сайте, который посвящен qmail [3]. Там же есть форум. На этом сайте есть ссылки на информационные ресурсы относящиеся к qmail [4]. На этой же страничке перечислено программное обеспечение, которое работает совместно с qmail. Но не всё, поэтому не поленитесь и прочтите статью "Жизнь с qmail" ("Life with qmail", LWQ) [5].

Намного позже, когда всё утряслось и заработало, и я смог прочитать ещё раз документацию и статьи по qmail, то всё показалось достаточно простым и понятным :). Всегда приятно, когда что-то сразу заработает. Чтобы стимулировать вашу заинтересованность, я написал скрипт для инсталляции qmail+сопутствующие программы. Скрипт, увы не блещет изяществом, но работает - это главное.

Итак, начнём. Вот список архивов программ, которые нам понадобятся для инсталляции:

checkpassword-0.90.tar.gz getmail-2.1.1.tar.gz maildrop-1.3.6.tar.gz qmail-1.03.tar.gz serialmail-0.75.tar.gz ucspi-tcp-0.88.tar.gz

Найти их можно или через сайт посвящённый qmail [3], или через поисковик FileSearch [9]. Что нужно сделать? Распаковать архив со скриптами инсталляции [8] и туда же поместить шесть наших архивов. Если вы хотите использвать архивы пакетов с другими версиями, то просмотрите скрипт qmail.setup . В нём нужно исправить номера версий пакетов на те, которые вы хотите использовать. Общий список выглядит так:

checkpassword-0.90.tar.gz getmail-2.1.1.tar.gz maildrop-1.3.6.tar.gz qmail-1.03.tar.gz qmail.daemon qmail.rc qmail.setup serialmail-0.75.tar.gz ucspi-tcp-0.88.tar.gz xinetd.qpop3 xinetd.qsmtp

Кто есть кто?

Прежде чем запускать скрипт qmail.setup, просмотрите раздел переменных в нём. Обратите внимание на следующие переменные:

Запускайте скрипт qmail.setup . Что он будет делать? Во-первых, проверит работаете вы под правами root'а или нет. Если нет, то остановит скрипт. Далее, если всё в порядке, он создаст заново группы пользвателей необходимых для работы qmail (qmaild, qmaill и т.д.). Если существует подкаталог $QHOME (это имя перменной среды /var/qmail; здесь и далее, если вы встретите слово со знаком $ вначале - это переменная среды), то он переименует его в $QHOME.$RANDOM. Потом создаст каталог tmp.$RANDOM, распакует в нём архивы и запустит компиляцию исходников. Если у вас возникнут проблемы на этапе компиляции, то скорее всего, у вас не установлена какая-то из библиотек. В этом случае просмотрите файл qmail-setup-err.log на предмет дополнительной информации. Если же компиляция прошла успешно, то:

После успешной (я надеюсь) работы скрипта, сделайте, как минимум, следующие изменения в файле bash_profile пользователя $YOUR_LOCAL_NAME:

Это нужно для того, чтобы при формировании письма в поле Return-Path: стоял реально существующий обратный адрес $MAILUSER@$MAILHOST, на который сообщение о невозможности доставки будет возвращаться в случае ошибки. Иначе, ни один smtp-сервер (кроме вашего локального) не примет эту почту к отправке. Поле From: может содержать совершенно другой адрес. Потом, когда займётесь настройкой своей машины, эту операцию нужно будет проделать со всеми пользователями, которые буду работать на вашем компьютере. Вообще-то этот трюк с маскированием пользователя нужен в том случае, если вы в своём почтовом клиенте настроите отправку через /usr/bin/sendmail, а не через smtp-порт. В этом случае в поле Return-Path: будет прописываться либо значение $MAILUSER@$MAILHOST, либо, если значения переменных $MAILUSER и $MAILHOST не заданы, - $USER@$HOSTNAME. В втором случае, если сервера $HOSTNAME в Интернет не существует, отправка почты "наружу" smtp-сервером провайдера будет отменена.

Хорошо. Теперь давайте проверим поднялись ли pop3 и smtp сервисы. Для smtp вы должны набрать команду (желательно под root'ом):

netstat --inet -pan | grep :25

Если всё в порядке, то вы увидите примерно такую строку:

tcp 0 0.0.0.0:25 0.0.0.0:* LISTEN 18529/xinetd

Для pop3:

netstat --inet -pan | grep :110

Результат:

tcp 0 0.0.0.0:110 0.0.0.0:* LISTEN 18529/xinetd

Теперь нужно убедиться в том, что qmail запущен:

ps ax | grep qmail

Результат (что-то такое):

18236 ? S 0:00 qmail-send 18237 ? S 0:00 splogger qmail 18238 ? S 0:00 qmail-lspawn ./Maildir/ 18239 ? S 0:00 qmail-rspawn 18240 ? S 0:00 qmail-clean 18765 pts/3 S 0:00 grep qmail

Если же нет, то запустите qmail командой:

csh -cf "/var/qmail/rc &"

Войдите в систему как пользователь quser01. Наберте команду:

echo to: quser02 | /var/qmail/bin/qmail-inject

qmail-inject - это программа-инжектор почты. Она доставляет сообщение, поступившее ей на стандартный вход, либо локальному пользователю, либо, если адрес не совпадает с именем ни одного из пользователей системы, в папку /var/qmail/alias/pppdir/new для дальнейшей отправки "наружу" при помощи serialmail.

Войдите через другую консоль как пользователь quser02. Зайдите в каталог ~/Maildir/new/. Там должен лежать файл примерно с таким названием:

1009407730.5566.home.lg

Только вместо home.lg у вас будет прописано значение переменной среды $HOSTNAME и числа будут другие. Если же этого файла там не оказалось, то посмотрите что пишется в /var/log/mail/all по поводу отправки сообщения. В процессе отладки я неправильно присвоил атрибуты для файла .qmail в каталоге пользователя quser02 и почта до него не доходила. Просмотрев логи, я обнаружил примерно вот такое сообщение:

Dec 27 01:02:10 home qmail: 1009407730.230818 info msg 17146: bytes 186 from <root@home.lg> qp 5860 uid 0 Dec 27 01:02:10 home qmail: 1009407730.232501 starting delivery 58: msg 17146 to local quser02@home.lg Dec 27 01:02:10 home qmail: 1009407730.232640 status: local 1/10 remote 0/20 Dec 27 01:02:10 home qmail: 1009407730.239249 delivery 58: deferral: Unable_to_open_.qmail:_access_denied._(#4.3.0)/ Dec 27 01:02:10 home qmail: 1009407730.239393 status: local 0/10 remote 0/20

Во всём этом интересна фраза ...Unable_to_open_.qmail:_access_denied...:

Хорошо. Теперь настройте почтовый клиент (например, kmail). В качестве pop3 и smtp сервера укажите localhost. Пароль для доступа к pop3 серверу тот же, что и для регистрации в системе (если это не подходит, то внимательней ознакомьтесь со статьёй и инсталлятором Alex'а Murphy - он использует патч для checkpassword, позволяющий назначать пароли для доступа к pop3 серверу отличные от тех, что присвоены пользователям).

Теперь проверим отправляет ли "наружу" qmail письма:

echo to: укажите_ваш_e-mail | /var/qmail/bin/qmail-inject

Если всё прошло нормально, то в каталоге /var/qmail/alias/pppdir/new появится письмо для вас (или для того, чей адрес вы указали). Если возникли проблемы, то обратитесь опять к логам - должно помочь. Помните то, что я говорил про Return-Path:! Проделайте ту же операцию, но уже используя почтовый клиент. Отправьте письмо по тому же адресу. Если ваш smtp-сервер поднят и правильно настроен, то проблем не должно быть.

Попробуем отправить почту наружу. Дозвонитесь к своему провайдеру и после этого выполните следующую команду:

/usr/local/bin/maildirsmtp /var/qmail/alias/pppdir alias-ppp- smtp.myisp.com `hostname`

Если оба сообщения ушли, то вы увидите примерно следующее:

maildirserial: info: new/1009399782.4280.home.lg succeeded: 124.118.122.5 said: 250 2.0.0 fBQLKVs22135 Message accepted for delivery maildirserial: info: new/1009400486.4337.home.lg succeeded: 124.118.122.5 said: 250 2.0.0 fBQLNHs22192 Message accepted for delivery

Если же сервер отказал в отправке, то скорее всего проблема, либо в адресе получателя (поле To:), либо в поле Return-Path:.

Замечательно. Проще всего вставить команду на отправку почты в скрипт /etc/ppp/ip-up.local. Этот файл не создаётся автоматически при установке пакета ppp, но если он есть, то скрипт /etc/ppp/ip-up будет его запускать каждый раз, когда поднимается интерфейс ppp. Вот кусок моего /etc/ppp/ip-up.local

#!/bin/bash # перенаправляем все сообщения в файл exec >/etc/ppp/ip-up.log exec 2>&1
date
PATH="$PATH:/usr/local/bin"
/usr/local/bin/maildirsmtp /var/qmail/alias/pppdir alias-ppp- \ smtp.myisp.com `hostname` 
# ...skip...
date
# накапливаем эти сообщения в другом файле # так сделано для того, чтобы файл /etc/ppp/ip-up.log можно было # предварительно обработать, а потом сохранить, да и просматривать # удобнее последний лог cat /etc/ppp/ip-up.log >>/etc/ppp/ip-up.log.arch
exit 0

ОК. Теперь осталось настроить работу getmail для приёма почты. Программа getmail написана на языке Python. По умолчанию она требует, чтобы её скопировали в каталог /usr/lib/getmail. В этом же каталоге лежит документация. Но это можно изменить, если подправить переменную $GETMAILPATH в скрипте /usr/lib/getmail/getmail. В принципе, это не обязательно. Достаточно настроить симлинк на неё в удобном для вас месте.

Если вы хотите принимать почту при помощи getmail, то вы должны создать в домашнем каталоге пользователя подкаталог .getmail и в нём создать файл getmailrc. Пример простейшей конфигурации вы найдёте в домашних каталогах тестовых пользователей. При этом первый пользователь забирает почту у второго пользователя, а все остальные у первого. Бред, конечно :-), но главное показать, что это работает. Вот конфигурационный файл getmail'а для пользователя quser01:

[default] delete = 1 # удалять почту при приёме use_apop = 0 # не использовать протокол APOP
[quser01 mailbox] server = localhost # pop-сервер user = quser02 # логин для доступа к серверу password = quser02 # пароль для доступа к серверу postmaster = /home/quser01/Maildir/ # куда доставлять почту message_log = /home/quser01/.getmail/getmail.log # куда писать логи

Зайдите в систему под первым пользователем и запустите getmail (помните о том, что запускать getmail невозможно под правами root'а).

/usr/lib/getmail/getmail

Вы увидите примерно следующее:

...skip... localhost: POP3 session initiated on port 110 for "quser01" localhost: POP3 greeting: +OK <15973.1009468630@localhost> localhost: POP3 user response: +OK localhost: POP3 PASS response: +OK localhost: POP3 list response: +OK msg #1 : len 298 ... retrieved ... delivered to postmaster ... deleted localhost: finished retrieving messages localhost: POP3 session completed for "quser01" localhost: retrieved 1 messages for 1 local recipients

Почта принята. Теперь запустите kmail (или тот почтовый клиент, которым вы пользуетесь) и примите почту. Получается? Замечательно. Принцип приёма почты из вне тот же, что и для локальной почты. Только замените в ~/.getmail/getmailrc имя сервера, логин и пароль на тот, что нужен для доступа к серверу и запустите getmail (когда вы подключены к Интернет) от имени того пользователя, чью почту хотите принять. Лучше всего это прописать в скрипте /etc/ppp/ip-up.local (например):

echo -e "\nПроверка почты пользователя <alex>..." su alex -c /usr/lib/getmail/getmail

В конечном итоге скрипт /etc/ppp/ip-up.local принимает следующий вид (для краткости без комментариев):

#!/bin/bash exec >/etc/ppp/ip-up.log exec 2>&1
date
PATH="$PATH:/usr/local/bin"
/usr/local/bin/maildirsmtp /var/qmail/alias/pppdir alias-ppp- \ smtp.myisp.com `hostname` 
echo -e "\nПроверка почты пользователя <alex>..." su alex -c /usr/lib/getmail/getmail
echo -e "\nПриём новостей с <news.myisp.com>..." su news -c /usr/local/sbin/fetchnews
date
cat /etc/ppp/ip-up.log >>/etc/ppp/ip-up.log.arch
exit 0

Готово. В заключении, несколько слов о почтовых фильтрах maildrop и procmail. Если из одного почтового ящика приходится забирать почту для нескольких локальных пользователей, то удобно её размещать по почтовым ящикам пользователей. Для этого нужно в файле ~/.getmail/getmailrc перменной postmaster присовить вот такое значение:

postmaster = |/usr/local/bin/maildrop

В этот путь по умолчанию инсталлирован maildrop. После этого создайте файл ~/.mailfilter. В моём случае он выглядит так:

logfile "$HOME/.getmail/maildrop.log"
log "->Копия отправляется пользователю <mailarch>.." cc "!mailarch"
if (/^To:.*user2001[:wbreak:]/) { log "->Сообщение пересылается пользователю <user2001>.." to "!user2001" }
to "!alex"

Если вам нравиться procmail (его язык выглядит проще), то можете использовать его. Единственное на что обратите внимание, так это то, что procmail при удачном завершении возвращает код отличный от нуля, getmail этого не понимает. Чтобы обойти это, сделайте следующее - создайте скрипт, который вызывает procmail и завершается (насильно) с нулевым кодом:

#!/bin/bash /usr/bin/procmail exit 0

В файле ~/.getmail/getmailrc пишем:

postmaster = |путь_к_скрипту/имя_скрипта

В домашнем каталоге создаём файл .procmailrc ( обязательно убедитесь в том, что все пути в PATH достижимы, если нет, то удалите их!):

PATH=$HOME/bin:/usr/bin:/bin:/usr/local/bin:. MAILDIR=$HOME/Maildir DEFAULT=$MAILDIR/ LOGFILE=$HOME/.getmail/procmail.log LOCKFILE=$HOME/.lockmail
:0 * ^To.*user2001@yahoo.org |/var/qmail/bin/qmail-inject user2001

Здесь немного другой алгоритм. Если почта содержит в поле To: user2001@yahoo.org, то она перенаправляется пользователю user2001 при помощи программы qmail-inject, иначе корреспонденция достигает почтового каталога текущего пользователя.

Если вы хотите принять почту с нескольких pop-серверов, то в файле ~/.getmail/getmailrc пропишите несколько разделов описывающих сервера, пароли и т.д. При этом укажите в качестве postmaster'а почтовый фильтр - он будет заниматься рассылкой почты локальным пользователям:

[default] delete = 1 use_apop = 0 message_log = /tmp/getmail.log
[quser03 mailbox] server = localhost user = quser03 password = quser03 postmaster = |/usr/local/bin/maildrop
[quser02 mailbox] server = localhost user = quser02 password = quser02 postmaster = |/usr/local/bin/maildrop

Или пропишите для каждого пользователя конфигурационный файл ~/.getmail/getmailrc. Тогда вам нужно будет вызывать скрипт /usr/lib/getmail/getmail от имени каждого пользователя. Что проще и удобнее для вас - решайте сами.

Александр Куприн. ru_classic@mail.ru


Next Previous Contents
Используются технологии uCoz