Жизнь с qmail

Dave Sill
24 января 2006 года.
Перевод М. Альхименко при помощи OmegaT и StarDict
Оригинал: ru.qmail.org
29 ноября 2007 года.


Содержание


1. Введение

1.1. Для кого предназначен документ

Life with qmail нацелен на всех, кто интересуется запуском qmail, начиная с явных новичков (newbie), которые только установили Linux на свободный компьютер, и заканчивая опытными системными администраторами. Если вы обнаружили упущения или неточности, поставьте меня в известность. Присылайте комментарии на lwq@sill.org.

О qmail доступно большое количество информации из разных источников. Некоторые их них рассчитаны на новичков, некоторые предполагают что читатель более опытен. Life with qmail -- попытка "склеить" эту информацию в один источник, заполняющий некоторые трещины и предполагающий, что читатель имеет базовые навыки, такие как:

1.2. Что такое qmail?

qmail -- агент пересылки почты Интернет (Internet Mail Transfer Agent, MTA) для UNIX-like операционных систем. Это замена для Sendmail, который входит в состав большинства ОС UNIX. qmail использует SMTP (Simple Mail Transfer Protocol) для обмена сообщениями с MTA на других системах.


Примечание: Название -- "qmail", не "Qmail".

1.3. Зачем использовать qmail?

Ваша операционная система включает в себя MTA, скорее всего Sendmail, так что если вы читаете этот документ, вы, вероятно, ищете что-то лучшее. Некоторые из преимуществ qmail над штатными MTA включают:

1.3.1. Безопасность

qmail был разработан для обеспечения наивысшей безопасности. Sendmail имеет долгую историю серьезных проблем с безопасностью. Когда был написан Sendmail Сеть была намного более дружественным местом. Все знали друг друга, и не существовало большой необходимости разрабатывать и писать код для обеспечения высокого уровня безопасности. Сегодня Интернет намного более враждебная среда для сетевых серверов. Автор Sendmail, Eric Allman, и текущий разработчик, Claus Assman, сделал хорошую работу по усилению программы, но небольшое изменение дизайна никогда не позволит достичь настоящей безопасности.

1.3.2. Производительность

qmail по умолчанию распараллеливает доставку почты, выполняя до 20 параллельных процессов доставки одновременно.

1.3.3. Надежность

Как только qmail принимает сообщение, он гарантирует, что оно не будет потеряно. qmail также поддерживает новый формат почтового ящика, которые надежно работает без блокировок даже поверх NFS.

1.3.4. Простота

qmail меньше, чем любой другой MTA с эквивалентными возможностями.


Примечание: Официальная страница qmail, http://cr.yp.to/qmail.html, более широко охватывает преимущества qmail.

1.4. История

qmail написал Dan Bernstein (DJB), http://en.wikipedia.org/wiki/Daniel_J._Bernstein, профессор математики, в данный момент работающий в University of Illinois в Чикаго. Dr. Bernstein также хорошо известен за свои работы в области криптографии, и за судебный процесс против правительства США, связанный с публикацией исходных кодов средств шифрования. Смотрите http://en.wikipedia.org/wiki/Bernstein_v._United_States или http://cr.yp.to/export.html для получения дополнительной информации о процессе.

Первая общедоступная версия qmail, бета-версия 0.70, была обнародована 24 января 1996 года. Первая гамма-версия была обнародована 1 августа 1996 года.

Первая genaral-версия, 1.0, была анонсирована 20 февраля 1997 года. Текущая версия, 1.03, была обнародована 15 июня 1998 года.

Следующий выпуск, как ожидается, будет версией 2.0. Некоторые из возможностей, которые могли бы появиться в версии 2, описаны в http://cr.yp.to/qmail/future.html.

1.5. Возможности

На Web-странице qmail, http://cr.yp.to/qmail.html, имеется исчерпывающий список возможностей qmail. Этот раздел в основном основывается на этом списке.

1.5.1. Установка

1.5.2. Безопасность

1.5.3. Структура сообщения

1.5.4. SMTP-сервис

1.5.5. Управление очередью

1.5.6. Сообщения о недоставке (bounces)

1.5.7. Маршрутизация на уровне домена

1.5.8. SMTP-доставка

1.5.9. Пересылка и списки рассылки

1.5.10. Локальная доставка

1.5.11. POP3-сервис

1.6. Родственные пакеты

qmail следует классической UNIX-философии, в которой каждый инструмент должен выполнять единственную, четко определенную функцию, и сложные функции должны строиться путем объединения простых инструментов в "канал ("pipeline"). Альтернативой является построение все более и более сложных средств, повторно реализуя значительную часть функционала простых средств.

Поэтому не стоит удивляться, что qmail сам по себе не делает всего, что от него могут захотеть. Ниже перечислены некоторые из самых популярных расширений, написанных для qmail. Конечно, вместе с qmail может быть использовано множество стандартных Unix-утилит.

1.7. Устройство

Приложение D описывает функциональную и физическую структуру qmail. В двух словах, qmail состоит из ряда программ (модулей), которые выполняют различные задачи.

1.8. Лицензия

Владельцем авторских прав на qmail является Dan Bernstein, и он (qmail) распространяется без сообщения об правах пользователя. В http://cr.yp.to/softwarelaw.html описано как он понимает ваши права в свете законов США об авторском праве. В http://cr.yp.to/qmail/dist.html он предоставляет право распространять исходный код qmail. Распространение бинарных дистрибутивов разрешено на условиях, описанных в том же документе и в http://cr.yp.to/qmail/var-qmail.html. См. также http://en.wikipedia.org/wiki/License-free_software.

В итоге, вы можете использовать qmail в любых целях, вы можете распространять немодифицированный исходный код qmail и т.н. var-qmail бинарные пакеты, также, вы можете распространять патчи для qmail. Вы не можете распространять модифицированный исходный код qmail или не-var-qmail бинарные пакеты.

1.9. Сравнение с другими MTA

На эту тему можно написать целую книгу, но это будет довольно скучное чтиво. Здесь приводится краткое сравнение qmail с некоторым наиболее распространенными UNIX MTA.

MTA Зрелость Безопасность Возможности Производительность Sendmail'ность Модульность
qmail средняя высокая высокая высокая дополнения да
Sendmail высокая низкая высокая низкая x нет
Postfix средняя высокая высокая высокая да да
exim средняя низкая высокая средняя да нет
Courier низкая средняя высокая средняя опционально да

Sendmail'ность означает что MTA до определенной степени ведет себя подобно Sendmail, что может сделать переход с Sendmail на альтернативный MTA более прозрачным для пользователей, как пример -- использование .forward-файлов, /etc/aliases, и доставки почты в /var/spool/mail.

На http://homepages.tesco.net/~J.deBoynePollard/Reviews/UnixMTSes/ находится обзор некоторых Unix MTA, написанный Jonathan de Boyne Pollard. Другое детальное сравнение доступно на http://www.geocities.com/mailsoftware42/.

1.10. Документация

1.10.1. man-страницы

Дистрибутив qmail содержит полный набор man-страниц. После установки они находятся в /var/qmail/man. Возможно, вам будет необходимо добавить этот каталог в переменную окружения MANPATH.

Оболочка Команда
Bourne (/bin/sh) MANPATH=$MANPATH:/var/qmail/man; export MANPATH
bash, Korn export MANPATH=$MANPATH:/var/qmail/man
C Shell setenv MANPATH $MANPATH:/var/qmail/man

На данный момент, команды вида "man имя-man-страницы-qmai " должны отобразить соответствующую man-страницу.

Man-страницы также доступны on-line в формате HTML:


Примечание: man-страницы qmail весьма информативны, но они требуют внимательного чтения, т.к. они написаны в очень плотном, техническом стиле. Возможно, вам захочется распечатать их и просмотреть один раз, чтобы быть в курсе где про что написано. Повторяется на нескольких страницах только очень маленькое количество информации , так что если вы не в курсе где что описано, может быть трудно найти это.

1.10.2. Документы

Дистрибутив qmail включает в себя ряд документов, которые будут скопированы при установке в /var/qmail/doc. Они включают:

Эти документы также доступны on-line:

1.10.3. FAQs

Существует два официальных FAQ (Frequently Asked Questions, часто задаваемых вопросов):

Web FAQ более полный.

1.10.4. Книги

1.10.4.1. The qmail Handbook

