Жизнь с qmail

Dave Sill
30 ноября 2007
Перевод М. Альхименко при помощи OmegaT и StarDict
22 января 2007 года.
версия для печати

Содержание


1. Введение

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

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

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

  • Манипулирование файлами/каталогами под UNIX
  • Работа с web-браузером или FTP-клиентом
  • Следование руководствам

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, скорее всего Postfix или 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. Установка

  • Автоматическая адаптация к вашему варианту UNIX -- портирование не нужно
  • Автоматическая конфигурация под конкретный хост
  • Быстрая установка -- нет большого списка действий, которые необходимо выполнить

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

  • Четкое разделение между адресами, файлами и программами
  • Минимизация setuid-кода
  • Минимизация кода, выполняющегося с правами root
  • Разделение доверия на пять частей (five-way trust partitioning) -- безопасность в основании (in depth)
  • Опциональная регистрация хэшей сообщения, сообщений целиком и т.д. (см. Что такое QUEUE_EXTRA? в приложении E.)

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

  • Совместимость с RFC 822 и RFC 1123
  • Полная поддержка адресных групп
  • Автоматическое преобразование адресов старого формата в формат RFC 822
  • Команда sendmail для совместимости с существующими MUA
  • Длина строки заголовка ограничена только доступной памятью
  • Маскировка хоста (см. defaulthost)
  • Маскировка пользователя (см. MAILUSER и MAILHOST)
  • Автоматическая установка поля Mail-Followup-To (см. QMAILMFTFILE)

1.5.4. SMTP-сервис

  • Совместимость с RFC 821, RFC 1123, RFC 1651, RFC 1652, и RFC 1854
  • Очистка 8-го бита
  • RFC 931/1413/ident/TAP обратные вызовы -- могут помочь распознать спамеров / поддельные обратные адреса
  • Контроль пересылки (relay control) -- предотвращает несанкционированную пересылку писем посторонними
  • Нет взаимного влияния между контролем пересылки (relay control) и псевдонимами (aliases)
  • Автоматическое распознавание локальных IP-адресов
  • Таймауты на каждый буфер
  • Подсчет количества переходов (hop)
  • Лимиты на параллелизм (через ucspi-tcp)
  • Отказ в соединениях известным злоумышленникам (abusers) (через ucspi-tcp)
  • Пересылка (relaying) и перезапись (rewriting) сообщений для авторизованных клиентов
  • Опциональная поддержка RBL/ORBS (через rblsmtpd)

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

  • Мгновенная обработка сообщений, добавленных в очередь
  • Лимиты на параллелизм
  • Разделение каталога очереди -- нет замедления работы при увеличении размера очереди
  • Квадратичная задержка при повторной попытке отправке сообщений -- попытки отправки "старых" сообщений осуществляются реже "новых" (см. Appendix E)
  • Независимые планировщики для повторных попыток доставки сообщений
  • Автоматическое сохранение очереди -- нет потерь почты при крахе системы
  • Автоматические контрольные точки для каждого получателя
  • Автоматическая очистка очереди
  • Просмотр очереди (см. qmail-qread)
  • Детальная статистика по доставке (с помощью qmailanalog)

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

  • QSBMF сообщения о недоставке (bounce messages) -- как машиночитаемые, так и удобочитаемые для человека
  • Поддержка HCMSSC -- языконезависимые коды ошибок (RFC 1893)
  • Двойные сообщения о недоставке (double bounces) отсылаются postmaster'у

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

  • Любое количество имен для локального хоста (см. locals)
  • Любое число виртуальных доменов (см. virtualdomains)
  • Поддержка символов подстановки (wildcards) в доменах (см. virtualdomains)
  • Поддержка "percent hack" (символа %) (см. percenthack)
  • UUCP ловушка

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

  • Совместимость с RFC 821, RFC 974 и RFC 1123
  • Очистка 8-го бита
  • Автоматический пропуск неработающих хостов
  • Искусственная маршрутизация -- smarthost, localnet, mailertable (см. smtproutes)
  • Таймауты на каждый буфер
  • Пассивная SMTP очередь -- идеальна для SLIP/PPP (с помощью serialmail)
  • Поддержка AutoTURN (с пом-ю serialmail)

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

  • Совместимость с файлами .forward Sendmail (с помощью dot-forward)
  • Хэшированная база данных пересылки (с помощью fastforward)
  • Совместимость с /etc/aliases Sendmail (с помощью fastforward)
  • Шаблоны (wildcards) в адресах (см. .qmail-default)
  • Владельцы списков рассылки автоматически получают сообщения о недоставке (bounces) и сообщения автоответчиков
  • VERP -- автоматическая идентификация получателя в сообщениях о недоставке сообщений списка рассылки
  • Delivered-To -- автоматическое предотвращение петель, даже между хостами

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

  • Контролируемая пользователями адресная иерархия -- fred контролирует доставку почты в ящик fred-anything
  • Надежная работа с NFS (см. maildir)
  • Контролируемая пользователем доставка: procmail и пр. (см. qmail-command)
  • Опциональное извещение о новых письмах (см. qbiff)
  • Опциональное NRUDT-подтверждение о получении (см. qreceipt)
  • Условная фильтрация (см. condredirect и bouncesaying)

