Жизнь с 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-серверов, но существует пара хитростей для того, чтобы сделать он работал хорошо на клиенте 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 должна всегда иметь следующие четыре процесса:

  • qmail-send запущенный с правами пользователя qmails
  • qmail-clean запущенный с правами пользователя qmailq
  • qmail-rspawn запущенный с правами пользователя qmailr
  • qmail-lspawn запущенный с правами пользователя root

В зависимости от разновидности вашего 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.

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

  • /var/log/syslog
  • /var/adm/SYSLOG
  • /var/log/maillog

Типичная запись в журнале 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, где его вклад был решающим для успеха книги, и за который он получил слишком мало вознаграждения и признания.

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

  • Vince Vielhaber
  • Chris Green
  • Christopher K. Davis
  • Scott Schwartz
  • Fred Lindberg
  • Russell P. Sutherland
  • Alex Miller
  • Tim Hunter
  • Frank D. Cringle
  • Mahlon Smith
  • Rogerio Brito
  • Tony Hansmann
  • Matthias Andree
  • Tillman Hodgson
  • Stefan Witzel
  • Scott Gifford
  • слишком много чтобы всех упомнить...

Отдельное спасибо 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 потому что:

  • tcpserver позволяет ограничить число одновременных подключений к сервису. Inetd имеет механизм, ограничивающий темп (быстроту) подключений (connection-rate limiting mechanism), который временно отключает "слишком" занятые сервисы.
  • tcpserver может быть настроен так, чтобы запретить доступ с некоторых узлов или распознавать и помечать локальные узлы, чтобы qmail-smtpd обрабатывал их по-другому.
  • tcpserver -- единственный сервер, одобряемый автором qmail.

Исходный код доступен по адресу 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 содержит набор инструментов для управления службами и слежения за ними. Он не обязателен, но очень рекомендуется, особенно для сильно загруженных систем. Он включает в себя:

  • supervise, который следит за сервисами и перезапускает их, если о они умирают.
  • svc, который общается с supervise и позволяет ему останавливать, приостанавливать или перезапускать сервисы.
  • multilog, который управляет журналами для сервисов, осуществляет их автоматическую ротацию чтобы держать их в установленных размерах.
  • setuidgid, который позволяет суперпользователю запускать программы, работающие с UID и GID обычного пользователя.

Исходный код 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. Эти приложения включают:

  • ofmipd: демон, который принимает сообщения от клиентов и перезаписывает поля From на основании записей в базе данных
  • new-inject: замена qmail-inject, которая поддерживает контролируемую пользователем перезапись имен узлов.
  • iftocc: .qmail-утилита для проверки, было ли сообщение отослано на определенные адреса.
  • 822header, 822field, 822date и 822received: извлекают информацию из сообщения.
  • 822print: преобразует сообщение в удобочитаемый формат.

Исходный код 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 версии 2007-11-30.

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

Life with qmail is Copyright 1999-2007 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?

  • Обновление до netqmail 1.06.
  • Обновлена информация о книге Wheeler.
  • Исправлено несколько опечаток.
  • Исправлено несколько неработающих ссылок.

H.10.1. Что изменилось в версии 2006-01-02 LWQ?

  • Множество небольших улучшений, исправлений мертвых ссылок etc.
  • Добавлено решение для /dev/null. Спасибо Payal Rathod.
  • Дополнено предупреждение о nosuid. Спасибо Tony Hansmann.
  • Добавлена ссылка на nodefaultrbl-патч Cazabon'а. Спасибо Jeremy Kister.
  • Добавлены mkdir-инструкции в раздел о qmail-pop3d. Спасибо Larry Weldon.
  • Добавлено замечание о errno-патче для checkpasswd. Спасибо tlad.
  • Добавлен подраздел о smarthost relay. Спасибо Silver Dirk.
  • Улучшено описание Qmail-Scanner. Спасибо Jason Haar.
  • Добавлен раздел для книги Yenigul'а. Спасибо Ismail Yenigul.
  • Добавлен псевдоним abuse@. Спасибо Charles Cazabon.
  • Добавлен раздел о ucspi-tls. Спасибо Scott Gifford.
  • Добавлено предупреждение о модификации очереди.

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

  • Включен новый логотип qmail. Спасибо Michael Kadrie.
  • Исправлено несколько опечаток.
  • Обновлено примечание о Macintosh OS X.
  • Обновлена ссылка на ClamAV.
  • Добавлен раздел о проверке получателя (recipient validation) в "Расширенные темы".
  • Исправлена формулировка "setuid/exe required for queue filesystem".

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

  • Обновлена информация о книге Levine.
  • Исправлена опечатка в "What changed in the 2004-03-01 version of LWQ?".
  • Добавлен комментарий в G.16 о том, что qmail-send сканирует очередь перед выходом.

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

  • В G.16 написано "KILL", должно быть "TERM".
  • Добавлен пример сообщения о недостатке памяти при использовании softlimit.
  • Исправлен E.2, проблемы с поиском CNAME (CNAME lookup problem).

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

  • Обновление до netqmail 1.05.
  • Исправлено несколько опечаток.

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

  • Исправлено несколько опечаток.

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

  • Добавлена установка дистрибутива netqmail.
  • Обновлена запись о Binc IMAP.

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

  • Добавлен этот раздел с журналом изменений. Спасибо Jerry Asher за просьбу о нем.
  • Добавлено примечание о noexec и nosuid в раздел с системными требованиями.
  • Добавлена ссылка на inst_check и примеры в разделе о тестировании.
  • Добавлена ссылка на errno-патчи Mate Wierdl в разделе про патчи.
  • Добавлено примечание об OS X в раздел системных требований.
  • Добавлена запись о Cyrus в раздел IMAP-серверов. Спасибо Rick Updegrove.
  • Добавлена запись о Dovecot в раздел IMAP-серверов.
  • Переписана часть entension section. Спасибо Adrian Ho.
  • Переформатирован сценарий запуска POP-сервера для более легкого копирования и вставки. Спасибо Woody Preston.
  • Исправлена опечатка в разделе о DNS-патче Chuck Foster'а. Спасибо Josh Parreco.
  • Исправлена пара опечаток в разделе о QMTP. Спасибо Marek Gutkowski.
Take One!