Dave Sill, автор Life with qmail, также написал книгу о qmail для Apress (http://www.apress.com/). Эта книга, The qmail Handbook, включает всё из этого руководства, но с бОльшим количеством деталей, а также описывает множество других тем.

Дополнительную информацию можно получить по адресу http://www.apress.com/catalog/book/1893115402/. Чтобы купить эту книгу см. http://www.amazon.com/exec/obidos/ASIN/1893115402/davesill.

1.10.4.2. qmail

John Levine написал книгу о qmail для O'Reilly & Associates (http://www.oreilly.com/). См. http://qmail.gurus.com/ для получения дополнительной информации, включающей содержание книги и одну главу (для примера).

Чтобы купить эту книгу см. http://www.amazon.com/exec/obidos/ASIN/1565926285/davesill.

1.10.4.3. Running qmail

Richard Blum написал Running qmail, опубликованную Sams. Эта книга получила противоречивые оценки в qmail mailing list.

Для получения дополнительной информации или покупки см. http://www.amazon.com/exec/obidos/ASIN/0672319454/davesill.

1.10.4.4. qmail: Yuksek Performansli E-Posta Sunucu

Ismail Yenigul и др. написали книгу о qmail на турецком языке. См. http://www.acikakademi.com/catalog/qmail/.

1.10.5. Архивы списков рассылки (List archives)

Список рассылки (e-mail mailing list) qmail, поддерживаемый Dan Bernstein -- ценный источник информации. Web-архив сообщений рассылки хранится по адресу:

Поиск по архиву:

Другие web-архивы:

На большинство вопросов о qmail можно найти ответы, если начать с поиска по архивам списков рассылки.

1.10.6. Другие web-сайты

1.11. Поддержка

1.11.1. Списки рассылки (Mailing lists)

Следующие списки живут на list.cr.yp.to. Для того чтобы предотвратить сбор e-mail адресов спамерами, я избегаю использования полных, правильных адресов и "mailto" URL'ов.

Списки управляются с помощью ezmlm, который использует отдельные адреса для осуществления различных функций:

Чтобы специально указать адрес для подписки / отписки, скажем, joe@example.com, отошлите сообщение на:

1.11.1.1. qmail

Основной список рассылки по qmail. Для обсуждения и вопросов/ответов про большинство вещей, связанных с qmail, за исключением тех, у которых есть свой собственный список рассылки. Прочитайте "12 Steps to qmail List Bliss" Charles Cazabon на http://pyropus.ca/personal/writings/12-steps-to-qmail-list-bliss.html перед тем отправкой сообщений. Также, прочитайте FAQ и воспользуйтесь поиском по архивам перед отправкой вопроса. Когда вы задаете вопрос, пожалуйста, постарайтесь включить достаточное количество деталей, чтобы дать ответ на вопросы:


Примечание: список рассылки qmail использует утилиту qsecretary, чтобы убедиться, что сообщение, отправленное в список рассылки, не является спамом. Каждое сообщение, отправленное в список рассылки, рождает запрос на подтверждение от qsecretary. Прочитайте этот запрос и следуйте указаниям, чтобы подтвердить ваше сообщение -- обычно только тот, кто отвечает на сообщение qsecretary добьется цели. Регулярные участники рассылки часто автоматизируют этот процесс, используя автоответчики (autoresponders), подобные pymsgauth Charles Cazabon, доступный по адресу http://pyropus.ca/software/pymsgauth/. pymsgauth проверяет, что сообщение пришло в список рассылки qmail действительно от вас, следовательно, он не будет автоматически подтверждать поддельные сообщения, отосланные в рассылку от вашего имени.


1.11.1.2. qmailannounce

Рассылка, посвященная анонсам qmail. О новых версиях объявляется здесь. Адреса для отправки писем не существует: эта рассылка только для чтения.

1.11.1.3. serialmail

Для обсуждения пакета serialmail.

1.11.1.4. ezmlm

Для обсуждения менеджера рассылок ezmlm.

1.11.2. Консультации

См. http://www.qmail.org/top.html#paidsup для получения списка поставщиков коммерческой поддержки.

1.11.3. FAQTS Knowledgebase

База связанных с qmail вопросов и ответов доступна по адресу http://qmail.faqts.com/. Если на ваш вопрос нет ответа в FAQ, попытайтесь поискать в этой базе. Она обычно хорошо отвечает на "how to"-вопросы.


2. Установка

Этот раздел описывает установку qmail. Если вы являетесь опытным системным администратором, то можете установить qmail следуя инструкциям из файла INSTALL в дистрибутиве. Директивы файла INSTALL -- официальные директивы по установке. Они более сложные, чем директивы Life with qmail, и они подразумевают что читатель -- опытный системный администратор. Кроме того, они устарели и не отражают рекомендуемую в данный момент Bernstein'ом практику.


Примечание: Если вы выбрали установку с использованием дальнейших директив, прочитайте весь раздел, чтобы составить общее представление о процессе.

2.1. Вопросы, связанные с установкой

2.1.1. Откомпилированный код vs. исходного кода

Из-за ограничения лицензии qmail относительно предварительно откомпилированных пакетов, qmail обычно устанавливается из исходного кода.

Если Вы не знакомы с различием между исходными кодами и двоичным кодом (binaries), представьте что заказываете пиццу с доставкой на дом. "Откомпилированная" версия пиццы прибывает готовой к употреблению. Пицца в "исходном коде" поставляется как набор, содержащий муку, дрожжи, сыр, соус, все что кладут сверху и инструкцию для самостоятельного приготовления пиццы. Установка из исходных кодов требует немного большей работы, но если внимательно следовать инструкциям, то результат будет такой же, или даже лучше. Самостоятельно приготовленная пицца будет более свежей, вы можете изменить то, что кладется сверху под свои предпочтения, и вы будете больше знать о вашей пицце и о том, как она "работает".

Безопасно запустить доступный из Интернет сетевой сервис не так просто. Неправильно сконфигурированный сервис может поставить узел (host) под угрозу атаки, или может быть использован для атаки других сайтов и потенциально быть причиной судебного преследования администратора. Чем больше вы знаете как ваши сетевые сервисы работают, тем они более правильно и безопасно сконфигурированы.

2.1.2. Tar-архив vs. ОС-специфичных пакетов

Некоторые операционные системы предоставляют механизм для автоматизации установки из исходного кода. Возвращаясь к аналогии с пиццей - они делают возможным упаковать ингредиенты и руководства таким способом, что вы можете только нажать на кнопку и получить пиццу, которая приготовила сама себя.

Звучит заманчиво, не так ли?

На практике это может быть не такой хорошей идеей. Сборка этих пакетов довольно трудна, и они могут не делать то что надо предполагаемым путем. Они являются программами, и как и любая программа, они могут содержать ошибки. Но даже если они не содержат ошибок, удобство, которое они обеспечивают, имеет свою цену. Вы потеряете большинство преимуществ пиццы, приготовленной самостоятельно: возможность положить сверху что-то другое, знание того, как пицца приготавливается и как она "работает".

Если бы qmail был пиццей, подход с самостоятельным приготовлением мог бы не получить распространения. Но это не так: qmail довольно сложная система, которую установщик/куратор должен довольно хорошо понимать, чтобы быть в состоянии поддерживать безотказную работу системы. Самоустанавливающаяся версия qmail более легкая в установке, чем устанавливаемая пользователем, но устанавливаемая пользователем версия более проста в конфигурировании и поиске неисправностей. Вы устанавливаете qmail в систему один раз, но вы, вероятно, будете иметь несколько удобных случаев перенастроить его или попробовать вычислить, почему почта не следует по тому пути, который вы ожидали.

По этой причине я рекомендую устанавливать qmail с нуля, используя архив с исходным кодом, а не RPM или другой самоустанавливающийся пакет.

2.2. Подготовка

Перед инсталляцией qmail в систему, особенно если это ваша первая установка qmail, существует несколько вещей, о которых стоит подумать.

2.3. Требования к системе

qmail устанавливается и работает на большинстве UNIX и UNIX-подобных систем, но существует несколько требований:


Примечание: Каталог qmail bin должен размещаться на файловой системе, которая позволяет использовать исполняемые и setuid()-файлы. Некоторые дистрибутивы автоматически монтируют /var с включенными параметрами nosuid или noexec. В этих системах или эти опции должны быть отключены, или каталог /var/qmail/bin должен быть размещен на файловой системе, которая смонитирована без этих опций. Секция Создание каталогов описывает как использовать символические ссылки при выборе второго варианта. Если /var смонтирован с nosuid, вы, скорее всего, увидите следующее сообщение в логах qmail-send:

delivery : deferral: Sorry,_message_has_wrong_owner._(#4.3.5)



Примечание: qmail не получится правильно установить в Apple OS X используя эти инструкции, или инструкции из файла INSTALL. Eben Pratt описал процесс установки под OS X, инструкции доступны по адресу http://netdevice.com/qmail/#osx.


2.4. Получение исходного кода

Итак, вы получили систему, удовлетворяющую требованиям для установки qmail. Первый шаг -- загрузить исходный код qmail и некоторых других дополнений. Конечно же, вам понадобится qmail, и, вероятно, ucspi-tcp и daemontools:

Загрузите эти файлы, используя свой web-браузер, web-клиент (например, wget), или FTP-клиент.


Примечание: Если любая из этих ссылок не работает, возможно это происходит из-за того что пакет был обновлен. В этом случае вы должны зайти на http://cr.yp.to/software.html и, следуя за ссылками, загрузить текущую версию. Возможно новые версии не совместимы со следующими инструкциями, так что не забудьте прочесть примечания в разделе "Upgrading from previous versions....".


Примечание: Это руководство описывает установку netqmail -- дистрибутива qmail, который состоит из официального архива с qmail 1.03 и патча, который исправляет несколько ошибок, недостатков и несовместимостей. См. http://www.qmail.org/netqmail/ и файл CHANGES из состава netqmail для получения дополнительной информации.

2.5. Сборка из исходного кода

2.5.1. Проверка среды сборки

Первая вещь, которую необходимо сделать -- убедиться, что вы имеете необходимые инструменты для компиляции программы. Как вы это определите зависит от системы, которую вы используете. Самый легкий способ, хотя не и гарантированный, это попробовать.


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

$ cc cc: No input files specified $

В этом разделе мы пройдем фактические шаги компиляции qmail. Способ "копировать и вставить" (cut-n-paste) будет удобен, но не обязателен.

2.5.2. Распаковка дистрибутива

Если вы дошли до этого места, значит у вас есть работающий Си-компилятор и копия архива с исходными текстами. Далее, скопируйте или переместите архив в каталог, в котором вы хотите производить сборку. /usr/local/src -- хороший выбор для qmail и ucspi-tcp. daemontools должен быть собран в каталоге /package.

Сейчас вы, возможно, захотите стать root'ом, если этого уже не произошло.

su umask 022 mkdir -p /usr/local/src mv netqmail-1.05.tar.gz ucspi-tcp-0.88.tar.gz /usr/local/src mkdir -p /package mv daemontools-0.76.tar.gz /package chmod 1755 /package

Сейчас вы можете распаковать пакет.

cd /usr/local/src gunzip netqmail-1.05.tar.gz tar xpf netqmail-1.05.tar cd netqmail-1.05 ./collate.sh # здесь обратите внимание на ошибки cd .. gunzip ucspi-tcp-0.88.tar.gz tar xpf ucspi-tcp-0.88.tar rm *.tar # необязательно, если только места не крайне мало cd /package gunzip daemontools-0.76.tar.gz tar xpf daemontools-0.76.tar rm *.tar # опять же, опционально

В данный момент должны существовать каталоги /usr/local/src/netqmail-1.05, /usr/local/src/ucspi-tcp-0.88 и /package/admin/daemontools-0.76.

2.5.3. Создание каталогов

Поскольку программа установки qmail создаст подкаталоги как ей нужно, вам необходимо только создать "домашний" каталог qmail:

mkdir /var/qmail

И идем к следующему разделу.


Примечание: Если вы хотите чтобы некоторые или все файлы qmail были расположены не в /var, это может быть сделано созданием символических ссылок в /var/qmail, указывающих в другое местоположение.

Как пример , конфигурационные файлы qmail могут быть размещены в /etc/qmail с помощью команд:

mkdir /etc/qmail ln -s /etc/qmail /var/qmail/control


2.5.4. Создание пользователей и групп

Самый легкий путь создания необходимых пользователей и групп -- создать небольшой файл сценария, который сделает это за вас. В каталоге с исходными текстами вы найдете файл INSTALL.ids. Он содержит строки с командами для многих платформ, так что копируем его в файл с другим именем и редактируем, это будет и быстро, и легко.

cd /usr/local/src/netqmail-1.05/netqmail-1.05 cp INSTALL.ids IDS

Затем, используя свой любимый редактор, удаляем в этом файле все, кроме строк, которые необходимы. Например, вот как файл IDS будет выглядеть для FreeBSD после редактирования:

pw groupadd nofiles pw useradd qmaild -g nofiles -d /var/qmail -s /nonexistent pw useradd alias -g nofiles -d /var/qmail/alias -s /nonexistent pw useradd qmaill -g nofiles -d /var/qmail -s /nonexistent pw useradd qmailp -g nofiles -d /var/qmail -s /nonexistent pw groupadd qmail pw useradd qmailq -g qmail -d /var/qmail -s /nonexistent pw useradd qmailr -g qmail -d /var/qmail -s /nonexistent pw useradd qmails -g qmail -d /var/qmail -s /nonexistent

Далее, запустим его, или используя chmod, чтобы сделать его исполняемым, или с помощью sh:

Первый метод:

chmod 700 IDS ./IDS

Второй метод:

/bin/sh IDS

Когда сценарий закончит работу, все необходимые пользователи и группы будут созданы и можно будет переходить к следующий раздел.

Но что делать, если ваша система не указана в INSTALL.ids? Вы можете сделать все вручную. Начните, открыв в вашем любимом редакторе файл /etc/group. Вам необходимо добавить следующие две строки в конце файла:

qmail:*:2107: nofiles:*:2108:


Примечание: Убедитесь, что GID'ы 2107 и 2108 не используются. Если это не так, выберите два номера, которые еще не заняты.

Далее, используя vipw (большинство систем содержат эту программу, если нет, то вам понадобится снова использовать ваш редактор, но на этот раз необходимо редактировать /etc/passwd) добавьте эти строки в конец файла:

alias:*:7790:2108::/var/qmail/alias:/bin/true qmaild:*:7791:2108::/var/qmail:/bin/true qmaill:*:7792:2108::/var/qmail:/bin/true qmailp:*:7793:2108::/var/qmail:/bin/true qmailq:*:7794:2107::/var/qmail:/bin/true qmailr:*:7795:2107::/var/qmail:/bin/true qmails:*:7796:2107::/var/qmail:/bin/true


Примечание: Убедитесь, что UID'ы 7790-7796 не используются и что 2107 и 2108 имеют те же GID'ы, которые были указаны выше. Если какой-либо из этих UID'ов уже используется, выберите другие номера, которые не заняты.

Вам не нужно специально добавлять любую из этих строк в конец файла, просто это самый легкий способ объяснить.

Теперь вы готовы к переходу в следующий раздел.

2.5.5. Сборка

Теперь вы можете начать сборку qmail. Перейдите в каталог /usr/local/src/netqmail-1.05/netqmail-1.05 и давайте начнем:

cd /usr/local/src/netqmail-1.05/netqmail-1.05

В разделе Проверка среды сборки вы определили расположение Си-компилятора. Если он называется не cc или каталог его содержащий не указан в переменной окружения PATH вам необходимо отредактировать файлы conf-cc и conf-ld. Скажем, ваш компилятор gcc и путь к нему находится в PATH. Просто отредактируйте conf-cc и conf-ld и замените "cc" на "gcc".

Далее, введите следующее:

make setup check

После того как сборка будет закончена, вам необходимо выполнить постинсталляционную конфигурацию. Есть пара сценариев, которые могут сделать эту работу более простой.

Если ваш DNS сконфигурирован правильно, этот сценарий сделает все что нужно:

./config

Если, по разным причинам, config не может найти имя вашей машины в DNS, вам необходимо запустить сценарий config-fast:

./config-fast полное.имя.узла

Например, если ваш домен -- example.com и имя вашей машины -- dolphin, то строка с config-fast в вашем случае должна выглядеть так:

./config-fast dolphin.example.com


Примечание: В маленькой локальной сети вы можете захотеть использовать псевдодомен, такой как ".local". Например, если имя вашей машины "mash", вы запустите ./config-fast mash.local. Если вы сделаете так, убедитесь, что qmail настроен на использование в обратных адресах корректных доменных имен (существующих в Интернет). (См раздел 3, Настройка.)

В данный момент qmail установлен в вашей системе и готов к запуску! Следующий раздел проведет вас через стадии запуска и тестирования qmail.

2.6. Установка ucspi-tcp

Ранее вы распаковали архивы с qmail, ucspi-tcp и daemontools. Теперь перейдите в каталог ucspi-tcp:

cd /usr/local/src/ucspi-tcp-0.88

Если вы изменили conf-cc и conf-ld, как описано в разделе Сборка, вам необходимо сделать те же самые изменения в этом каталоге.

Затем выполните:

patch < /usr/local/src/netqmail-1.05/other-patches/ucspi-tcp-0.88.errno.patch make make setup check

Это все. ucspi-tcp установлен.

2.7. Установка daemontools

Перейдите в каталог сборки daemontools:

cd /package/admin/daemontools-0.76

Опять же, если вы изменили conf-cc и conf-ld во время сборки qmail и ucspi-tcp, вам необходимо сделать те же самые изменения в каталоге src.

Затем выполните:

cd src patch < /usr/local/src/netqmail-1.05/other-patches/daemontools-0.76.errno.patch cd .. package/install

В BSD-системах (без /etc/inittab) в данный момент вам необходимо перезагрузить машину, чтобы стартовал svscan, главный демон, контролирующий сервисы.

Используйте "ps -ef | grep svscan" или "ps waux | grep svscan" чтобы убедиться в том, что svscan запущен.


Примечание: В Solaris вам необходимо изменить запись в /etc/inittab, которая запускает svscan с:

SV:123456:respawn:/command/svscanboot

на:

SV:123456:respawn:/command/svscanboot </dev/null >/var/log/svscan 2>&1

или:

SV:123456:respawn:/command/svscanboot </dev/null >/dev/msglog 2>&1

в зависимости от того, куда вы хотите, чтобы сообщения об ошибках после старта svscan были в итоге направлены -- в лог-файл или системную консоль. За разъяснениями зачем это необходимо, смотрите:

http://marc.theaimsgroup.com/?l=log&m=100327801309834&w=2



Примечание: Пользователи Slackware сообщают, что запись SV /etc/inittab нужно переместить перед записью x1, иначе svscan не будет запущен при старте системы.

2.8. Запуск qmail

2.8.1. /var/qmail/rc

Каталог /var/qmail/boot содержит примеры стартового сценария qmail для различных конфигураций: /var/spool/mail vs. $HOME/Mailbox, использования procmail или dot-forward и их различных комбинаций. Не стесняйтесь исследовать их, но для нашей установки мы будем использовать следующий сценарий:

#!/bin/sh # Using stdout for logging # Using control/defaultdelivery from qmail-local to deliver messages by default exec env - PATH="/var/qmail/bin:$PATH" \ qmail-start "`cat /var/qmail/control/defaultdelivery`"


Примечание: Этот сценарий использует обратные кавычки (`), а не одинарные ('). Для достижения наилучших результатов скопируйте и вставьте сценарий из этого руководства вместо того, чтобы набирать его.

Используйте ваш редактор для создания вышеупомянутого /var/qmail/rc, затем выполните эти команды:

chmod 755 /var/qmail/rc mkdir /var/log/qmail

На этом этапе нужно решить, какой режим доставки будет использоваться для сообщений, доставка которых не была определена в .qmail-файлах. Следующая таблица демонстрирует некоторые распространенные варианты.

Формат ящика Название Расположение defaultdelivery Комментарии
mbox Mailbox $HOME ./Mailbox наиболее распространен, работает с большинством MUA
maildir Maildir $HOME ./Maildir/ более надежный, меньшая поддержка у MUA
mbox  username /var/spool/mail См. INSTALL.vsm традиционный ящик в UNIX

См. INSTALL.mbox, INSTALL.maildir и INSTALL.vsm для получения дополнительной информации.

Для того, чтобы выбрать тип почтового ящика по умолчанию, просто перенесите в файл /var/qmail/control/defaultdelivery значение defaultdelivery из таблицы. Например, чтобы выбрать стандартную qmail Mailbox-доставку, выполните:

echo ./Mailbox >/var/qmail/control/defaultdelivery


Примечание: defaultdelivery не является стандартным файлом управления (control file) для qmail. Он является особенностью вышеупомянутого файла /var/qmail/rc. Аргумент defaultdelivery для qmail-start является содержимым .qmail-файла, определяющего инструкции по доставке, которые будут использоваться когда настоящий файл .qmail не будет найден. Помещение этих инструкций в отдельный управляющие файл (control file) избавляет от необходимости заключать в кавычки метасимволы оболочки (shell metacharacters) в инструкциях по доставке и позволяет избежать неряшливых многострочных аргументов команды.

2.8.2. Системные файлы запуска (System start-up files)

2.8.2.1. Сценарий qmailctl

Если вы вручную запустите сценарий /var/qmail/rc, qmail будет запущен только частично. Однако, нам бы хотелось, чтобы qmail автоматически запускался при каждой загрузке системы и мы хотим чтобы он корректно завершался при при остановке системы.

Этого можно достигнуть путем создания сценария запуска/остановки /var/qmail/bin/qmailctl, подобно приведенному ниже:

#!/bin/sh # description: the qmail MTA PATH=/var/qmail/bin:/bin:/usr/bin:/usr/local/bin:/usr/local/sbin export PATH QMAILDUID=`id -u qmaild` NOFILESGID=`id -g qmaild` case "$1" in start) echo "Starting qmail" if svok /service/qmail-send ; then svc -u /service/qmail-send /service/qmail-send/log else echo "qmail-send supervise not running" fi if svok /service/qmail-smtpd ; then svc -u /service/qmail-smtpd /service/qmail-smtpd/log else echo "qmail-smtpd supervise not running" fi if [ -d /var/lock/subsys ]; then touch /var/lock/subsys/qmail fi ;; stop) echo "Stopping qmail..." echo " qmail-smtpd" svc -d /service/qmail-smtpd /service/qmail-smtpd/log echo " qmail-send" svc -d /service/qmail-send /service/qmail-send/log if [ -f /var/lock/subsys/qmail ]; then rm /var/lock/subsys/qmail fi ;; stat) svstat /service/qmail-send svstat /service/qmail-send/log svstat /service/qmail-smtpd svstat /service/qmail-smtpd/log qmail-qstat ;; doqueue|alrm|flush) echo "Flushing timeout table and sending ALRM signal to qmail-send." /var/qmail/bin/qmail-tcpok svc -a /service/qmail-send ;; queue) qmail-qstat qmail-qread ;; reload|hup) echo "Sending HUP signal to qmail-send." svc -h /service/qmail-send ;; pause) echo "Pausing qmail-send" svc -p /service/qmail-send echo "Pausing qmail-smtpd" svc -p /service/qmail-smtpd ;; cont) echo "Continuing qmail-send" svc -c /service/qmail-send echo "Continuing qmail-smtpd" svc -c /service/qmail-smtpd ;; restart) echo "Restarting qmail:" echo "* Stopping qmail-smtpd." svc -d /service/qmail-smtpd /service/qmail-smtpd/log echo "* Sending qmail-send SIGTERM and restarting." svc -t /service/qmail-send /service/qmail-send/log echo "* Restarting qmail-smtpd." svc -u /service/qmail-smtpd /service/qmail-smtpd/log ;; cdb) tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp chmod 644 /etc/tcp.smtp.cdb echo "Reloaded /etc/tcp.smtp." ;; help) cat <<HELP stop -- stops mail service (smtp connections refused, nothing goes out) start -- starts mail service (smtp connection accepted, mail can go out) pause -- temporarily stops mail service (connections accepted, nothing leaves) cont -- continues paused mail service stat -- displays status of mail service cdb -- rebuild the tcpserver cdb file for smtp restart -- stops and restarts smtp, sends qmail-send a TERM & restarts it doqueue -- schedules queued messages for immediate delivery reload -- sends qmail-send HUP, rereading locals and virtualdomains queue -- shows status of queue alrm -- same as doqueue flush -- same as doqueue hup -- same as reload HELP ;; *) echo "Usage: $0 {start|stop|restart|doqueue|flush|reload|stat|pause|cont|cdb|queue|help}" exit 1 ;; esac exit 0

Этот сценарий доступен по адресу http://lifewithqmail.org/qmailctl-script-dt70.

Создайте этот сценарий, используя свой любимый редактор, или загрузите, используя свой web-браузер (рекомендуется).

Сделайте сценарий qmailctl исполнимым и создайте ссылку на него в каталоге, указанном в переменной окружения PATH:

chmod 755 /var/qmail/bin/qmailctl ln -s /var/qmail/bin/qmailctl /usr/bin

2.8.2.2. Сценарии supervise

Теперь создайте supervise-каталоги для сервисов qmail:

mkdir -p /var/qmail/supervise/qmail-send/log mkdir -p /var/qmail/supervise/qmail-smtpd/log

Создайте файл /var/qmail/supervise/qmail-send/run:

#!/bin/sh exec /var/qmail/rc

Создайте файл /var/qmail/supervise/qmail-send/log/run:

#!/bin/sh exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail

Создайте файл /var/qmail/supervise/qmail-smtpd/run:

#!/bin/sh QMAILDUID=`id -u qmaild` NOFILESGID=`id -g qmaild` MAXSMTPD=`cat /var/qmail/control/concurrencyincoming` LOCAL=`head -1 /var/qmail/control/me` if [ -z "$QMAILDUID" -o -z "$NOFILESGID" -o -z "$MAXSMTPD" -o -z "$LOCAL" ]; then echo QMAILDUID, NOFILESGID, MAXSMTPD, or LOCAL is unset in echo /var/qmail/supervise/qmail-smtpd/run exit 1 fi if [ ! -f /var/qmail/control/rcpthosts ]; then echo "No /var/qmail/control/rcpthosts!" echo "Refusing to start SMTP listener because it'll create an open relay" exit 1 fi exec /usr/local/bin/softlimit -m 2000000 \ /usr/local/bin/tcpserver -v -R -l "$LOCAL" -x /etc/tcp.smtp.cdb -c "$MAXSMTPD" \ -u "$QMAILDUID" -g "$NOFILESGID" 0 smtp /var/qmail/bin/qmail-smtpd 2>&1


Примечание: concurrencyincoming не является стандартным файлом управления (control file) для qmail. Это особенность вышеупомянутого сценария. То же самое можно сказать о -1 (дефис один) в строке с LOCAL и -l (дефис эль) в параметрах tcpserver.


Примечание: В Solaris обычная программа id не будет нормально работать в этом сценарии. Вместо id используйте /usr/xpg4/bin/id, например.:

QMAILDUID=`/usr/xpg4/bin/id -u qmaild` NOFILESGID=`/usr/xpg4/bin/id -g qmaild`



Примечание: Лимит памяти, указанный в команде softlimit, возможно придется увеличить, в зависимости от вашей операционной системы и аппаратной платформы. Если попытки подключиться на 25 порт потерпят неудачу или удаленные системы не смогут отослать вам сообщения или вы увидите сообщение вроде этого:

/usr/local/bin/tcpserver: error while loading shared libraries: libc.so.6: failed to map segment from shared object: Cannot allocate memory

попробуйте увеличить его до 3000000 или 4000000.


Создайте управляющий файл concurrencyincoming:

echo 20 > /var/qmail/control/concurrencyincoming chmod 644 /var/qmail/control/concurrencyincoming

Создайте файл /var/qmail/supervise/qmail-smtpd/log/run:

#!/bin/sh exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail/smtpd

Сделайте run-файлы исполняемыми:

chmod 755 /var/qmail/supervise/qmail-send/run chmod 755 /var/qmail/supervise/qmail-send/log/run chmod 755 /var/qmail/supervise/qmail-smtpd/run chmod 755 /var/qmail/supervise/qmail-smtpd/log/run

Затем настройте каталог для журналов:

mkdir -p /var/log/qmail/smtpd chown qmaill /var/log/qmail /var/log/qmail/smtpd

Наконец, создайте в /service символические ссылки на supervise-каталоги:

ln -s /var/qmail/supervise/qmail-send /var/qmail/supervise/qmail-smtpd /service

Каталог /service был создан во время установки daemontools.


Примечание: Сервисы qmail автоматически запустятся через несколько секунд после создания символических ссылок. Если вы не хотите, чтобы они запускались, выполните:

qmailctl stop


2.8.2.3. Управление доступом к SMTP

Разрешите локальному узлу отправлять почту через SMTP:

echo '127.:allow,RELAYCLIENT=""' >>/etc/tcp.smtp qmailctl cdb

2.8.3. Остановка и отключение установленного MTA

Несмотря на возможность одновременно запустить и qmail, и уже существующий у вас MTA, (скорее всего это Sendmail), я не рекомендую это делать если вы не знаете что делаете. И, откровенно говоря, если вы читаете это, скорее всего вы не знаете что делаете. :-)

Если ваш существующий MTA -- Sendmail, вы сможете остановить его, запустив init.d-сценарий с аргументом "stop". Один из этих вариантов должен сработать:

/etc/init.d/sendmail stop /sbin/init.d/sendmail stop /etc/rc.d/init.d/sendmail stop

Если вам не удалось найти сценарий init.d/sendmail, вы можете узнать PID sendmail, используя "ps -ef|grep sendmail" или "ps waux|grep sendmail", и остановить его с помощью команды:

kill PID-of-sendmail

Если ваш MTA не Sendmail, сверьтесь с его документацией, чтобы узнать корректную процедуру выключения.

Вам следует также рассмотреть возможность полного удаления прежнего MTA из системы. По крайней мере, отключите сценарий запуска в init.d, чтобы он не пытался запуститься после перезагрузки системы.

В Red Hat Linux удаление Sendmail может быть выполнено следующим образом:

rpm -e --nodeps sendmail


Примечание: Если вы используете RPM-based дистрибутив Linux, подобный Red Hat, в процессе удаления пакета с MTA могут возникнуть проблемы. Утилиты, обновляющие систему, могут попробовать переустановить Sendmail, или MUA-пакеты могут не установиться потому что они не увидят установленного MTA. Mate Wierdl предоставляет фиктивный пакет (stub package), названный "fake_mta", который может быть установлен чтобы предотвратить эти проблемы. Просто установите пакет, доступный по адресу http://www.csi.hu/mw/fake_mta-1-1memphis.noarch.rpm.


Убедитесь в том, что никто не слушает (listening) SMTP-порт (25). Это может быть предыдущий MTA, inetd или xinetd. Следующая команды не должна ничего выводить (за исключением случая, когда запущен сервис qmail-smtpd):

netstat -a | grep smtp

Если что-то запущено, убедитесь что это не qmail с помощью команды:

qmailctl stop

Повторите проверку с помощью netstat:

netstat -a | grep smtp

Если эта команда все еще что-то выводит, вам необходимо найти виновника и отключить его перед тем как SMTP-сервис qmail будет запущен.

Наконец, замените существующий файл /usr/lib/sendmail на версию из состава qmail:

mv /usr/lib/sendmail /usr/lib/sendmail.old # игнорируйте ошибки mv /usr/sbin/sendmail /usr/sbin/sendmail.old # игнорируйте ошибки chmod 0 /usr/lib/sendmail.old /usr/sbin/sendmail.old # игнорируйте ошибки ln -s /var/qmail/bin/sendmail /usr/lib ln -s /var/qmail/bin/sendmail /usr/sbin


Примечание: Важно создать ссылки на sendmail, независимо от присутствия предыдущего MTA. Команда sendmail вызывается многими приложениями для отправки почты.

Последний шаг - создание нескольких системных псевдонимов.

2.8.4. Создание системных псевдонимов

Существуют три системных псевдонима, которые должны быть созданы при всех установках qmail:

Псевдоним Назначение
postmaster требуется RFC 2821, указывает на администратора почты (вас)
mailer-daemon стандарт de facto для получателя некоторых сообщений о недоставке
root для перенаправления почты для привилегированной учетной записи системному администратору
abuse стандарт de facto для получателя abuse-жалоб

Чтобы создать эти псевдонимы, решите, куда вы хотите чтобы указывал каждый из них (локальный пользователь или удаленный адрес), создайте и заполните соответствующие .qmail-файлы. Например, пусть локальный пользователь dave является и системным администратором, и администратором почты:

echo dave > /var/qmail/alias/.qmail-root echo dave > /var/qmail/alias/.qmail-postmaster ln -s .qmail-postmaster /var/qmail/alias/.qmail-mailer-daemon ln -s .qmail-postmaster /var/qmail/alias/.qmail-abuse chmod 644 /var/qmail/alias/.qmail-root /var/qmail/alias/.qmail-postmaster

См. INSTALL.alias чтобы узнать больше деталей.

2.8.5. Запуск qmail

Если вы остановили qmail после создания ссылок в /service, как было описано ранее, сейчас вам необходимо его запустить:

qmailctl start

2.9. Тестирование установки

qmail должен быть запущен. Прежде всего запустите qmailctl stat для того, чтобы убедиться, что сервисы стартовали и работают:

# qmailctl stat /service/qmail-send: up (pid 30303) 187 seconds /service/qmail-send/log: up (pid 30304) 187 seconds /service/qmail-smtpd: up (pid 30305) 187 seconds /service/qmail-smtpd/log: up (pid 30308) 187 seconds messages in queue: 0 messages in queue but not yet preprocessed: 0

Все четыре сервиса должны быть помечены как "up" и число секунд должно быть больше единицы. Если это не так, скорее всего присутствует опечатка в соответствующем стартовом сценарии или вы пропустили одну или более стадий при создании необходимых файлов, каталогов или ссылок. Еще раз пошагово пройдитесь по стадиям установки и дважды проверьте свои действия. Вы также можете загрузить и запустить сценарий inst_check, доступный по адресу http://lifewithqmail.org/inst_check. Например:

# sh inst_check ! /var/log/qmail has wrong owner, should be qmaill ...try: chown qmaill /var/log/qmail #

Если inst_check обнаружил проблемы, устраните их и запустите его еще раз. Когда все будет выглядеть нормально, inst_check сообщит:

Congratulations, your LWQ installation looks good!

Программа readproctitle хранит журнал сообщений об ошибках, порожденных сервисами, управляемых svscan. Чтобы увидеть эти сообщения, используйте ps или другие команды, выводящие список процессов. Например, вы можете увидеть что-то вроде этого:

# ps -efl | grep "service errors" | grep -v grep 000 S root 1006 1001 0 76 0 - 334 pipe_w Mar31 ? 00:00:00 readproctitle service errors: ...unable to start qmail-smtpd/run: exec format error #

В этом случае проблема заключается в том, что присутствует ошибка в первой строке сценария /service/qmail-smtpd/run -- скорее всего причина заключается в том, что файл создан в DOS-формате (строки заканчиваются CR-LF вместо обычного для Unix только LF).

Иногда чтобы найти проблемы с конфигурацией помогает запуск службы вручную. Например, если ваш сервис qmail-smtpd/log не запускается, выполните:

cd /service/qmail-smtpd/log svc -d . ./run если не заметно никаких ошибок, наберите строку текста и нажмите ENTER если ошибок все еще нет, нажмите CTRL-D (конец файла)

В этот момент вы должны быть в состоянии выявить проблему и устранить ее. Когда это будет сделано, если есть необходимость, вернитесь в каталог сервиса, и выполните:

svc -u .

Когда все сервисы будет работать больше одной секунды, следуйте инструкциям в TEST.deliver и TEST.receive для проверки того, что они работают корректно. Обратите внимание, что при использовании этих инструкций ведение журналов будет осуществляться посредством multilog в /var/log/qmail, а не через splogger в нечто вроде /var/log/maillog.


Примечание: Если вы выбрали формат ящика maildir в качестве метода доставки по умолчанию, вам необходимо создать каталог Maildir в вашем домашнем каталоге и домашний каталог пользователя alias перед тем как применять эти инструкции. См. раздел maildir чтобы узнать как правильно создать этот каталог.



3. Настройка

Теперь у вас есть установленный qmail, или рекомендованным способом из исходного кода, или из одного из самособирающихся пакетов (self-compiling packages), или это var-qmail пакет. Этот раздел содержит информацию, которая вам необходима для конфигурирования qmail, чтобы он работал так, как вы этого хотите.

3.1. Конфигурационные файлы

Все конфигурационные файлы qmail, за исключением .qmail-файлов в ~alias, находятся в /var/qmail/control. Man-страница qmail-control содержит таблицу, похожую на следующую:

Параметр По умолчанию Используется Назначение
badmailfrom нет qmail-smtpd черный список обратных адресов
bouncefrom MAILER-DAEMON qmail-send имя пользователя (username) отправителя в сообщениях о недоставке (bounces)
bouncehost me qmail-send имя узла (hostname) отправителя в сообщениях о недоставке
concurrencyincoming нет /service/qmail-smtpd/run максимальное число одновременных входящих SMTP-соединений
concurrencylocal 10 qmail-send максимальное число одновременных локальных доставок
concurrencyremote 20 qmail-send максимальное число одновременных удаленных доставок
defaultdelivery нет /var/qmail/rc содержимое .qmail-файлов по умолчанию
defaultdomain me qmail-inject имя домена по умолчанию
defaulthost me qmail-inject имя узла по умолчанию
databytes 0 qmail-smtpd максимально количество байт в сообщении (0=без ограничений)
doublebouncehost me qmail-send имя узла (hostname) отправителя в сообщениях о недоставке
doublebounceto postmaster qmail-send пользователь для получения двойных сообщений о недоставке (double bounces)
envnoathost me qmail-send домен по умолчанию для адресов без "@"
helohost me qmail-remote имя узла, используемое в SMTP-команде HELO
idhost me qmail-inject имя узла для поля Message-ID
localiphost me qmail-smtpd имя для замены локального IP-адреса
locals me qmail-send домены, почта для которых доставляется локально
me FQDN системы various значение по умолчанию для многих файлов настройки
morercpthosts нет qmail-smtpd дополнительная база получателей (rcpthosts database)
percenthack нет qmail-send домены, которые могут использоваться для "%"-пересылки
plusdomain me qmail-inject домен, которым заменяется знак "+" в конце адресов
qmqpservers нет qmail-qmqpc IP-адреса QMQP-серверов
queuelifetime 604800 qmail-send сколько секунд сообщение может оставаться в очереди
rcpthosts нет qmail-smtpd домены, для которых мы принимаем почту
smtpgreeting me qmail-smtpd сообщение SMTP-приветствия
smtproutes нет qmail-remote искусственные SMTP-маршруты
timeoutconnect 60 qmail-remote как долго (в секундах) ожидать SMTP-соединения
timeoutremote 1200 qmail-remote как долго (в секундах) ожидать каждого ответа удаленного сервера
timeoutsmtpd 1200 qmail-smtpd как долго (в секундах) ожидать следующей порции данных от SMTP-клиента
virtualdomains нет qmail-send виртуальные домены и пользователи

Для получения дополнительной информации по отдельным файлам настроек смотрите man-страницу модуля, указанного в столбце "Используется".

3.2. Relaying (пересылка)

3.2.1. Введение

Что такое relaying (пересылка)? Это когда MTA принимает сообщение по SMTP, которое не является ни отправленным на локальный адрес, ни от локального отправителя.

В дни предшествующие спаму, большинство MTA были сконфигурированы как open relay: неразборчивые серверы, которые принимали почту от кого угодно кому угодно.

Большинство MTA сейчас сконфигурированы либо с полностью отключенной пересылкой, либо так, чтобы только отдельные доверенные пользователи или системы могли использовать их как relay.

Chris Johnson написал отличный документ на эту тему для пользователей qmail. Я рекомендую вам посетить страницу http://www.palomine.net/qmail/relaying.html (на сайте ru.qmail.org доступен перевод на русский язык -- прим. перев.).

3.2.2. Отключение пересылки (relaying)

Если вы следовали официальным инструкциям по установке qmail, пересылка будет отключена по умолчанию. Это было сделано во время первоначального заполнения файла /var/qmail/control/rcpthosts полностью определенными доменными именами (FQDN), перечисленными в locals и virtualdomains (локальные имена). Имя файла настройки, rcpthosts, произошло от названия команды SMTP RCPT (recipient, получатель). Во время SMTP-сессии RCPT используется для определения адресов получателей письма. Таким образом, в rcpthosts перечислен список допустимых имен хостов, которые могут присутствовать в RCPT-адресах.

3.2.3. Выборочное разрешение пересылки

На большинстве серверов для малых рабочих групп можно полностью отключить пересылку, но если вы поддерживаете распределенное сообщество пользователей, вам необходимо иметь способ разрешить вашим, и только вашим пользователям использовать вашу систему как relay. Этого можно достигнуть используя tcpserver чтобы установить переменную окружения RELAYCLIENT, которая указывает qmail-smtpd не принимать во внимание файл rcpthosts.

Если вы следовали инструкциям по установке в этом документе, выборочная пересылка была включена по умолчанию. Чтобы дать клиенту доступ к пересылке, добавьте подобную запись в /etc/tcp.smtp:

IP-адрес клиента:allow,RELAYCLIENT=""

Затем перестройте базу данных прав доступа к SMTP:

qmailctl cdb

или:

tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp chmod 644 /etc/tcp.smtp*

Если вы следовали официальным инструкциям по установке, Chris Johnson написал другой замечательный документ о том, как сконфигурировать в qmail разрешение пересылки для отдельных узлов. См. http://www.palomine.net/qmail/selectiverelay.html (на сайте ru.qmail.org есть перевод на русский язык -- прим. перев.).

3.2.4. Пересылка через smart host

Для всякого, настраивающего почтовый сервер с обычным широкополосным подключением, существует неплохой шанс, что ваш IP-адрес находится в черных списках (blacklisted) организаций вроде SORBS (http://www.dnsbl.sorbs.net/lookup.shtml) в целях блокировки спама. Большинство провайдеров (ISP) предоставляют клиентам SMTP-сервер, который пересылает всю почту от их клиентов и такие сервера, как правило, не находятся в черных списках (not blacklisted). Например, провайдер Road Runner в Cincinnati, Ohio, имеет smtp-server.cinci.rr.com, доступный для клиентов. Вы можете сказать qmail направлять весь исходящий SMTP-трафик через такой сервер, выполнив:

echo ":smtp-server.cinci.rr.com" > /var/qmail/control/smtproutes

Файл smtproutes может осуществлять большее количество функций по маршрутизации, чем в этом примере; см. man-страницу qmail-remote для получения дополнительной информации.

3.3. Узлы с несколькими именами (Multiple host names)

Если ваша система известна более чем под одним именем, например, все адреса вида user@host1.example.com могут быть также записаны как user@example.com или user@mail.example.com, вам необходимо сообщить об этом qmail, чтобы он знал какие адреса он должен доставлять локально и какие сообщения он должен принимать от удаленных систем.

Чтобы сделать это, просто добавьте все имена в два конфигурационных файла:

Пошлите qmail-send сигнал HUP (hangup) чтобы он перечитал файл locals. Если у вас есть qmailctl, вы можете сделать:

qmailctl reload

3.4. Виртуальные домены

Виртуальные домены похожи на вариант узла с несколькими именами, описанный в предыдущем разделе, но существует несколько важных отличий. Прежде всего, если example.net обслуживает виртуальный домен virtual.example.com, как правило сообщение, отправленное на joe@example.net, не должно прийти в тот же ящик, что и сообщение, отправленное на joe@virtual.example.com. Пространство имен для каждого виртуального домена существует отдельно.

В qmail виртуальные домены конфигурируются в файле virtualdomains, который содержит одну или несколько записей в формате:

user@domain:prepend

qmail конвертирует user@domain в prepend-user@domain и трактует результаты так, как если бы domain был локальным. Часть user@ опциональна. Если она пропущена, запись будет соответствовать всем адресам из домена @domain .

Возвращаясь к сценарию из примера выше, если администратор почты example.net захотел создать виртуальный домен virtual.example.com под административным контролем пользователя john, в virtualdomains должна быть добавлена следующая запись:

virtual.example.com:john

Адрес получателя входящего сообщение для joe@virtual.example.com будет заменен (rewritten) на john-joe@virtual.example.com и сообщение будет доставлено локально. См. раздел .qmail и подраздел Расширенные адреса для получения дополнительной информации том как john может управлять виртуальным доменом.

Так же как и в случае узла с несколькими именами, все виртуальные домены должны быть перечислены в rcpthosts, чтобы qmail-smtpd знал о необходимости принимать письма, адресованные в эти домены. Тем не менее, в отличие от хостов с несколькими именами, виртуальные домены не должны быть добавленными в locals.

После модификации virtualdomains пошлите qmail-send сигнал HUP (hangup) чтобы сообщить ему о необходимости перечитать файл. Если у вас есть qmailctl, вы можете сделать:

qmailctl reload

Также, не забудьте добавить виртуальные домены в rcpthosts.


Примечание: MX(mail exchanger)-запись в DNS должна быть настроена на направление сообщений для виртуальных доменов соответствующему почтовому серверу. Это работа администратора сервера имен и её рассмотрение выходит за пределы настоящего руководства.

3.5. Псевдонимы (Aliases)

Стандартный механизм псевдонимов qmail является естественным продолжением механизма локальной доставки qmail. qmail-local пытается доставить сообщение, адресованное localpart@host, локальному пользователю с именем localpart . Если соответствующий пользователь не был найден, сообщение доставляется пользователю alias -- псевдопользователю на всех qmail-системах, чей домашний каталог обычно находится в /var/qmail/alias.

Например, пусть вы хотите создать псевдоним info@example.com, который перенаправляет сообщения пользователю tom. На почтовом сервере для example.com выполните как пользователь root:

echo \&tom > /var/qmail/alias/.qmail-info

Раздел .qmail и подраздел расширенные адреса описывают как создать .qmail-файлы, которые определяют какие псевдонимы существуют, и что делать с сообщениями, адресованными им.

Приложение Особенности описывает пару сложных случаев использования псевдонимов -- псевдонимы, содержащие символы верхнего регистра и точки ('.') -- также, man dot-qmail содержит полную документацию по использованию .qmail-файлов.

Обратите внимание: что обработка псевдонимов реализована в qmail таким образом, что псевдоним никогда не перенаправит (override) доставку сообщения, адресованного существующему пользователю. Например, если rachel -- обычный пользователь, псевдоним ~alias/.qmail-rachel не будет использован.

Пакет fastforward предоставляет альтернативный механизм псевдонимов, который помещает множество псевдонимов в единственный файл, совместимый с базой данных псевдонимов Sendmail.

Следующий раздел, qmail-users, описывает другой механизм, который может использоваться для внедрения псевдонимов.

3.6. qmail-users

qmail-users -- это система назначения адресов пользователям. Группа конфигурационных файлов находится в /var/qmail/users. Файл assign -- таблица назначений. Существуют два типа назначений: простой и с использованием шаблонов.


Примечание: файл assign содержит ряд назначений, по одному на строку, и заканчивается строкой, содержащей одну точку(.). Если вы создаете файл assign вручную, не забудьте про строку с точкой.

3.6.1. Простое назначение

Простое назначение выглядит примерно так:

=address:user:uid:gid:directory:dash:extension:

Это означает, что доставка сообщения, полученного для address, будет производиться от под учетной записью user, с указанными uid и gid, и файл directory/.qmaildash extension будет определять как сообщение будет доставлено.

3.6.2. Назначение с использованием шаблонов

Назначение с использованием шаблонов выглядит примерно так:

+prefix:user:uid:gid:directory:dash:prepend:

Это означает, что доставка сообщения, полученного для prefix rest, будет производиться под учетной записью user, с указанными uid и gid, и файл directory/.qmaildash prepend rest будет определять, как сообщение будет доставлено.

3.6.3. Программы qmail-user

qmail-user имеет две программы-помощника: qmail-newu и qmail-pw2u.

qmail-newu обрабатывает файл assign и генерирует файл в формате "constant database" (CDB) с названием cdb в /var/qmail/users. CDB -- это двоичный формат, чтение из которого qmail-lspawn может производить быстро, даже когда он содержит тысячи назначений (assignments).

qmail-pw2u конвертирует системную базу данных пользователей, /etc/passwd, в набор назначений, подходящих для assign. qmail-pw2u использует набор файлов для изменения правил трансляции.


Примечание: Если вы используете qmail-pw2u, не забывайте повторно запускать qmail-pw2u и qmail-newu всякий раз, когда вы добавляете, удаляете пользователей, или меняете их UID'ы или GID'ы. Типичная последовательность выглядит так:

qmail-pw2u </etc/passwd >/var/qmail/users/assign qmail-newu


3.7. Борьба со спамом

Chris Hardie написал отличное qmail Anti-Spam HOWTO. Этот документ доступен по адресу http://www.summersault.com/chris/techno/qmail/qmail-antispam.html.

3.8. Сканирование на вирусы

Jason Haar написал Qmail-Scanner, средство для сканирования содержимого сообщений для qmail. См. http://qmail-scanner.sourceforge.net/ для получения дополнительной информации.

Qmail-Scanner включает простой "policy-blocking" компонент (например, блокирует *.scr или блокирует "Subject: Yellow!"), также он напрямую поддерживает множество различных антивирусных модулей, включая ClamAV Antivirus scanner, доступный по адресу http://www.ClamAV.net. (на сайте ClamAV на странице "Third party tools" в разделе "Download" описаны другие средства антивирусной проверки для qmail -- прим. перев.)


4. Использование

Этот раздел описывает использование qmail обычными пользователями. Если вы читаете или отправляете почту в qmail-системе, то здесь вы найдете информацию о том, как это делать вместе с qmail.

4.1. Файлы .qmail

Доставка почты пользователя обычно контролируется одним или более ".qmail"-файлами (произносится как dot kyoo mail) -- файлами в домашнем каталоге пользователя с именами, начинающимися с .qmail. Man-страница dot-qmail описывает использование .qmail-файлов.

.qmail-файлы содержат список инструкций по доставке, по одной инструкции на строку. Первый символ строки определяет, какой тип доставки подразумевался:

Символ Тип доставки Значение
# нет (комментарий) игнорируется
| программа команда для запуска оболочкой
/ или . mbox (если последний символ не /) путь к mbox-ящику (включая / или .)
/ или . maildir (если последний символ /) путь к maildir-ящику (включая / или .)
& пересылка (forward) адрес для пересылки сообщения
буква или цифра пересылка (forward) адрес для пересылки сообщения (включая первый символ)

4.1.1. доставка через программу (program delivery)

Когда встречается инструкция о доставке программой, qmail запускает оболочку (/bin/sh) для выполнения команды и передает команде копию сообщения на стандартный ввод. Man-страница qmail-command описывает детали этого процесса.

Доставка через программы очень мощна ( very powerful) и может быть использована для внедрения широкого диапазона возможностей, таких как фильтрация сообщений, автоматические ответы на сообщения и доставка через сторонние агенты доставки, такие как procmail.

Пример:

|preline /usr/ucb/vacation djb

Это заставит qmail запустить preline, передать ему как аргументы /usr/ucb/vacation и djb и предоставить копию на сообщения на стандартный ввод.

4.1.2. mbox-доставка

Mbox -- стандартный формат почтового ящика в UNIX, в котором несколько сообщений хранятся в одном файле и снабжаются заголовком (headed) со строкой "From ". Эта строка выглядит как поле заголовка почтового сообщения, но это не так: это только нечто, что агент доставки добавляет к каждому сообщению, чтобы можно было определить его начало при чтении.

Пример:

./Mailbox

Эта инструкция приведет к тому, что сообщения будут добавляться к $HOME/Mailbox со строкой "From " в начале. Простейший mbox-ящик с одним сообщением выглядит примерно так:

From user1@example.net Thu May 13 18:34:50 1999 Received: (qmail 1287205 invoked from network); 13 May 1999 18:34:49 -0000 From: user1@example.net To: user2@example.com Subject: hey What's up?

Первая строку добавил при доставке qmail.

4.1.3. maildir-доставка

Maildir -- это формат ящика, созданный Dan Bernstein для устранения недостатков mbox-формата. maildir-ящик -- это каталог, содержащий три подкаталога, new, cur и tmp. Каждое сообщение в maildir-ящике находится в отдельном файле в одном из подкаталогов, в зависимости от их статуса: new для непрочитанный сообщений, cur -- для сообщений, которые были просмотрены и tmp для сообщений, которые находятся в процессе доставки. Man-страница maildir детально описывает maildir-формат.

Одно из преимуществ maildir-формата заключается в том, что хотя он и не использует блокировки (locking) для предотвращения одновременных обновлений (simultaneous updates) несколькими агентами доставки, надежность от этого не страдает. Это означает что maildir-ящики можно безопасно использовать на файловых системах, смонтированных через NFS.

Пример:

./Maildir/

Эта инструкция приведет к тому, что сообщения будут сохранены в $HOME/Maildir, ящике в maildir-формате.


Примечание: qmail-local может доставлять почту в maildir-ящики, но не может создавать их. Maildir-ящики можно создавать с помощью программы maildirmake, которая идет в составе qmail. Пример: "maildirmake ~/Maildir". Не забудьте, что maildirmake необходимо запускать как владелец maildir, а не как root. Ваша команда useradd или adduser может поддерживать "скелетный" ("skeleton") каталог, например, /etc/skel, где вы можете создать maildir, который будет скопирован в домашние каталоги всех новых пользователей.

4.1.4. forward-доставка (пересылка)

Forward-доставка пересылает сообщение на указанный адрес. Адреса, указанные в .qmail-файлах не могут содержать комментарии или дополнительные пробелы.

Так не правильно:

&<user@example.com> & user@example.com &Joe User <user@example.com>

Так правильно:

&user@example.com user@example.com &user

Первые две строки приведут к тому, что user@example.com получит копию сообщения. Последняя пошлет копию локальному пользователю user.

4.1.5. расширенные адреса (extension addresses)

qmail поддерживает управляемые пользователем расширенные адреса (extension addresses). В дополнение к основному адресу, username@hostname.domain , пользователь может получать почту на адрес username-extension@hostname.domain . В оставшейся части этого раздела я не буду использовать часть "@hostname.domain", т.к. мы разбираем действия, которые происходят в локальной системе.

Инструкции по доставке для username находятся в ~username/.qmail и инструкции по доставке для username-extension в ~username/.qmail-extension .

Например, dave-lwq@sparge.example.com контролируется файлом ~dave/.qmail-lwq на узле sparge.

Расширение может иметь несколько полей, например, dave-list-qmail, контролируется файлом ~dave/.qmail-list-qmail. В этом примере, dave-list-qmail подписан на список рассылки по qmail, и ~dave/.qmail-list-qmail складывает сообщения списка рассылки в отдельный почтовый ящик.

.qmail-файлы могут быть (объединены) wildcarded с помощью -default. Так, dave-list-qmail может также обрабатываться файлом ~dave/.qmail-list-default. Это позволяет одним улавливающим (catch-all) .qmail-файлом обработать все адреса вида dave-list-что_угодно . Обратите внимание, что dave-list не будет обработан файлом ~dave/.qmail-list-default, поскольку он не содержит "-" после "list".

qmail использует ближайшее совпадение, которое он находит. Например, когда сообщение приходит на адрес dave-list-qmail, он будет использовать первый найденный элемент из нижеприведенных:

.qmail-list-qmail .qmail-list-default .qmail-default

Если подходящего .qmail-файла не будет найдено, доставка терпит неудачу и сообщение отсылается отправителю обратно.

4.2. Отправка сообщений

Пользователи почты обычно не используют MTA напрямую для отсылки сообщений. Как правило, сообщение составляется и отсылается используя Mail User Agent (MUA), такой как pine или mutt, который вызывает MTA для доставки сообщения. Процесс передачи (handing) сообщения MTA называется инъекция (injection).

В большинстве MTA существуют два пути инъекции сообщения: через Simple Mail Transfer Protocol, SMTP, или с использованием программы, предоставляемой MTA для этих целей.

4.2.1. SMTP

MUA могут установить TCP-соединение на 25 порт (стандартный порт SMTP) к локальному узлу или определенному почтовому серверу. Затем MUA и MTA участвуют в диалоге, в результате которого:

SMTP не имеет механизма для аутентификации, поэтому ни имя пользователя, ни пароль не требуется для того, чтобы отослать сообщение. Таем не менее, многие MTA отказываются принять сообщения, которые не являются сообщениями или от или для локального пользователя. Если правильно отформатированное сообщение отвергается, то наиболее вероятная причина -- ограничения на пересылку (relaying restrictions). См. раздел Relaying для получения дополнительной информации о настройке пересылки.

4.2.2. /var/qmail/bin/sendmail

В течении многих лет Sendmail был синонимом MTA в UNIX. Он был настолько вездесущ, что многие программисты просто предполагали, что только он является MTA. Как результат, механизм локальной инъекции Sendmail стал стандартным Application Programmer's Interface (API) для локальной инъекции почты. qmail и другие не-Sendmail MTA предусматривают программу sendmail, которая работает так же, как реальная программа sendmail из состава Sendmail.

sendmail из состава qmail, которая обычно расположена по адресу /var/qmail/bin/sendmail, в большинстве случаев заменяет sendmail из состава Sendmail в qmail-системах. Обычно программа sendmail расположена в следующих местах:

В qmail-системах команда "ls -l путь-к-sendmail " должна показать, что sendmail -- это символическая ссылка на /var/qmail/bin/sendmail:

$ ls -l /usr/lib/sendmail lrwxrwxrwx 1 root root 29 Feb 19 11:04 /usr/lib/sendmail -> /var/qmail/bin/sendmail

4.2.3. qmail-inject

В дополнение к эмуляции API sendmail, qmail также имеет свою программу для инъекций: qmail-inject. Фактически, sendmail -- просто обертка (wrapper) вокруг qmail-inject.

Как API, sendmail вероятно лучше, потому что он более широко распространен. API qmail, обеспечиваемый qmail-inject, будет работать только на системах с qmail, а sendmail-интерфейс почти универсален.

Например, чтобы отправить пустое сообщение на адрес joe@example.com:

echo To: joe@example.com | /var/qmail/bin/qmail-inject

4.3. Переменные окружения

Некоторые qmail-программы устанавливают или используют переменные окружения. В следующей таблице перечислены эти переменные и описано их использование.

Название Man-страница Устанавливает или использует Назначение
DATABYTES qmail-smtpd использует Переопределяет control/databytes
DEFAULT qmail-command устанавливает Часть адреса, соответствующая "-default" в имени .qmail-файла.
DTLINE qmail-command устанавливает Поле Delivered-To в заголовках
EXT qmail-command устанавливает Расширение адреса (address extension)
EXT2 qmail-command устанавливает Часть EXT, следующая за дефисом
EXT3 qmail-command устанавливает Часть EXT, следующая за вторым дефисом
EXT4 qmail-command устанавливает Часть EXT, следующая за третьим дефисом
HOME qmail-command устанавливает Домашний каталог пользователя
HOST qmail-command устанавливает доменная часть адреса получателя
HOST2 qmail-command устанавливает Часть HOST, предшествующая последней точке
HOST3 qmail-command устанавливает Часть HOST, предшествующей второй с конца точке
HOST4 qmail-command устанавливает Часть HOST, предшествующей третьей с конца точке
LOCAL qmail-command устанавливает Локальная часть адреса получателя
LOGNAME qmail-inject использует Имя пользователя в поле From в заголовках (4)
MAILHOST qmail-inject использует Имя узла в поле From в заголовках (2)
MAILNAME qmail-inject использует Личное имя в поле From в заголовках (2)
MAILUSER qmail-inject использует Имя пользователя в поле From в заголовках (2)
NAME qmail-inject использует Личное имя в поле From в заголовках (3)
NEWSENDER qmail-command устанавливает Адрес отправителя при пересылке (см. "man dot-qmail")
QMAILDEFAULTDOMAIN qmail-inject использует Переопределяет control/defaultdomain
QMAILDEFAULTHOST qmail-inject использует Переопределяет control/defaulthost
QMAILHOST qmail-inject использует Имя узла в поле From в заголовках (1)
QMAILIDHOST qmail-inject использует Переопределяет control/idhost
QMAILINJECT qmail-inject использует Определяет различные параметры (см. следующую таблицу)
QMAILMFTFILE qmail-inject использует Файл, содержащий перечень адресов списка рассылки для генерации Mail-Followup-To
QMAILNAME qmail-inject использует Личное имя в поле From в заголовках (1)
QMAILPLUSDOMAIN qmail-inject использует Переопределяет control/plusdomain
QMAILSHOST qmail-inject использует Имя узла в адресе отправителя (envelope sender address)
QMAILSUSER qmail-inject использует Имя пользователя в адресе отправителя (envelope sender address)
QMAILUSER qmail-inject использует Имя пользователя в поле From в заголовках (1)
RECIPIENT qmail-command устанавливает Адрес получателя (envelope recipient address)
RELAYCLIENT qmail-smtpd использует Игнорировать control/rcpthosts и добавить значение в конец адреса получателя
RPLINE qmail-command устанавливает Поле Return-Path в заголовках
SENDER qmail-command устанавливает Адрес отправителя (envelope sender address)
UFLINE qmail-command устанавливает Строка "From " в UUCP-стиле
USER qmail-command устанавливает Текущий пользователь
USER qmail-inject использует Имя пользователя в поле From в заголовках (3)
QMAILINJECT Flags
Буква Назначение
c Использовать стиль адрес-комментарий для поля From
s Не просматривать поле Return-Path в полученном сообщении
f Удалять поле From в полученном сообщении
i Удалить поле Message-ID в полученном сообщении
r Использовать VERP для каждого получателя отдельно
m Использовать VERP для всего сообщения

5. Расширенные темы

5.1. procmail

procmail является популярным агентом доставки сообщений (Message Delivery Agent, MDA). Функция MDA заключается в получении сообщения от MTA для определенного пользователя или ящика и доставке сообщения в соответствии с пожеланиями пользователя. procmail может быть использован для "фильтрации" сообщений по содержимому различных полей заголовков или телу (body) сообщения. Например, сообщения от определенного человека могут быть направленны в ящик, созданный для получения писем только от него.

Существует пара ухищрений для запуска procmail с qmail. Во-первых, procmail обычно собран для доставки в mbox-ящик, расположенный в /var/spool/mail. Вы можете пересобрать procmail чтобы доставка по умолчанию осуществлялась в $HOME, или вы можете проинструктировать пользователей не полагаться на procmail в плане определения расположения ящика по умолчанию. Если вы не пропатчите его для доставки в $HOME, procmail все еще будет использовать /var/spool/mail для временных файлов.

Другая проблема заключается в том, что qmail-command и procmail не имеют общего мнения о том, какие коды выхода что означают. procmail использует стандартные коды выхода UNIX: ноль означает успешное завершение, ненулевой код означает неудачное завершение и причина сбоя обозначена в /usr/include/sys/errno.h. qmail-command использует некоторые ненулевые коды для обозначения постоянных ошибок и остальные рассматриваются как временные. Небольшая "обертка" (wrapper), написанная на языке командной оболочки, может быть использована для перевода кодов выхода для qmail-command. Такой сценарий был отправлен в список рассылки qmail и он доступен в архивах по адресу http://www.ornl.gov/lists/mailing-lists/qmail/1998/04/msg00487.html.

Также, более старые версии procmail (до 3.14) не доставляют почту непосредственно в ящики в maildir-формате. Лучший выход -- обновить procmail до текущей версии. Другой подход -- использование safecat, программы, которая записывает сообщение из стандартного вывода в указанный maildir-ящик. Пользователи могут написать procmail-рецепты (инструкции по доставке), которые используют safecat для обработки сообщений. Также, вы можете полностью игнорировать procmail и использовать maildrop .

В конце концов, procmail ожидает, что сообщения, полученные им, будут в mbox-формате. Обычная программа доставок в qmail включает только реальное сообщение, не включая строку "From ". Команда preline может быть использована для конвертации сообщения в формат, ожидаемый procmail. "Обертка" (wrapper), ссылка на которую была дана выше, включает preline.

Например, пусть пользователь "dave" хочет, чтобы его почта была обработана procmail. Его системный администратор собрал procmail с доставкой в $HOME по умолчанию, и он предоставил "обертку"(wrapper), ссылка на которую была дана выше, для корректной обработки кодов выхода под названием /usr/local/bin/qmail-procmail. Его .qmail-файл должен выглядеть примерно так:

|/usr/local/bin/qmail-procmail

5.2. POP и IMAP серверы

qmail включает POP-сервер, qmail-pop3d, но он не не сконфигурирован и не установлен во время процесса установки qmail. Также, вы можете использовать один из других доступных POP или IMAP-серверов, несмотря на то что большинство из них были написаны для Sendmail и требуют некоторой дополнительной работы для использования с qmail.

5.2.1. qmail-pop3d

qmail-pop3d -- это POP-сервер, включенный в состав qmail. Это превосходный POP-сервер, и многие qmail-сайты его используют. Он модульный и поддерживает множественные схемы аутентификации через альтернативные модули аутентификации.


Примечание: qmail-pop3d поддерживает только ящики в maildir-формате, поэтому, если у вас есть пользователи, которые заходят на POP-сервер и запускают различные MUA локально, они (MUA) все должны поддерживать maildir-формат. Если все ваши пользователи читают почту через POP, формат ящиков на сервере не является проблемой.

5.2.1.1. Архитектура qmail-pop3d

Сервер qmail-pop3d состоит из трех модулей:

Обычно qmail-popup запускается с помощью inetd или tcpserver, прослушивающих 110 (POP3) порт. Когда соединение установлено, он запрашивает имя пользователя и пароль. Затем он вызывает checkpassword, который проверяет имя пользователя и пароль, и, если они совпадают, в свою очередь вызывает qmail-pop3d.

5.2.1.2. Установка qmail-pop3d

1. Полностью установите и протестируйте qmail. Если вы хотите, чтобы все пользователи имели ящики, доступные через POP3, убедитесь, что параметр defaultdelivery настроен равным ./Maildir/. Если вы устанавливали сценарий /var/qmail/rc из раздела "Установка", этот параметр сконфигурирован в control/defaultdelivery. Если нет, скорее всего он находится в /var/qmail/rc, в строке запуска qmail-start.

2. Загрузите программу checkpassword с http://www.qmail.org/top.html#checkpassword. Стандартный checkpassword, http://cr.yp.to/checkpwd.html, будет хорошим выбором, если вам не нужно что-то необычное.

3. Скомпилируйте и установите checkpassword согласно инструкциям. Убедитесь, что устанавливаете его как /bin/checkpassword.


Примечание: Если вы устанавливаете стандартный checkpassword, не забудьте применить errno-патч после распаковки исходного кода:

patch < /usr/local/src/netqmail-1.05/other-patches/checkpassword-0.90.errno.patch


4. mkdir /var/qmail/supervise/qmail-pop3d

5. Создайте сценарий /var/qmail/supervise/qmail-pop3d/run, содержащий:

#!/bin/sh exec /usr/local/bin/softlimit -m 2000000 \ /usr/local/bin/tcpserver -v -R -H -l 0 0 110 /var/qmail/bin/qmail-popup \ FQDN /bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir 2>&1

где FQDN -- полностью определенное доменное имя (fully qualified domain name) POP-сервера, который вы настраиваете, например, pop.example.net.


Примечание: Лимит памяти, указанный в команде softlimit, возможно придется увеличить, в зависимости от вашей операционной системы и аппаратной платформы. Если попытки подключиться на 110 порт потерпят неудачу или POP3-соединения странным образом будут сбоить или вы увидите сообщение вроде этого:

/usr/local/bin/tcpserver: error while loading shared libraries: libc.so.6: failed to map segment from shared object: Cannot allocate memory

попробуйте увеличить его до 3000000 или 5000000.


6. mkdir /var/qmail/supervise/qmail-pop3d/log

7. Создайте сценарий /var/qmail/supervise/qmail-pop3d/log/run, содержащий:

#!/bin/sh exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t \ /var/log/qmail/pop3d

8. Настройте каталог для журналов и права на сценарий run, затем создайте ссылку на сервис в /service:

chmod +t /var/qmail/supervise/qmail-pop3d # если daemontools < 0.75 mkdir /var/log/qmail/pop3d chown qmaill /var/log/qmail/pop3d chmod 755 /var/qmail/supervise/qmail-pop3d/run chmod 755 /var/qmail/supervise/qmail-pop3d/log/run ln -s /var/qmail/supervise/qmail-pop3d /service

9. Добавьте следующее в раздел "start" qmailctl :

if svok /service/qmail-pop3d ; then svc -u /service/qmail-pop3d /service/qmail-pop3d/log else echo qmail-pop3d supervise not running fi

10. Добавьте следующее в раздел "stop" qmailctl:

echo " qmail-pop3d" svc -d /service/qmail-pop3d /service/qmail-pop3d/log

11. Добавьте следующее в раздел "stat" qmailctl :

svstat /service/qmail-pop3d svstat /service/qmail-pop3d/log

12. Добавьте следующее в раздел "pause" qmailctl :

echo "Pausing qmail-pop3d" svc -p /service/qmail-pop3d

13. Добавьте следующее в раздел "cont" qmailctl :

echo "Continuing qmail-pop3d" svc -c /service/qmail-pop3d

14. Добавьте следующее в раздел "restart" qmailctl :

echo "* Restarting qmail-pop3d." svc -t /service/qmail-pop3d /service/qmail-pop3d/log

5.2.2. Qpopper

Если вам нужен POP-демон, который работает с ящиками в mbox-формате, вы можете использовать Qpopper от Qualcomm. Qpopper доступен по адресу http://www.eudora.com/products/unsupported/qpopper/.

5.2.3. Binc IMAP

Andreas Hanssen написал сервер Binc IMAP. Binc IMAP разработан для использования того же механизма аутентификации (checkpassword), который использует qmail-pop3d, так что он хорошо подходит для qmail-серверов. Подобно qmail-pop3d, он поддерживает только Maildir-ящики. См.: http://www.bincimap.org/.

5.2.4. Dovecot

Timo Sirainen написал Dovecot, IMAP и POP-сервер, который поддерживает и mbox и maildir-ящики. Он был спроектирован чтобы быть безопасным. Проект доступен по адресу http://dovecot.procontrol.fi/ (в настоящее время -- http://www.dovecot.org/, прим. перев.).

5.2.5. imap-maildir

David R. Harris доработал патч, который добавляет поддержку maildir к University of Washington IMAP серверу и задокументировал процесс установки. См. http://www.davideous.com/imap-maildir/.

5.2.6. Courier-IMAP

Sam Varshavchik написал IMAP-сервер, который поддерживает только maildir-ящики. Он доступен по адресу http://www.courier-mta.org/imap/.

5.2.7. Cyrus

Carnegi Mellon University's Project Cyrus включает IMAP-сервер. Он доступен по адресу http://asg.web.cmu.edu/cyrus/imapd/. Rick Updegrove написал оболочку (wrapper) qmail2cyrus для доставки сообщений в хранилище почты Cyrus. Эта оболочка доступна по адресу http://msgs.securepoint.com/cgi-bin/get/qmail0308/41/1/1.html.

5.3. POP и IMAP клиенты

5.3.1. fetchmail

fetchmail -- это программа, которая забирает почту с POP или IMAP-сервера и отдает её для доставки локальному MTA (re-injects it locally). fetchmail не имеет проблем с получением почты от qmail-серверов, но существует пара хитростей для того, чтобы сделать он работал хорошо на клиенте qmail.

Ниже приведен пример .fetchmailrc для пользователя в qmail-системе:

poll mail.example.net proto pop3 nodns user dsill with password flubgart is dave here fetchall forcecr

Эти директивы сообщают fetchmail, что нужно установить соединение с mail.example.net по POP3, войти как пользователь dsill с паролем flubgart, получить все сообщения и доставить их на адрес dave@localhost. Директива forcecr сообщает fetchmail, что во время отдачи сообщения в локальную систему через SMTP необходимо заканчивать каждую строку переводом каретки (carriage return) . qmail требует этого.

5.3.2. getmail

getmail -- это программа, которая забирает почту с POP-сервера и доставляет её в maildir-ящик. Фактически, это сценарий, написанный на Python, поэтому вам нужно установить интерпретатор Python'а перед тем, как использовать getmail

getmail написан Charles Cazabon, который сопровождает web-страницу для него по адресу http://pyropus.ca/software/getmail/.

5.4. Мульти-RCPT против доставки с единственным получателем

Представим, что вы -- MTA и один из ваших пользователей отсылает сообщение трем пользователям на hostx.example.com. Существует несколько путей как это можно сделать.

  1. Вы можете установить SMTP-соединение с hostx, отослать копию сообщения первому пользователю, отослать копию второму пользователю, отослать копию третьему пользователю, затем закрыть соединение.
  2. Вы можете запустить три процесса, каждый из них установит SMTP-соединение с hostx, отошлет копию сообщения одному пользователю, затем закроет соединение.
  3. Вы можете установить SMTP-соединение с узлом, отослать копию сообщения, адресованную всем трем пользователям, затем закрыть соединение.

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

Забудьте про этот способ.

Второй и третий метод немного более интересны.

Третий метод устанавливает только одно соединение с hostx, и отсылает только одну копию сообщения. Это делается для эффективного использования пропускной способности.

Второй метод использует множественные соединения и отсылает несколько копий сообщения. Это "растрачивает" (wastes) пропускную способность, но в силу природы протокола SMTP требует меньших задержек подтверждения и быстрее чем третий метод. Он также проще чем третий метод, поэтому MTA может быть написан в более простом (straightforward) стиле. И наконец, поскольку каждый адресат получает свою копию сообщения, в MTA появляется возможность применять VERP (см. следующий раздел).

qmail всегда использует второй метод (один RCPT). Не существует патчей для внедрения третьего метода (множественные RCPT) -- это требует большой работы.

Несмотря на то что существуют патологические случаи, где этот подход может быть медленней чем подход со множественными RCPT, в целом преимущества VERP и простота перевешивают.

Доставка с одним RCPT использует большую пропускную способность, чем доставка со множественными RCPT, но разница зачастую преувеличена. Большинство сообщений имеют самое большее пару получателей, и они находятся обычно на разных узлах, поэтому multi-RCPT доставка ничего не выигрывает. Даже на сервере списков рассылки, где multi-RCPT доставка может помочь, потенциальная выгода небольшая, потому что SMTP использует только часть полосы пропускания большинства подключений -- HTTP обычно получает львиную долю.

Например, если 10% пропускной способности вашего канала занята SMTP и потребляемая ширина для SMTP могла бы быть уменьшена, скажем, на 25% использованием multi-RCPT доставки, в итоге это снизит пропускную способность, потребляемую SMTP, до 7.5%.

5.5. VERP

Когда сообщение невозможно доставить, предполагается что MTA вернет сообщение о недоставке (bounce message) отправителю, указанному во время SMTP-сессии (envelope return path, ERP). Сообщение о недоставке должно включать адрес получателя, причину, по которой сообщение не может быть доставлено и информации о том, постоянная ли проблема или временная. Однако, некоторые MTA не делают все правильно. Они могут отослать сообщение о недоставке по адресу, указанному в заголовках в поле From, или в сообщении не будет указан получатель.

Для большинства сообщений пользователь-пользователь эти проблемы не слишком критичны. Обычно можно разобраться на основании времени получения сообщения о недоставке или его содержимому. Для списков рассылки проблема плохих сообщений о недоставке более серьезна. Подписчики меняют адреса, перенаправляя почту на свой новый адрес. Если с доставкой на новый адрес начинаются проблемы, бывает невозможно определить, сообщения для какого подписчика были отвергнуты, если сообщение о недоставке включает только новый адрес.

Dan Bernstein разработал решение этой проблемы под названием VERP (Variable Envelope Return Path). При использовании VERP любое сообщение, отсылаемое каждому подписчику листа рассылки, имеет уникальный обратный путь. Это позволяет механизму обработки сообщений о недоставке идентифицировать подписчика, с которым возникла проблема.

Например, типичный список рассылки без поддержки VERP имеет обратный адрес в виде listname-owner@domain (имя_списка_рассылки-владелец@домен). В списках рассылки с поддержкой VERP обратный адрес будет выглядеть как listname-owner- subscriber=sdomain @ldomain (имя_списка_рассылки-владелец-подписчик=домен_подписчика@домен_списка_рассылки), где адрес подписчика, subscriber@sdomain , помещен между "owner" и "@". (Символ "@" в адресе подписчика заменен на "=".)

Менеджер списков рассылки ezmlm использует VERP для автоматической обработки сообщений о недоставке. Он даже обеспечивает подписчиков с временными проблемами доставки списком неполученных ими сообщений, чтобы они могли получить их из архива.

Russell Nelson написал менеджер сообщений о недоставке для Majordomo, работающего с qmail,но уже не поддерживает его. Он доступен по адресу http://www.qmail.org/bounceman-0.4.shar.

5.6. Решение проблем

5.6.1. Процессы

Законеченная, правильно запущенная, но минимальная установка qmail должна всегда иметь следующие четыре процесса:

В зависимости от разновидности вашего UNIX, одна из следующих двух команд должна показать эти процессы и, возможно, немного больше:

ps -ef | grep qmail ps waux | grep qmail

Например:

[dave@sparge dave]$ ps waux|grep qmail dave 2222 0.0 0.8 836 348 p4 S 10:25 0:00 grep qmail qmaild 351 0.0 1.0 840 400 ? S N 12:43 0:00 /usr/local/bin/tcpserver -v -x /etc/tcp.smtp.cdb -u 49491 -g 31314 0 smtp /var/qmail/bin/qmail-smtpd- qmaild 2220 0.0 1.0 844 420 ? S N 10:25 0:00 /usr/local/bin/tcpserver -v -x /etc/tcp.smtp.cdb -u 49491 -g 31314 0 smtp /var/qmail/bin/qmail-smtpd- qmaill 365 0.0 0.8 748 344 ? S N 12:43 0:00 splogger qmail qmailq 368 0.0 0.7 736 292 ? S N 12:43 0:00 qmail-clean qmailr 367 0.0 0.6 732 272 ? S N 12:43 0:00 qmail-rspawn qmails 350 0.0 0.8 776 336 ? S N 12:43 0:00 qmail-send root 340 0.0 0.6 724 252 ? S N 12:43 0:00 /usr/local/sbin/supervise /var/supervise/qmail-send /var/qmail/rc root 341 0.0 0.6 724 252 ? S N 12:43 0:00 /usr/local/sbin/supervise /var/supervise/tcpserver-qmail /usr/local/bin/tcpserver -v -x /etc/tcp.smtp root 366 0.0 0.7 736 276 ? S N 12:43 0:00 qmail-lspawn ./Mailbox [dave@sparge dave]$

Если вы запускаете qmail или qmail-smtpd под supervise, как в примере выше, вы также должны должны увидеть эти процессы(supervise). И если вы запустили qmail-smtpd под tcpserver, вы должны увидеть родительский процесс tcpserver плюс дополнительный процесс tcpserver для каждого активного входящего SMTP-соединения.

Если вы используете splogger (или multilog или cyclog) для журналирования, у вас должны быть один или два процесса splogger (или multilog или cyclog), работающего с правами пользователя qmaill.

Также, если qmail занят локальной или удаленной доставкой сообщений, вы увидите до concurrencylocal процессов qmail-local и до concurrencyremote процессов qmail-remote.

5.6.2. Журналы (Logs)

5.6.2.1. multilog

multilog, который является частью пакета daemontools , журналирует сообщения в набор файлов в определенном каталоге.

Каталог для журналов определяется в строке запуска multilog, которую вы можете найти, просмотрев свои сценарии запуска qmail.

Количество файлов в каталоге журналов и максимальный размер каждого файла определяются параметрами multilog. Имена лог-файлов представляют из себя временные метки в формате TAI (Temps Atomique International) момента времени, в который файл был создан (file was started). Команда tai64nlocal, также из состава daemontools, конвертирует метки времени в формате TAI в локальный, удобочитаемый вид.

Типичная запись в журнале multilog выглядит примерно так:

@4000000038c3eeb104a6ecf4 delivery 153: success: did_1+0+0/

"@4000000038c3eeb104a6ecf4" -- опциональная, но рекомендуемая метка времени в TAI-формате. "delivery 153: success: did_1+0+0/" -- само сообщение.

5.6.2.2. splogger

splogger использует систему журналирования syslog для расстановки меток времени в сообщениях и посылает из syslog-демону. Syslog конфигурируется в /etc/syslog.conf. Сообщения, посылаемые в syslog, имеют facility (тип программы) и priority (приоритет, уровень). Правила в /etc/syslog.conf отфильтровывают сообщения по facility и priority для направления их в требуемый лог-файл, удаленный узел для журналирования или консоль. splogger по умолчанию журналирует сообщения с facility mail, таким образом, применив команду grep для syslog.conf с параметром "mail", можно узнать расположение лог-файла qmail.

Обычные места расположения включают:

Типичная запись в журнале syslog выглядит примерно так:

Jun 3 11:35:23 sparge qmail: 928424123.963558 delivery 153: success: did_1+0+0/

"Jun 3 11:35:23" -- метка времени syslog.

"sparge" -- имя системы, которая послала сообщение.

"qmail:" -- метка, которую splogger помещает во все журнальные записи qmail.

"928424123.963558" -- опциональная метка времени в формате TAI (см. следующий раздел).

"delivery 153: success: did_1+0+0/" -- само сообщение.

5.6.2.3. Журнальные сообщения (Log messages)

Вот типичная последовательность записей в журнале при отправке сообщения на удаленную систему с локальной системы:

1 @4000000038c3eeb027f41c7c new msg 93869 2 @4000000038c3eeb027f6b0a4 info msg 93869: bytes 2343 from <dave@sill.org> qp 18695 uid 49491 3 @4000000038c3eeb02877ee94 starting delivery 2392: msg 93869 to remote lwq@w3.to 4 @4000000038c3eeb0287b55ac status: local 0/10 remote 1/20 5 @4000000038c3eeb104a13804 delivery 2392: success: 209.85.127.177_accepted_message. /Remote_host_said:_250_CAA01516_Message_accepted_for_delivery/ 6 @4000000038c3eeb104a4492c status: local 0/10 remote 0/20 7 @4000000038c3eeb104a6ecf4 end msg 93869

Строка 1 указывает на то что qmail получил новое сообщение и его ID в очереди (идентификатор) равен 93869. Идентификатор в очереди (queue ID) -- это i-node номер файла в /var/qmail/queue/mess/NN/ -- файла в очереди, который содержит сообщение. Идентификатор гарантированно будет уникальным, пока сообщение остается в очереди.

Строка 2 сообщает что сообщение от dave@sill.org и его размер 2343 байт.

Строка 3 сообщает, что qmail-remote начал доставку сообщения для lwq@w3.to и этому сообщению назначен идентификатор отправки равный 2392.

Строка 4 сообщает, что незакончены 0 локальных и 1 удаленная доставка.

Строка 5 сообщает, что доставка 2392 завершена и завершена успешно, также эта строка содержит ответ удаленного сервера, который часто содержит информацию, полезную администратору удаленной системы для отслеживания доставки сообщения. В этом случае "CAA01516" является идентификатором доставки на удаленной системе.

Строка 6 сообщает, что незакончены 0 локальных и о удаленных доставок, т.е. доставка закончена.

Строка 7 сообщает что сообщение было полностью доставлено и удалено из очереди. На данный момент идентификатор в очереди (queue ID) равный 93869 может быть использован для другой доставки.

5.7. Большие сервера

См. также qmail-ldap .

5.7.1. Масштабируемый параллелизм

Используйте быстрый NFS-сервер для хранения каталогов пользователей. Настройте несколько SMTP-серверов с одинаковым приоритетом для доставки почты в maildir-ящики на файловом сервере.

5.8. Миграция с Sendmail на qmail

Посмотрите страницу Sendmail->qmail Dan Bernstein по адресу http://cr.yp.to/qmail/sendmail.html.

5.9. Менеджеры списков рассылок

Менеджеры списков рассылки (Mailing list managers, MLM) -- системы, которые помогают владельцам списков рассылок управлять рассылкой. Их обязанности разделяются на две основные части: управлять списком подписчиков и контролировать повторную отсылку сообщений подписчикам.

Большинство (все?) менеджеров списков рассылки под UNIX могут работать с qmail.

5.9.1. ezmlm

ezmlm был написан Dan Bernstein, автором qmail. Он был написан для использования с qmail и полагается на некоторые особенности qmail. В частности, он использует VERP чтобы надежно обрабатывать сообщения о недоставке. ezmlm отчасти уникален среди других MLM тем, что он не обрабатывает команды, отправленные на основной адрес рассылки: он добавляет команду в конец имени списка рассылки. Например, чтобы подписаться на список рассылки "foo@list.example.net" необходимо послать письмо на адрес "foo-subscribe@list.example.net".

Для получения большей информации о ezmlm смотрите http://www.ezmlm.org/, неофициальный сайт для ezmlm и официальный сайт для ezmlm-idx, очень хорошего дополнения (add-on), которое включает много удобных возможностей.

5.9.2. Majordomo

Majordomo -- один из самых популярных MLM для UNIX. Он хорошо работает с qmail после внесения нескольких простых изменений. Russ Allbery написал FAQ о qmail/Majordomo, доступный по адресу http://web.archive.org/web/20050308091420/http://www.eyrie.org/~eagle/faqs/mjqmail.html.

5.10. Патчи

Для исходного кода qmail доступны различные патчи. Для установки патча загрузите его, перейдите в дерево исходных кодов qmail и примените его, используя команду patch.

cd /usr/local/src/qmail/qmail-1.03 patch -p0 </tmp/patchfile


Примечание: Для получения большей информации смотрите man-страницу patch. Это просто пример. Также, вам возможно будет необходимо использовать текущую версию GNU patch для успешного применения некоторых патчей. См. http:// www.gnu.org/software/patch/patch.html.


Остановите qmail убив процесс qmail-send или, если вы установили сценарий qmailctl из раздела Установка, выполните:

qmailctl stop

Затем пересоберите и установите новые исполняемый файлы:

make setup check

Затем перезапустите qmail:

qmailctl start

Наконец, протестируйте qmail -- особенно ту часть, на которую вы накладывали патч.


Примечание: Несмотря на то, что на http://www.qmail.org/ перечислено множество патчей для qmail, ни один из них не был одобрен автором qmail. Они могут привнести проблемы с безопасностью, надежностью, эффективностью или функциональностью, которых не существует в оригинальном qmail. Большинство установок qmail требуют только некоторых рекомендованных патчей. Вы не должны устанавливать любые патчи, если в них нет необходимости.


5.10.1. Рекомендованные патчи

На qmail.org есть раздел "Recommended Patches (рекомендованные патчи)": http://qmail.org/top.html#patches. Эти патчи предназначены для исправления нескольких известных ошибок в qmail.


Примечание: все рекомендованные патчи включены в дистрибутив netqmail. См. http://www.qmail.org/netqmail/.

5.10.1.1. errno.h-патч

Этот патч устраняет проблему с отсутствием errno.h. См http://article.gmane.org/gmane.mail.qmail.general/13960 для получения детального описания и самого патча.

У Mate Wierdl есть errno.h-патчи для всех программ Dan Bernstein, включая qmail, daemontools и ucspi-tcp. Эти патчи доступны по адресу http://www.thedjbway.org/patches/djb_errno_patches.tgz.

5.10.1.2. qmail-local TAB патч

Этот патч исправляет небольшую ошибку в анализе .qmail-файлов, начинающихся с символа табуляции. http://www.ornl.gov/lists/mailing-lists/qmail/2000/10/msg00696.html

5.10.1.3. IP 0.0.0.0 патч

Этот патч позволяет распознавать IP-адрес 0.0.0.0 как локальный. http://www.suspectclass.com/~sgifford/qmail/qmail-0.0.0.0.patch

5.10.2. DNS

Исторически, DNS-ответы ограничены размером в 512 байт. Некоторые большие сайты начали возвращать MX-ответы большего размера. qmail и много других программ имеют проблему с DNS-запросами, для которых возвращается очень большой результат. Существуют два пути решить эту проблему в qmail и один обходной путь, который может быть достаточным в некоторых случаях.

5.10.2.1. Патч Christopher K. Davis'а, http://www.ckdhr.com/ckd/qmail-103.patch

Это адаптация патча от Chuck Foster, которая должна работать с любой resolver-библиотекой независимо от её возраста, и которая использует защитный байт (guard byte) чтобы избежать ошибки библиотеки "количество байт, помещенных в буфер" ("number of bytes placed in the buffer"). Он перераспределяет (память -- прим. перев.) один раз, до 65536, а не только до необходимого размера, поэтому он может быть менее эффективным, чем патч Chuck'а (хотя, подобно его патчу он перераспределяет (память) только если ответ больше PACKETSZ, который по умолчанию равен 512 байт). После перераспределения, он принудительно инициирует TCP-запрос, вместо того чтобы требовать от библиотеки распознавателя так поступить (избегая дополнительных задержек в работе между qmail и сервером имен, хотя, если они находятся на одной машине или локальной сети, это не является большой проблемой).

5.10.2.2. Увеличение размера буфера до 65536

Работает с последними версиями библиотеки распознавателя (resolver libraries) BIND, которые автоматически производят TCP-запрос средствами кода библиотеки, если размер вернулся обратно с установленным битом усечения (truncation bit). Это самое простое исправление, однако, оно также потенциально самое неэкономное в плане расхода памяти, в зависимости от того, как ваша система осуществляет распределение виртуальной памяти (paging). Чтобы сделать это, просто замените PACKETSZ на 65536 в dns.c и пересоберите qmail.

5.10.2.3. Запуск dnscache из djbdns

dnscache является, как понятно из имени, кэширующим DNS-сервером. Он знает как обрабатывать большие DNS-ответы и удалять ненужную информацию из них, поэтому ответ, который он возвращает, обычно намного меньше, чем исходный ответ. Также он обычно повышает производительность поиска имен для всех сервисов, которые используют DNS. Поскольку он не требует накладывания патчей на qmail, это может быть приемлемым решением. К сожалению, это не является Unfortunately, it's not a полным решением проблемы, потому что ответы все еще могут быть слишком велики для qmail. См. раздел djbdns в Родственные пакеты для получения дополнительной информации.

5.10.3. qmail-ldap

Этот патч от Andre Oppermann и др. снабжает qmail поддержкой Lightweight Directory Access Protocol (LDAP). LDAP подобен сетевой телефонной книге. Используя qmail-ldap POP-сервер становится способным обслуживать тысячи пользователей. См. http://www.nrg4u.com/.

5.11. QMTP

QMTP -- это Quick Mail Transfer Protocol, замена SMTP-протоколу, разработанный Dan Bernstein. Этот протокол описан в http://cr.yp.to/proto/qmtp.txt. QMTP подобен SMTP, но проще, быстрее и несовместим с SMTP. qmail включает QMTP-сервер, qmail-qmtpd, который выполнен очень похожим на qmail-smtpd. QMTP обычно использует порт 209.

qmail не включает клиента QMTP, но он есть в составе пакета serialmail. maildirqmtp доставляет сообщения из maildir-ящика определенному QMTP-серверу через QMTP.

QMTP не является заменой для SMTP, и он еще не широко распространен в Интернете

Russ Nelson написал патч для поддержки QMTP в qmail-remote. Он доступен по адресу http://www.qmail.org/qmail-1.03-qmtpc.patch. Там же можно найти архив, который может быть распакован в /service для запуска QMTP-сервиса. Он доступен по адресу http://www.qmail.org/qmtpd-service.tar.gz.

5.12. Отклонение недействительных получателей во время SMTP-сессии

Когда удаленный сервер соединяется с qmail-smtpd и предлагает ему сообщение, qmail-smtpd проверяет адрес получателя в содержимом control/rcpthosts. Если узел или домен после символа @ перечислен в control/rcpthosts, qmail-smtpd принимает сообщение, которое помещается в очередь и qmail-send пробует его доставить. Если локальный получатель недействительный -- не существует пользователя или псевдонима с таким именем -- qmail-send генерирует сообщение о недоставке и отсылает его на обратный адрес, указанный во время SMTP-сессии.

В дружелюбном мире, любая стратегия была бы подходящей. К сожалению, существует много злонамеренных спамеров. Некоторые пробуют отослать сообщение получателям, которые "могут" существовать на вашем сервере -- используя базы данных распространенных имен, словари или даже генерируя список всех возможных строк из букв и цифр.

В qmail-системе такие спам-атаки могут быть причиной существенной загрузки системы, заполнять очередь мусором и задерживать доставку настоящих писем.

Некоторые MTA проверяют локальных получателей во время сессии и отказываются принимать сообщение, если получатель недействителен. Это защищает сервер от большого объема ненужной работы, но также имеет свою отрицательную сторону. Используя эту проверка, спамеры могут быстро определить какие адреса существуют на самом деле.

Существует несколько способов реализовать проверку пользователей во время SMTP-сессии в qmail. Eben Pratt составил их список по адресу http://netdevice.com/qmail/rcptck/. Большинство из них требуют поддержки базы данных действительных или недействительных получателей или шаблонов. One that doesn't is Paul Jarc's qmail-realrcptto, available from http://code.dogmap.org./qmail/.

5.13. TLS и STARTTLS

Scott Gifford написал очень полное и подробное руководство по использованию transport layer security (TLS) в qmail. Это руководство описывает применение STARTTLS для SMTP и STLS для POP3D в netqmail. Оно доступно по адресу http://www.suspectclass.com/~sgifford/ucspi-tls/ucspi-tls-qmail-howto.html.


A. Благодарности

Во-первых, спасибо Dan Bernstein за проектирование и написание такой мощной и элегантной системы. После примерно десяти лет использования qmail все еще впечатляет меня.

Я также хотел бы поблагодарить участников списка рассылки qmail. Два участника заслуживают особого упоминания. Первый -- Russ Nelson, один из наиболее полезных, терпеливых, знающих и удивительных помощников. Его вклад в сообщество qmail уступает только DJB. Второй -- Charles Cazabon, который наступает Russ'у на пятки. Charles в данный момент главный участник списка рассылки, отвечающий на большинство вопросов более корректно, чем кто либо. Charles также написал пару очень удобных утилит, getmail и pymsgauth, и был техническим редактором для The qmail Handbook, где его вклад был решающим для успеха книги, и за который он получил слишком мало вознаграждения и признания.

Также спасибо всем, кто рецензировал и распространял этот документ, включая:

Отдельное спасибо Henning Brauer за домен lifewithqmail.org и его хостинг!

Также отдельное спасибо Michael M. Kadrie из ATLAS Design Group, http://www.atlasdesigngroup.com, за новый логотип qmail!

Life with qmail был написан с использованием Simple Document Format (SDF), очень хорошего языка разметки текста, основанного на Perl, который генерирует HTML, plain text, PostScript, POD и другие форматы. Он сделал работу намного более легкой. См. http://search.cpan.org/author/IANC/sdf-2.001/ для получения дальнейшей информации.


B. Родственные пакеты

B.1. dot-forward

Sendmail использует .forward-файлы (произносится как dot forward) чтобы разрешить пользователям контролировать доставку сообщений, которые они получают. qmail использует похожий механизм: .qmail-файлы. Пакет dot-forward дает возможность использовать .forward-файлы в qmail. Владельцы систем, на которых запущен Sendmail или любой другой MTA, и которые используют .forward-файлы могут захотеть обдумать возможность использования пакета dot-forward, чтобы избежать конвертирования существующих .forward-файлов в их .qmail эквиваленты -- или просто сделать переход на qmail менее заметным для своих пользователей.

dot-forward -- небольшой пакет, простой в установке и конфигурировании. Исходный код доступен по адресу http://cr.yp.to/software/dot-forward-0.71.tar.gz.

dot-forward написал Dan Bernstein, который поддерживает о нем web-страницу http://cr.yp.to/dot-forward.html.

B.2. fastforward

fastforward -- другое дополнение для совместимости с Sendmail. Sendmail использует центральную базу данных псевдонимов, которая хранится в одном файле, обычно /etc/aliases. qmail использует набор dot-qmail-файлов в /var/qmail/alias, по одному файлу на псевдоним. Если вы мигрируете на qmail, и у вас имеется файл с псевдонимами в формате Sendmail, который вы не хотите конвертировать, fastforward даст qmail возможность использовать файл псевдонимов как есть.

Исходный код доступен по адресу http://cr.yp.to/software/fastforward-0.51.tar.gz.

fastforward был написан Dan Bernstein, который поддерживает о нем web-страницу http://cr.yp.to/fastforward.html.

B.3. ucspi-tcp

SMTP-сервер в qmail не запускается как самостоятельный демон. Вспомогательные программы, такие как inetd, xinetd или tcpserver запускаются как демоны. Затем они принимают TCP-соединение на 25 порт (SMTP) и запускают копию qmail-smtpd.

Inetd -- стандартный сетевой сервер, "super-server". Он может быть сконфигурирован через /etc/inetd.conf для запуска qmail-smtpd, но рекомендованное средство -- tcpserver, который является частью пакета ucspi-tcp. ucspi-tcp -- это акроним для UNIX Client-Server Program Interface for TCP, и произносится как ooks-pie tee see pee.

tcpserver предпочтительней inetd потому что:

Исходный код доступен по адресу http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz.

Gerrit Pape распространяет документация для ucspi-tcp в виде man-страниц по адресу http://smarden.org/pape/djb/.

ucspi-tcp написал Dan Bernstein, который поддерживает о нем web-страницу http://cr.yp.to/ucspi-tcp.html.

B.4. daemontools

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

Исходный код daemontools доступен по адресу: http://cr.yp.to/daemontools/daemontools-0.76.tar.gz.

Gerrit Pape распространяет документацию для daemontools в виде man-страниц по адресу http://smarden.org/pape/djb/.

daemontools написал Dan Bernstein, который поддерживает о нем web-страницу http://cr.yp.to/daemontools.html.

B.5. qmailanalog

qmailanalog обрабатывает лог-файлы qmail и создает ряд отчетов, которые сообщают что система сделала, и в каком объеме. Если вам необходима статистика о том, как много сообщений было отослано или получено, насколько они были большими и как быстро они были обработаны, qmailanalog это то, что вам нужно.

В качестве бонуса программа matchup может комбинировать несколько строк из журнала qmail в одну -- мало чем отличающуюся от знакомых журналов Sendmail.

Исходный код qmailanalog доступен по адресу http://cr.yp.to/software/qmailanalog-0.70.tar.gz.

qmailanalog написал Dan Bernstein, который поддерживает о нем web-страницу http://cr.yp.to/qmailanalog.html.


Примечание: qmailanalog полагается на метки времени в лог-файлах в дробном формате (fractional second format), используемый программой accustamp. Для того чтобы использовать его с журналами, сгенерированными multilog, в которых временные метки проставляются в формате TAI64N, вам необходимо перевести их в старый формат. Одна программа, которая может это сделать, доступна по адресу http://www.qmail.org/tai64nfrac.

B.6. rblsmtpd

Если вы никогда не получали спам, то вам сильно повезло. Большинство пользователей электронной почты слишком хорошо знакомы с Unsolicited Bulk E-mail (UBE, незапрошенной массовой почтой), также известной как "спам". Большинство таких сообщений представляют из себя рекламу порносайтов, финансовых пирамид и прочих мошенничеств. В недалеком прошлом, примерно до 1998 года, большинство MTA в Интернете были open relays, т.е. они принимали почту от кого угодно для кого угодно, даже если ни отправитель, ни получатель не были локальными. Спамеры использовали любой open relay, который могли найти, для доставки спама. Это позволяет им заметать следы, перенаправляя ответные действия на "невиновный" сайт, который занимался пересылкой, и сохраняет им большое количество процессорного времени и пропускной способности сети.

В наши дни такие open relay считаются очень дурным тоном, и несколько групп по борьбе со спамом создали механизм для идентификации open relay и других распространенных источников спама, чтобы избежать приема от них SMTP-соединений.

rblsmtpd -- RBL SMTP-демон. Он расположен между tcpserver и qmail-smtpd, и занимается тем, что отвергает соединения от систем, обозначенных в одном из этих списков.

Например, чтобы запустить rblsmtpd под tcpserver, попробуйте нечто вроде этого:

#!/bin/sh QMAILDUID=`id -u qmaild` NOFILESGID=`id -g qmaild` MAXSMTPD=`cat /var/qmail/control/concurrencyincoming` exec /usr/local/bin/softlimit -m 2000000 \ /usr/local/bin/tcpserver -v -R -H -l 0 -x /etc/tcp.smtp.cdb -c "$MAXSMTPD" \ -u "$QMAILDUID" -g "$NOFILESGID" 0 smtp /usr/local/bin/rblsmtpd\ -r relays.ordb.org /var/qmail/bin/qmail-smtpd 2>&1

rblsmtpd раньше был доступен как отдельная утилита, но в данный момент включен в состав ucspi-tcp.

rblsmtpd написан Dan Bernstein, который поддерживает о нем web-страницу http://cr.yp.to/ucspi-tcp/rblsmtpd.html.

Charles Cazabon написал патч, который удаляет прописанный в коде rblsmtpd RBL по умолчанию, поскольку его использование больше не бесплатно. Этот патч доступен по адресу http://pyropus.ca/software/misc/rblsmtpd-nodefaultrbl.patch.

B.7. serialmail

qmail был разработан для систем с постоянной высокоскоростной связью. serialmail -- это набор инструментов, которые помогают qmail быть более подходящим для неустойчивой, низкоскоростной связи. С serialmail, установленным на такой системе, qmail может быть сконфигурирован для доставки всех сообщений от удаленных систем в один maildir-ящик. В serialmail команда maildirsmtp используется для отправки содержимого maildir-ящика на почтовый концентратор провайдера когда соединение будет установлено. Можно также использовать maildirqmtp, если провайдер поддерживает QMTP (см. подраздел QMTP в разделе Расширенные темы).

serialmail также может быть использован на стороне провайдера для внедрения AutoTURN: SMTP-соединение от клиента приводит к тому, что сервер инициирует соединение обратно к клиенту для отсылки сообщений,предназначенных для клиента, из очереди на сервере. Это похоже на ETRN-функцию SMTP.

Исходный код serialmail доступен по адресу http://cr.yp.to/software/serialmail-0.75.tar.gz.

serialmail был написан Dan Bernstein, который поддерживает о нем web-страницу http://cr.yp.to/serialmail.html.

B.8. mess822

mess822 -- это библиотека и набор приложений для разбора (parsing) почтовых сообщений, совместимых с RFC 822. Эти приложения включают:

Исходный код mess822 доступен по адресу http://cr.yp.to/software/mess822-0.58.tar.gz.

mess822 написал Dan Bernstein, он же сопровождает страницу по адресу http://cr.yp.to/mess822.html.

B.9. ezmlm

ezmlm -- высокопроизводительный, легкий в использовании менеджер списков рассылки (mailing list manager, MLM) для qmail. Если вы знакомы с LISTSERV или Majordomo, то должны знать, что делает менеджер списков рассылки. Для получения дополнительной информации о списках рассылки под qmail смотрите подраздел Менеджеры рассылок в Расширенные темы.

Исходный код ezmlm доступен по адресу http://cr.yp.to/software/ezmlm-0.53.tar.gz.

ezmlm написал Dan Bernstein, который поддерживает о нем web-страницу http://cr.yp.to/ezmlm.html.

Fred Lindberg и Fred B. Ringel разработали расширение для ezmlm под названием ezmlm-idx. Оно добавляет множество удобных возможностей и крайне рекомендуется. Его в данный момент развивает и поддерживает Bruce Guenter, домашняя страница -- http://www.ezmlm.org/.

B.10. safecat

safecat надежно записывает файл в maildir-ящик. Он особенно полезен для сохранения писем в ящик при работе с procmail. Например, следующий управляющий файл сохраняет все сообщения в Maildir:

:0w |safecat Maildir/tmp Maildir/new

safecat написал Len Budney, который поддерживает о нем web-страницу http://jeenyus.net/~budney/linux/software/safecat.html.

B.11. djbdns

djbdns -- DNS-сервер, написанный автором qmail. Кроме всего прочего, он включает в себя tinydns -- полномочный DNS-сервер и dnscache -- кэширующий DNS-сервер.

Официальная страница djbdns -- http://cr.yp.to/djbdns.html.

B.12. maildrop

maildrop -- фильтр почты, похожий на procmail.

maildrop написал Sam Varshavchik, который поддерживает о нем web-страницу http://www.courier-mta.org/maildrop/.

B.13. syncdir

syncdir небольшая библиотека, которая делает системный вызов link() синхронным. Это необходимо при использовании qmail с очередью, размещенной на файловой системе, которая не выполняет link() синхронно, такой как ext2fs, Reiserfs, XFS от SGI в Linux и FFS с softupdates в BSD.

syncdir написал Bruce Guenter и эта библиотека доступна по адресу http://untroubled.org/syncdir/. Инструкции по установке доступны по адресу http://www.ornl.gov/lists/mailing-lists/qmail/2001/12/msg00949.html.


C. Как работает Интернет-почта

C.1. Как сообщение доставляется из точки A в точку B

Когда пользователь с одного узла отправляет сообщение пользователю на другом узле, за кулисами случается множество вещей, которых вы можете не знать.

Пусть, скажем, Алиса, alice@alpha.example.com, хочет отослать сообщение Бобу, bob@beta.example.com. Вот что происходит:

1. Алиса составляет сообщение, используя свой почтовый клиент (mail user agent, MUA), что-то вроде mutt или pine. Она указывает получателя в поле To, тему письма в поле Subject, и сам текст сообщения. Это выглядит примерно так:

To: bob@beta Subject: lunch How about pizza?

2. Когда она закончит сообщение, то скажет MUA отослать его.

3. В этот момент MUA может добавить дополнительные поля в заголовки, например Date или Message-Id, и модифицировать значения, введенные Алисой (например, заменить bob@beta на "Bob <bob@beta.example.com>". Далее MUA отдает (injects) сообщение почтовой системе. Существует два пути сделать это: он может запустить программу, предоставленную почтовой системой для инъекции сообщений (injecting messages), или он может открыть соединение с SMTP-портом или на локальной системе, или на удаленном почтовом сервере. В этом примере мы будем считать, что MUA использует локальную программу инъекции (local injection program) чтобы отдать сообщение MTA. Детали процесса инъекции меняются в зависимости от MTA, но в UNIX-системах метод с использованием sendmail является стандартом де-факто. При использовании этого метода, MUA может поместить заголовок и сообщение, отделенные пустой строкой, в файл, и передать его программе sendmail.

4. Если инъекция прошла успешно -- сообщение имело корректный синтаксис и программа sendmail была вызвана корректно -- ответственность за сообщение теперь лежит на MTA. Детали сильно зависят от MTA, но обычно MTA на первой системе исследует заголовки, чтобы определить куда слать сообщение, открывает SMTP-соединение со второй системой и передает сообщение MTA на второй системе. SMTP-диалог требует, чтобы сообщение было отослано двумя частями: envelope (конверт), который содержит адреса получателей (bob@beta.example.com) и обратный адрес (alice@alpha.example.com), и само сообщение, которое состоит из заголовка (header) и тела (body).

5. Если MTA на второй системе отвергает сообщение, возможно из-за того, что пользователь bob в системе не существует, MTA на первой системе отсылает сообщение о недоставке (bounce message) на обратный адрес, alice@alpha, чтобы уведомить Алису о проблеме.

6. Если MTA на второй системе принимает сообщение, он смотрит на адрес получателя и определяет, локальный ли это получатель для второй системы или удаленный. В нашем случае получатель локальный, поэтому MTA или доставляет сообщение самостоятельно, или передает его агенту локальной доставки (mail delivery agent, MDA), например, /bin/mail или procmail.

7. Если доставка терпит неудачу, возможно потому что Боб исчерпал свой лимит на размер ящика (mail quota), MTA на второй системе отсылает сообщение о недоставке (bounce message) на обратный адрес из конверта (envelope return address), alice@alpha.

8. Если доставка прошла успешно, сообщение в ящике Боба ждет, пока почтовый клиент (MUA) не прочитает его и не покажет Бобу.

C.2. Дополнительная информация

Для получения дополнительной информации о том, как работает Интернет-почта, смотрите следующие документы:

C.2.1. Internet RFC's

Internet Requests for Comment (RFC, буквально -- Запросы Комментариев) -- официальная документация Интернета. Большинство из них ушли далеко от стадии комментариев и определяют Интернет-протоколы, такие как TCP, FTP, Telnet и различные стандарты и протоколы почты.

Полный список связанных с почтой RFC' доступен на сайте Internet Mail Consortium по адресу http://www.imc.org/mail-standards.html.


D. Устройство

D.1. Модульная архитектура системы

MTA выполняет различные задачи. Ранние проекты, подобные Sendmail и smail были монолитными. Другими словами, они представляли из себя одну большую, сложную программу, которая "меняет шляпы (switches hats)": она надевает одну шляпу, чтобы быть SMTP-сервером, другую -- чтобы быть SMTP-клиентом, еще одну -- чтобы принимать сообщения от системы локально (inject messages locally), и еще одну -- для управления очередью и т.д.

qmail является модульной системой. Каждая из вышеперечисленных функций выполняется отдельной программой. Как результат, программы намного меньше, проще, и менее подвержены функциональным ошибкам или ошибкам в безопасности. Для дальнейшего увеличения безопасности модули qmail запускаются с различными правами и не "доверяют" друг другу: они не предполагают, что другие модули всегда делают только, что от них ожидают.

Основные модули:

Модуль Функция
qmail-smtpd принимает/отвергает сообщения через SMTP
qmail-inject принимает сообщения локально (injects messages locally)
qmail-rspawn/qmail-remote заведуют удаленной доставкой
qmail-lspawn/qmail-local заведуют локальной доставкой
qmail-send заведует отправкой сообщений из очереди
qmail-clean очищает очередь

Также, существует обратная сторона модульного подхода. В отличие от монолитного MTA взаимодействие между модулями четко определено, модули обмениваются только минимально необходимой информацией друг с другом. В большинстве случаев это хорошо (A Good Thing), но иногда не позволяет сделать некоторые вещи. Например, флаг "-v" sendmail заставляет Sendmail печатать трассировку своих действий на стандартный вывод в целях отладки. Поскольку один исполняемый файл sendmail осуществляет инъекцию сообщения, помещение его в очередь, обработку псевдонимов, обработку .forward-файлов и удаленную доставку через SMTP, он в способен легко отследить весь процесс доставки сообщения до конечной цели. Эквивалентной возможности в qmail не существует, и внедрение передачи "отладочного (debug)" флага от модуля к модулю требует существенных изменений в коде и дополнительной сложности.

D.2. Файловая структура

/var/qmail является корневым для файловой структуры qmail. Это может быть изменено во время сборки qmail, но будет хорошей идеей оставить все как есть, чтобы другие администраторы знали что где искать. Если вы действительно хотите переместить частично или полностью дерево qmail, лучше будет использовать символические ссылки. См. подраздел Создание каталогов в разделе "Установка" для получения дополнительной информации.

Подкаталоги верхнего уровня:

Каталог Содержимое
alias .qmail-файлы для системных псевдонимов
bin исполняемые файлы и сценарии
boot стартовые сценарии
control конфигурационные файлы
doc документация (кроме man-страниц)
man man-страницы
queue очередь сообщений, ожидающих отправки
users файлы базы данных qmail-users

D.3. Структура очереди

Файл INTERNALS в каталоге с исходными текстами описывает детали организации очереди более подробно. Здесь приводится более общее описание структуры очереди.

Подкаталог Содержимое
bounce постоянные ошибки доставки
info* адреса отправителей (envelope sender addresses)
intd конверты (envelopes) создаваемые в данный момент программой qmail-queue
local* адреса локальных получателей (local envelope recipient addresses)
lock файлы блокировок
mess* файлы с сообщениями
pid используется qmail-queue для получения номера i-node
remote* адреса получателей на удаленных системах (remote envelope recipient addresses)
todo законченные конверты (complete envelopes)


Примечание: Каталоги, помеченные "*" содержат набор расщепляющих (split) подкаталогов с именами "0", "1", ..., до (conf-split-1), где conf-split -- параметр, используемый при компиляции, который содержится в файле conf-split в каталоге с исходным кодом. Значение по умолчанию равно 23. Смысл разбиения (splitting) на подкаталоги заключается в снижении количества файлов в одном каталоге на очень загруженных серверах. conf-split должен быть простым числом.

Файлы в подкаталоге mess именуются по номерам их i-node. Это означает, что вы не можете вручную переместить их используя стандартные утилиты UNIX, подобные mv, dump/restore и tar. На сайте http://www.qmail.org/ есть ссылки на несколько утилит, написанных пользователями qmail, которые корректно переименовывают файлы очереди.


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

D.4. Изображения

Существует группа файлов в /var/qmail/doc с именами, начинающимися с PIC. Они представляют из себя текстовые "изображения" различных ситуаций, которые обрабатывает qmail. Они демонстрируют алгоритм прохождения сообщения через различные модули и очень полезны для отладки и создания сложных конфигураций.

Имя файла Сценарий
PIC.local2alias локально созданное (locally-injected) сообщение доставляется на локальный псевдоним
PIC.local2ext локально созданное (locally-injected) сообщение доставляется на расширенный адрес
PIC.local2local локально созданное (locally-injected) сообщение доставляется локальному пользователю
PIC.local2rem локально созданное (locally-injected) сообщение доставляется на удаленный адрес
PIC.local2virt локально созданное (locally-injected) сообщение доставляется в локальный виртуальный домен
PIC.nullclient сообщение отдается null-клиенту (message injected on a null client)
PIC.relaybad неудачная попытка использовать локальный узел как relay
PIC.relaygood удачная попытка использовать локальный узел как relay
PIC.rem2local сообщение получено через SMTP для локального пользователя

Эти файлы также доступны on-line:

Если вы желаете настоящих рисунков о qmail, смотрите "big qmail picture" у Andre Oppermanat по адресу http://www.nrg4u.com/.


E. Редко задаваемые вопросы

Это вопросы, которые нельзя классифицировать как часто задаваемые, но которые важны и не так просты для ответа.

E.1. Как часто qmail пытается послать отложенные сообщения?

Каждое сообщение имеет свое собственное расписание повторов. Чем дольше сообщение остается неотправленным, тем реже qmail пытается его отослать. Расписание повторов не конфигурируется. Следующая таблица демонстрирует расписание повторных попыток, осуществляемых до тех пор, пока сообщение, которое не удается доставить на удаленный узел, не будет возвращено обратно отправителю (until it bounces). Для локальных сообщений используется похожий, но более частый график.

Попытка доставки Секунды Д-ЧЧ-ММ:CC
1 0 0-00:00:00
2 400 0-00:06:40
3 1600 0-00:26:40
4 3600 0-01:00:00
5 6400 0-01:46:40
6 10000 0-02:46:40
7 14400 0-04:00:00
8 19600 0-05:26:40
9 25600 0-07:06:40
10 32400 0-09:00:00
11 40000 0-11:06:40
12 48400 0-13:26:40
13 57600 0-16:00:00
14 67600 0-18:46:40
15 78400 0-21:46:40
16 90000 1-01:00:00
17 102400 1-04:26:40
18 115600 1-08:06:40
19 129600 1-12:00:00
20 144400 1-16:06:40
21 160000 1-20:26:40
22 176400 2-01:00:00
23 193600 2-05:46:40
24 211600 2-10:46:40
25 230400 2-16:00:00
26 250000 2-21:26:40
27 270400 3-03:06:40
28 291600 3-09:00:00
29 313600 3-15:06:40
30 336400 3-21:26:40
31 360000 4-04:00:00
32 384400 4-10:46:40
33 409600 4-17:46:40
34 435600 5-01:00:00
35 462400 5-08:26:40
36 490000 5-16:06:40
37 518400 6-00:00:00
38 547600 6-08:06:40
39 577600 6-16:26:40
40 608400 7-01:00:00

E.2. Почему я не могу послать почту большому сайту с большим количеством MX?

Если вы получаете:

deferral: CNAME_lookup_failed_temporarily._(#4.4.3)/

Эта проблема может быть вызвана тем, что qmail не может обработать большой ответ на запрос к серверу имен. Решение заключается в установке патча или использовании обходных путей. См. подраздел Патчи в разделе "Расширенные темы".

Также остается вопросом, почему некоторые не имеют проблем с доставкой почты в такие системы. В основном, в зависимости от таймингов и порядка запросов, посылаемых вашему локальному серверу имен, размер ответа на ЛЮБОЙ запрос для "aol.com" может быть больше чем предел в 512 байт для UDP-пакета, а может и не быть.

"Может не быть" скорее всего случится если A- или MX-записи устареют, а NS-записи -- нет. NS-сервера для зоны .COM устанавливают TTL равным двум дням, но сервера AOL для своих записей используют TTL равный одному часу, это часто встречается на менее загруженных серверах имен. Более занятые серверы имен более вероятно будут иметь эти записи в своем кэше в любое время, срывая попытки непропатченного qmail проверить CNAME-записи.

Лучший тест -- отослать почту на nosuchuser@large-mx.ckdhr.com; если ваша очередь окажется пустой и вы получите сообщение о недоставке от ckdhr.com, ваш MTA может отсылать почту на узлы со списком MX-записей больше 512 байт. (Если использовать одну DNS-запись с одним TTL, которая больше 512 байт, проблема может быть замечена независимо от таймингов и последовательности запросов.)

E.3. Что такое QUEUE_EXTRA?

QUEUE_EXTRA -- это конфигурационная переменная, которая задается при сборке и определяет дополнительного получателя, который будет добавлен при каждой доставке. Это используется, прежде всего, для журналирования. В качестве примера в FAQ описано использование QUEUE_EXTRA для хранения копий всех входящих и исходящих сообщений.

Чтобы задействовать QUEUE_EXTRA, отредактируйте файл extra.h, указав дополнительного получателя в формате "Tполучатель\0", и длину строки QUEUE_EXTRA в QUEUE_EXTRALEN ("\0" считается за один символ). Например:

#define QUEUE_EXTRA "Tlog\0" #define QUEUE_EXTRALEN 5

Остановите qmail, если он запущен. Если вы установили сценарий qmailctl из раздела "Установка", это можно осуществить выполнив команду:

qmailctl stop

Если у вас нет сценария qmailctl, вам необходимо использовать свои сценарии запуска/остановки или отослать qmail-send сигнал TERM.

Затем пересоберите qmail:

make setup check

Заполните файл ~alias/.qmail-log в соответствии с тем, что вам нужно журналировать. Например, для журналирования полей Message-ID:

| awk '/^$/ { exit } /^[mM][eE][sS][sS][aA][gG][eE]-/ { print }'

И наконец, перезапустите qmail.


F. Сообщения об ошибках

Сообщения об ошибках qmail и что они означают.

См. RFC 1893 для получения разъяснений кодов ошибок в круглых скобках.

Это приложение не закончено.


G. Особенности

Эти "особенности (gotchas)" часто вызывают проблемы у новичков qmail.

G.1. qmail не доставляет почту суперпользователям.

Для предотвращения возможного запуска программой qmail-local команд от имени привилегированного пользователя qmail игнорирует всех пользователей, чей UID равен 0. Это задокументировано в man-странице qmail-getpw.

Это не означает, что qmail не осуществляет доставку для root, это просто означает, что такая доставка будет производиться от имени непривилегированного пользователя. Как правило, создается псевдоним для root с помощью заполнения файла ~alias/.qmail-root.

G.2. qmail не доставляет почту пользователям, у которых нет своих домашних каталогов.

Это другая особенность в плане безопасности и просто хорошая общепринятая практика. Это задокументировано в man-странице qmail-getpw.

G.3. qmail не доставляет почту пользователям, чьи имена содержат буквы в верхнем регистре.

qmail преобразует всю "локальную часть" -- все что в адресе находится слева от "@" -- в нижний регистр Man-страница ничего не говорит об этом, но сам код работает именно так. Тот факт, что он игнорирует пользователей с символами в верхнем регистре, задокументирован в man-странице qmail-getpw.

G.4. qmail заменяет точки (.) в расширенных адресах на двоеточия (:).

Еще одна особенность в плане безопасности. Целью является защита расширенных адресов от продвижения вверх по файловой системе, используя "..". Заменой точек на двоеточия qmail гарантирует, что все .qmail-файлы будут находиться в домашнем каталоге пользователя. Это задокументировано в man-странице dot-qmail.

G.5. qmail в расширенных адресах преобразует символы верхнего регистра в нижний регистр.

Это другой результат того, что qmail преобразует всю локальную часть адреса в нижний регистр. Это задокументировано в man-странице dot-qmail.

G.6. qmail не использует /etc/hosts.

qmail никогда не использует /etc/hosts для определения IP-адреса, связанного с именем узла. Если вы используете имена в файлах настроек, qmail должен иметь доступ к серверу имен.

Однако, существует возможность запустить qmail в системах, у которых нет доступа к серверу имен. Узлы в файлах настроек должны быть обозначены IP-адресами путем заключения их в квадратные скобки ([]), например:

[10.1.2.219]

На самом деле, квадратные скобки не всегда необходимы, но использовать их постоянно -- хорошая идея.

G.7. qmail не регистрирует SMTP-активность.

По ряду причин qmail не регистрирует SMTP-соединения, отказы (rejections), недопустимые и правильные команды. tcpserver может быть использован для регистрации соединений, а recordio может быть использован для регистрации всего SMTP-диалога. recordio является частью пакета ucspi-tcp . О том как это сделать, написано в FAQ по адресу http://cr.yp.to/qmail/faq/servers.html#recordio.

G.8. qmail не генерирует уведомления о задержках.

Если Sendmail не может доставить сообщение на протяжении нескольких часов, обычно четырех, он шлет уведомление о задержке автору сообщения. Эти уведомления похожи на сообщения о недоставке, но не указывают на то, что доставка окончательно потерпела неудачу.

qmail не отсылает такие предупреждения. Недоставленное сообщение будет возвращено отправителю только тогда, когда оно пробудет в очереди время, большее queuelifetime.

G.9. qmail работает медленно, если /var/qmail/queue/lock/trigger отсутствует / имеет неправильные разрешения / является обычным файлом.

qmail-queue и qmail-send общаются между собой через именованный канал (named pipe) /var/qmail/queue/lock/trigger. Если этот канал будет испорчен, qmail-send не будет извещен о новых сообщениях около получаса.

Лучший способ убедиться что он правильно настроен -- запустить "make check" в каталоге с исходным кодом. Если это невозможно, убедитесь, что он выглядит так:

# ls -l /var/qmail/queue/lock/trigger prw--w--w- 1 qmails qmail 0 Jul 5 21:25 /var/qmail/queue/lock/trigger

Уделите особое внимание символу "p" в начале строки (он сообщает, что это именованный канал), правам доступа (особенно биту, соответствующему праву на запись всем) и владельцу / группе.

G.10. DNS- или IDENT-поиск замедляют работу SMTP

Если qmail-smtpd медленно отвечает на соединения, проблема может заключаться в поиске обратных DNS-записей (PTR) или IDENT-поиске. Если вы запускаете qmail-smtpd с tcpserver, удалите параметры "-h", "-p" и "-r" и добавьте параметры "-H", "-P", "-R" и "-l имя_узла".

См. в документации tcpserver по адресу http://cr.yp.to/ucspi-tcp/tcpserver.html разъяснение этих параметров.

G.11. CRLF(Carriage Return/Linefeed) окончания строк не работают.

qmail-inject и другие локальные механизмы инъекции сообщений, подобные sendmail, не работают правильно когда сообщение содержит CRLF(carriage return/linefeed) окончания строк в DOS-стиле. В отличие от Sendmail, qmail требует, чтобы в локально создаваемых (locally-injected) сообщениях использовались Unix-окончания строк (только LF). Это распространенная проблема с PHP-сценариями.

G.12. qmail-send или tcpserver прекращают работу если существуют проблемы с ведением лог-файлов.

Если у вас журналы ведет сервис, управляемый supervise, как описано в разделе 2, и лог-сервис дает сбой по любой причине: заполнен диск, ошибка в стартовом сценарии, ошибка в конфигурировании каталога с журналами и пр., канал (pipeline) в конечном итоге заполнится, что приведет к блокированию или зависанию сервиса. Решите эту проблему (см. Решение проблем) и все вернется к нормальному состоянию.

G.13. qmail-smtpd не проверяет локальную часть адреса.

Если example.com перечислен в control/rcpthosts, почта для кто_угодно@example.com будет принята во время SMTP-сессии. Если кто_угодно не является существующим пользователем или псевдонимом, qmail отошлет сообщение о недоставке (bounce message) на адрес отправителя (envelope sender address).

Некоторые туповатые тесты на пересылку (simpleminded relaying tests) считают, что если сообщение принято, оно будет доставлено. Это неправильно. Если кто-то утверждает, что ваша система -- open relay, запросите у него копию сообщения, которое переслал ваш сервер -- включая полные заголовки, особенно поля Received -- затем сравните их со своими журналами.

См. раздел Отклонение недействительных получателей во время SMTP-сессии для получения информации о том, как добавить в qmail проверку получателей.

G.14. Firewall'ы могут блокировать удаленный доступ к вашему SMTP/POP3/IMAP серверу.

Если вы установили SMTP, POP3 или IMAP-сервер и вы можете установить с ним соединение с локального узла или с узла в локальной сети, но не можете с удаленного узла, проблема может заключаться в межсетевом экране (firewall).

Первое, на что стоит обратить внимание -- это сам сервер. Red Hat Linux, например, блокирует SMTP в конфигурации по-умолчанию при использовании iptables. Другие механизмы фильтрации пакетов, такие как ipchains, также могут быть ответственны за это.

Также возможно, что ваш провайдер блокирует некоторые порты для предотвращения отсылки спама или в соответствии со своими Правилами оказания услуг (Terms of Service, TOS). Свяжитесь с техподдержкой своего провайдера после того, как убедитесь что фильтр пакетов не при чем и что запущенный сервер не нарушает Условий оказания услуг (сильно помогает в поиске узла, где стоит запрет на соединение, утилита tcptraceroute -- прим. перев.).

G.15. qmail-inject устанавливает поле From в anonymous если USER и LOGNAME не установлены.

Если сообщение, отсылаемое через qmail-inject не содержит поля From, qmail-inject просматривает переменные окружения чтобы узнать, какой пользователь отсылает сообщение. Переменные, которые он просматривает (по порядку): QMAILUSER, MAILUSER, USER и LOGNAME.

Во время сессии при обычном входе пользователя из USER и LOGNAME устанавливаются одна или обе переменные, но некоторые пакетные задания, например, запускаемые из cron, могут не иметь ни одной из них.

Чтобы ваши cron-задания имели правильное поле From, установите одну из этих переменных перед отправкой любых почтовых сообщений.

G.16. qmail-send не всегда завершается сразу.

Отсылка qmail-send сигнала TERM не приводит к его немедленному завершению, если в данный момент осуществляется доставка сообщений. qmail-send будет ждать завершения всех процессов qmail-local и qmail-remote перед тем как завершиться, чтобы можно было записать результат этих доставок. По причине этого, "qmailctl restart" или "qmailctl stop" могут отчитаться что qmail-send был остановлен, даже если он все еще запущен. Всегда запускайте "qmailctl stat" чтобы убедиться в том, остановка или перезапуск на самом деле завершены.

Также не забывайте, что qmail-send проходит по очереди перед завершением, поэтому на очень больших очередях это будет причиной заметной задержки.

G.17. Доставка в /dev/null не позволяет избавиться от сообщений.

Инструкция по доставке, подобная:

/dev/null

заставляет qmail считать, что /dev/null является mbox-ящиком, но поскольку /dev/null является специальным файлом, qmail не может успешно доставить в него почту.

Лучшим способом избавиться от сообщения будет создание .qmail-файла, который не содержит действительных инструкций по доставке, но не пустого. (Пустые .qmail-файлы трактуются как содержащие инструкции доставки по-умолчанию, указанные в defaultdelivery или в строке запуска qmail-start.) Это достигается заполнением файла только комментариями.

Например, .qmail-файл, содержащий только:

#

или:

# не доставлять сообщения (throw messages away undelivered)

приведет к тому, что сообщение будет отброшено без доставки куда-либо.

G.18. Изменение очереди, в то время как qmail-send запущен, опасно.

Изменение каких-либо файлов или каталогов в /var/qmail/queue в то время как qmail-send запущен, без точного понимания того, что вы делаете, весьма вероятно приведет к повреждению очереди -- например, к сообщениям в неопределенном состоянии, странным ошибкам в журналах, дублировании доставок, фиктивным сообщениям о недоставке и пр. Если это случилось, найдите и запустите утилиту для проверки очереди (на пару из них даются ссылки на qmail.org) или создайте новую, пустую очередь.

Если вы хотите изменить очередь, сперва остановите qmail, осторожно поиграйтесь с очередью, затем запустите qmail. Не забывайте, что вы можете повредить очередь даже если qmail-send остановлен, поэтому вы все так же должны знать, что вы делаете.


H. Часто задаваемые вопросы о Life with qmail

H.1. Какой версии Life with qmail?

Это LWQ версии 2006-01-02.

H.2. Кто владелец Life with qmail?

Life with qmail is Copyright 1999-2006 David E. Sill

http://Web.InfoAve.Net/~dsill/dave/

H.3. Какова лицензия на Life with qmail?

Life with qmail лицензирован под OpenContent License, версия 1.0. См. полную версию лицензии по адресу http://www.opencontent.org/opl.shtml. По существу, вы можете копировать, распространять или модифицировать Life with qmail при условии, что измененная версия также будет распространяться под OpenContent License.

H.4. Как я могу быть извещен о выходе новых версий LWQ?

Подпишитесь на список рассылки lwq-announce, отправив сообщение на адрес lwq-announce-subscribe@sws1.ctd.ornl.gov.

H.5. Где обитают разработчики LWQ и где можно с ними пообщаться?

Подпишитесь на список рассылки lwq, отправив сообщение на адрес lwq-subscribe@sws1.ctd.ornl.gov.

H.6. Имеется ли перевод Life with qmail на мой язык?

Может быть. LWQ переведен на несколько языков. См. http://lifewithqmail.org/trans.html для получения большей информации о переводах LWQ.

H.7. Доступен ли Life with qmail в PostScript, PDF, plain text или любых других форматах, кроме HTML?

Да, текст в других форматах можно найти по адресу http://lifewithqmail.org/.

H.8. Я использовал Life with qmail и он испортил мою систему / удалил все файлы с диска / разрушил мою личную жизнь / убил мою собаку / etc.

Я сожалею. Действительно сожалею. Но Life with qmail не дает никаких гарантий. См. OpenContent License, упомянутую выше. Я не получал плату за его написание, я просто хотел создать что-то полезное для qmail-сообщества.

На самом деле, это не FAQ. Фактически, я надеюсь, что это NAQ (Never Asked Question, никогда не задаваемый вопрос).

H.9. Как я могу внести вклад в работу над LWQ?

Пожалуйста, посылайте комментарии, предложения, жалобы etc. на lwq@sill.org.

Если вы хотите внести более значительный вклад, например, новые подразделы или приложения, это здорово! Вы можете сначала связаться со мной, чтобы удостовериться в том, что я хочу чтобы эта тема была в LWQ и что никто уже не работает над ней.

Другой способ поддержки LWQ -- сделать покупку в моем книжном магазине на Amazon.com, используя ссылку: http://www.amazon.com/exec/obidos/redirect-home/davesill.

Спасибо за вашу поддержку!

H.10. Что изменилось в этой версии LWQ?

H.10.1. Что изменилось в версии 2004-06-30 LWQ?

H.10.2. Что изменилось в версии 2004-03-28 LWQ?

H.10.3. Что изменилось в версии 2004-03-01 LWQ?

H.10.4. Что изменилось в версии 2004-01-26 LWQ?

H.10.5. Что изменилось в версии 2003-11-10 LWQ?

H.10.6. Что изменилось в версии 2003-10-30 LWQ?

H.10.7. Что изменилось в версии 2003-08-16 LWQ?

Take One!