1.5.11. POP3-сервис

  • Совместимость с RFC 1939
  • Поддержка UIDL
  • Поддержка TOP
  • Поддержка APOP
  • Модульная проверка пароля (через checkpassword)

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

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

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

  • dot-forward -- расширение, совместимое с .forward-файлами Sendmail
  • fastforward -- расширение, совместимое с базой данных псевдонимов Sendmail
  • ucspi-tcp --замена inetd
  • daemontools -- набор инструментов для управления демонами и их журналами (logs)
  • qmailanalog -- набор инструментов для анализа log-файлов qmail
  • serialmail -- инструмент для передачи почты через медленные сети
  • mess822 -- инструмент для разбора (parsing) сообщений электронной почты
  • ezmlm -- менеджер списков рассылки (mailing list manager) для qmail

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

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

1.8. Лицензия

По состоянию на 30 ноября 2007 qmail 1.03 является общественным достоянием (is in the public domain). См. http://cr.yp.to/qmail/dist.html. Это означает, что не существует юридических ограничений на то, что вы можете делать с ним: вы можете копировать его, распространять (give it away), продавать, модифицировать, переименовыватьили использовать его части в работах, защищенных от копирования безо всяких ограничений.

Владельцем авторских прав на другие пакеты Dan'а Bernstein'а, такие как daemontools и ucspi-tcp, является автор (copyrighted by the author), и они распространяются без положений о правах пользователей . В http://cr.yp.to/softwarelaw.html описано как автор понимает ваши права в свете законов США об авторском праве. См. также http://en.wikipedia.org/wiki/License-free_software.

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. Они включают:

  • FAQ: Frequently Asked Questions (часто задаваемые вопросы), с ответами
  • INSTALL*: Документация по установке
  • PIC.*: Описание того, как qmail выполняет ключевые задачи. См. приложение Устройство для получения дополнительной информации.
  • Прочие документы, связанные с установкой

Эти документы также доступны 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 Quickstarter: Install, Set Up and Run your own Email Server

Kyle Wheeler написал книгу о qmail для Packt (http://www.packtpub.com/). Как можно догадаться из названия эта книга предназначена для того, чтобы помочь новичкам в qmail установить почтовый сервер.

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

1.10.4.3. 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.4. Running qmail

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

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

1.10.4.5. 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-архивы сообщений рассылки хранится по адресу:

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

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

  • http://cr.yp.to/qmail.html: официальная домашняя страница qmail.
  • http://www.qmail.org: неофициальная домашняя страница qmail. Содержит большое кличество информации о дополнениях и патчах, ссылки на множество хороших web-страниц о qmail на других сайтах.
  • http://www.flounder.net/qmail/qmail-howto.html: HOWTO от Adam McKenna.

1.11. Поддержка

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

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

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

  • listname@list.cr.yp.to: адрес для отправки (здесь и далее: listname -- имя списка рассылки). Сообщения, присылаемые сюда, доставляются всем участникам списка рассылки. Не посылайте запросы на подписку / отказ от подписки (subscribe/unsubscribe) сюда: они все равно не сработают, а только будут раздражать подписчиков.
  • listname-help@list.cr.yp.to: адрес помощи ( "help" address). Возвращает список адресов для команд и общую информацию об использовании.
  • listname-subscribe: чтобы подписаться, отошлите на этот адрес пустое сообщение.
  • listname-unsubscribe: чтобы отписаться, отошлите на этот адрес пустое сообщение.

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

  • listname-subscribe-joe=example.com@list.cr.yp.to.

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-showctl если вы не уверены в том, какая информация важна. Что ты уже делал? Если это новая инсталляция, скажи как ты инсталлировал qmail.
  • Что ты ожидал получить? Какие были последствия попыток этого добиться? Не думайте, что читатели могут догадаться сами.
  • Что уже получилось? Опишите фактический результат. Включите фрагменты лог-файлов и копии сообщений со служебными заголовками.


Примечание: список рассылки 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. исходного кода

До 30 ноября 2007 года из-за ограничений лицензии qmail относительно распространения предварительно откомпилированных пакетов он обычно устанавливался из исходного кода. Эта практика в будущем может измениться, особенно если daemontools и ucspi-tcp также станут общественным достоянием (are placed in the public domain). Однако, на данный момент для qmail исходный код все еще является предпочтительным способом распространения.

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

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

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

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

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

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

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

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

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

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

  • Если есть возможность, установите qmail в тестовой ("practice") системе. Это даст вам шанс совершать ошибки без потери важных писем или перерывов в работе почты для ваших пользователей.
  • Если у вас нет тестовой машины и ваша система уже обрабатывает почту, используя sendmail, smail, или другой MTA, вы можете установить и протестировать большинство частей qmail без перерыва в работе существующих сервисов.
  • Когда вы мигрируете с других MTA на qmail -- даже если вы имеете некоторый опыт работы с qmail -- будет хорошей идеей сформулировать план.

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

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

  • Около 10 МБ свободного места в разделе, где будет производиться сборка (build area) во время компиляции. После сборки вы можете освободить 4 МБ, удалив объектные файлы.
  • Законченную, функционирующую систему разработки Cи, включающую компилятор, файлы заголовков системных функций (system header files) и библиотеки. В инструкциях по сборке (см. ниже) будет рассказано, как вы можете проверить, имеются ли у вас необходимые компоненты.
  • Несколько мегабайт для исполняемых файлов, документации и конфигурационных файлов.
  • Надежная файловая система для очереди. Гарантия надежности qmail требует, чтобы очередь была размещена на файловой системе с традиционной семантикой BSD FFS. Большинство современных локальных файловых систем отвечают этим требованиям, за одним исключением: системный вызов link() часто является асинхронным -- это означает, что результаты работы link() могут быть еще не записаны на диск, когда вызов link() уже вернет результат. Библиотека syncdir Bruce Guenter'а может быть использована для решения этой проблемы. См. syncdir в приложении "Родственные пакеты" для получения дальнейшей информации.
  • Достаточное количество дискового пространства для очереди. Маленькие однопользовательские системы нуждаются только в паре мегабайт. Большим серверам могут потребоваться пара гигабайт.
  • Совместимая операционная система. Подойдут большинство распространенных UNIX. См. список совместимых версий в файле README в дереве исходных текстов.
  • Крайне рекомендуется иметь доступ к DNS-серверу. Без него qmail сможет отсылать сообщения только тем удаленным системам, которые прописаны в его конфигурационном файле smtproutes.
  • Адекватное сетевое соединение. qmail был разработан систем с хорошими каналами связи (well-connected systems), поэтому вряд ли вы захотите использовать его для сервера списков рассылок на модемном канале в 28.8k. Пакет serialmail был разработан чтобы сделать qmail более подходящим для систем с плохим соединением (poorly-connected systems). См. раздел serialmail в приложении "Родственные пакеты" для получения дополнительной информации.


Примечание: Каталог 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 и нажмите Enter:
    $ cc
    cc: No input files specified
    $
  • Если вы получите подобный ответ, то у вас имеется компилятор Си и путь к нему содержится в переменной окружения $PATH. Если нет, то это еще не означает, что он не установлен. Его может не быть, но, возможно, путь к нему не указан в переменной $PATH. Конечно, это также может означать, что он не установлен. Попробуйте так:
    • /usr/bin/cc
    • /usr/bin/gcc
    • /usr/local/bin/cc
    • /usr/local/bin/gcc
    • /usr/ccs/bin/cc
  • Если ничего из этого не сработало, вы можете попробовать что-то более платформозависимое. В командной строке попробуйте что-нибудь из этого, в зависимости от ОС, которую вы используете:
    • Red Hat Linux: rpm -qa | grep gcc или rpm -qa | grep egcs
    • FreeBSD: GCC включен по умолчанию
  • Если вы не можете найти установленный компилятор, вам необходимо установить его. Свяжитесь с вашим поставщиком ОС или каналом по поддержке вашей ОС.

В этом разделе мы пройдем фактические шаги компиляции 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.06.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.06.tar.gz
    tar xpf netqmail-1.06.tar
    gunzip ucspi-tcp-0.88.tar.gz
    tar xpf ucspi-tcp-0.88.tar
    rm *.tar      # optional, unless space is very tight
    cd /package
    gunzip daemontools-0.76.tar.gz
    tar xpf daemontools-0.76.tar
    rm *.tar      # optional, again

В данный момент должны существовать каталоги /usr/local/src/netqmail-1.06, /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.06
    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.06 и давайте начнем:

    cd /usr/local/src/netqmail-1.06

В разделе Проверка среды сборки вы определили расположение Си-компилятора. Если он называется не 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 the.full.hostname

Например, если ваш домен -- 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.06/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.06/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", который может быть установлен чтобы предотвратить эти проблемы. Просто установите RPM-пакет, доступный по адресу ftp://ftp.csi.hu/mw/fake_mta-1-10memphis.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                  # ignore errors
    mv /usr/sbin/sendmail /usr/sbin/sendmail.old                # ignore errors
    chmod 0 /usr/lib/sendmail.old /usr/sbin/sendmail.old        # ignore errors
    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
    if no errors, enter a line of text and press ENTER
    if still no errors, enter CTRL-D (end of file)

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

    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 address of client: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, чтобы он знал какие адреса он должен доставлять локально и какие сообщения он должен принимать от удаленных систем.

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

  • rcpthosts, который указывает qmail-smtpd принимать почту, адресованную этим узлам, и
  • locals, который указывает qmail-send почту для каких адресов на этих узлах следует доставлять локально.

Пошлите 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/.qmaildashextension будет определять как сообщение будет доставлено.

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

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

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

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

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 использует набор файлов для изменения правил трансляции.

  • include: пользователи для включения
  • exclude: пользователи для исключения
  • mailnames: альтернативные "почтовые имена" ("mailnames") для пользователей
  • subusers: дополнительные адреса с опциональным .qmail-расширением, управляемые пользователем,
  • append: различные назначения


Примечание: Если вы используете 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 участвуют в диалоге, в результате которого:

  • MTA принимает сообщение, или
  • MUA получает сообщение об ошибке

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 расположена в следующих местах:

  • /usr/lib/sendmail
  • /usr/sbin/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 -- получает имя пользователя и пароль
  • checkpassword -- проверяет подлинность имя пользователя и пароля
  • qmail-pop3d -- POP-демон

Обычно 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.06/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   # if 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://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

Carnegie 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