|
Когда пользователь на одном хосте посылает сообщение пользователю на другом
хосте, многие вещи остаются за сценой, о которых вы даже не подозреваете.
Скажем Элис (alice@alpha.example.com) хочет послать сообщение для Боба (bob@beta.example.com).
Что происходит:
- Элис формирует сообщение почтовым клиентом (mail user agent - MUA), таким
как mutt или pine. Она определяет получателя в поле To,
тему письма в поле Subject и сам текст сообщения. Приблизительно это
выглядит так:
To: bob@beta
Subject: lunch
How about pizza?
- Когда она закончит сообщение, то скажет почтовому клиенту его отправить.
- В этой точке почтовый клиент может добавить в заголовок поля типа Date
и Message-Id и модифицировать значения введенные Элис (например заменить
bob@beta на "Bob <bob@beta.example.com>"). Затем почтовый
клиент инжектирует сообщение на почтовый сервер. Для этого есть два
пути: он запустит программу, предусмотренную почтовой системой для закачивания
сообщений, или может установить связь через SMTP порт либо на локальной системе,
либо на удаленном почтовом сервере. Для этого примера мы предположим, что
почтовый клиент применит локальную программу инжекции, чтобы передать сообщение
MTA. Детали процесса инжекции зависят от MTA, но на UNIX системах, метод sendmail
стандарт де-факто. Это метод, в котором почтовый клиент может положить заголовок
и тело в файл, разделив их пустой строкой и передать файл программе sendmail.
- Если инжекция прошла успешно - сообщение было синтаксически правильно, и
sendmail был вызван должным образом - теперь за сообщение ответственен MTA.
Детали сильно варьируется в зависимости от MTA. В общих чертах, MTA в точке
А исследует заголовок, чтобы определить, куда послать сообщение, открывает
связь SMTP к точке В, и пересылает сообщение на MTA системы В. SMTP общение
требует, чтобы сообщения посылались двумя частями: конверт, который
определяет адрес получателя (bob@beta.example.com) и обратный адрес (alice@alpha.example.com),
и непосредственно сообщение, которое состоит из заголовка и тела.
- Если MTA в точке B отклоняет сообщение, то это возможно из-за того, что
никакого пользователя Bob нет, на MTA в точку A посылается bounce
-сообщение по адресу возврата - alice@точки_A, чтобы уведомить ее о проблеме.
- Если MTA в точке B принимает сообщение, то он смотрит на адрес получателя,
определяет, является ли он местным или принадлежит удаленной системе. В случае
если адрес местный, то тогда MTA либо доставляет сообщение сам, либо пропускает
его через агента доставки почты (MDA), такие как /bin/mail
или procmail.
- Если доставка терпит неудачу, возможно потому что Боб превысил свою почтовую
квоту, MTA точки B посылает bounce-сообщение по адресу возврата -
alice@точки_А .
- Если доставка успешна, то сообщение лежит в почтовом ящике Боба, пока его
почтовый клиент не прочтет его.
Информацию о том, как работает интернет почта, можете получить по следующим
ссылкам:
RFC (Requests for Comment) - официальная документация интернета. Большинство
из них далеки от представления комментария, и определяет интернет протоколы,
такие как TCP, FTP Telnet, и различные стандарты почты и протоколов.
- RFC 821, Simple Mail Transfer Protocol. http://www.ietf.org/rfc/rfc0821.txt
- RFC 822, Standard for the Format of ARPA Internet Text Messages. http://www.ietf.org/rfc/rfc0822.txt
- RFC 931, Authentication Server. http://www.ietf.org/rfc/rfc0931.txt
- RFC 974, Mail Routing and the Domain System. http://www.ietf.org/rfc/rfc0974.txt
- RFC 1123, Requirements for Internet Hosts -- Application and Support. http://www.ietf.org/rfc/rfc1123.txt
- RFC 1413, Identification Protocol. http://www.ietf.org/rfc/rfc1413.txt
- RFC 1423, Privacy Enhancement for Internet Electronic Mail: Part III: Algorithms,
Modes, and Identifiers. http://www.ietf.org/rfc/rfc1423.txt
- RFC 1651, SMTP Service Extensions. http://www.ietf.org/rfc/rfc1651.txt
- RFC 1652, SMTP Service Extension for 8bit-MIMEtransport. http://www.ietf.org/rfc/rfc1652.txt
- RFC 1806, Content disposition. header. http://www.ietf.org/rfc/rfc1806.txt
- RFC 1854, SMTP Service Extension for Command Pipelining. http://www.ietf.org/rfc/rfc1854.txt
- RFC 1891, SMTP Service Extension for Delivery Status Notifications. http://www.ietf.org/rfc/rfc1891.txt
- RFC 1892, The Multipart/Report Content Type for the Reporting of Mail System
Administrative Messages. http://www.ietf.org/rfc/rfc1892.txt
- RFC 1893, Enhanced mail system status codes. http://www.ietf.org/rfc/rfc1893.txt
- RFC 1894, An Extensible Message Format for Delivery Status Notifications.
http://www.ietf.org/rfc/rfc1894.txt
- RFC 1939, Post Office Protocol - Version 3. http://www.ietf.org/rfc/rfc1939.txt
- RFC 1985, SMTP Service Extension for Remote Message Queue Starting (ETRN).
http://www.ietf.org/rfc/rfc1985.txt
- RFC 1991, PGP Message Exchange Formats. http://www.ietf.org/rfc/rfc1991.txt
- RFC 2015, MIME Security with Pretty Good Privacy. (PGP). http://www.ietf.org/rfc/rfc2015.txt
- RFC 2045, MIME Internet message bodies. http://www.ietf.org/rfc/rfc2045.txt
- RFC 2046, MIME Media Types. http://www.ietf.org/rfc/rfc2046.txt
- RFC 2047, MIME Headers. http://www.ietf.org/rfc/rfc2047.txt
- RFC 2048, MIME Registration Procedures. http://www.ietf.org/rfc/rfc2048.txt
- RFC 2049, MIME Conformance Criteria. http://www.ietf.org/rfc/rfc2049.txt
- RFC 2142, Mailbox names for common services. http://www.ietf.org/rfc/rfc2142.txt
- RFC 2183, Content Disposition header. http://www.ietf.org/rfc/rfc2183.txt
Полный список RFC документов связанных с почтой доступно по адресу http://www.imc.org/mail-standards.html.
MTA выполняет различные задачи. Ранее сконструированные MTA, типа Sendmail
и smail, монолитны. Другими словами, они имели одну большую, сложную
программу, которая "переодевала шляпы": надев одну шляпу становилась
SMTP сервером, другую - SMTP клиентом, третью - работала с локальными сообщениями,
четвертую - управляла очередью, и т.д.
qmail - модульный. Каждая из этих функций выполняется отдельной программой.
В результате программы получились намного меньше, проще, и менее вероятно, что
они содержат функциональные ошибки или ошибки безопасности. Чтобы далее расширять
защиту, модули qmail, выполняются с различными привилегиями, и они не
"доверяют" друг другу: они не предполагают, что другие модули всегда
делают только то, что они, как предполагается1, делают.
| Модуль |
Функция |
|
qmail-smtpd
|
принятие/отклонение сообщений через SMTP
|
|
qmail-inject
|
Закачка сообщений локально
|
|
qmail-rspawn/qmail-remote
|
Управление удаленными доставками
|
|
qmail-lspawn/qmail-local
|
Управление локальными доставками
|
|
qmail-send
|
Обработка очереди
|
|
qmail-clean
|
Очищение очереди
|
Есть также и обратная сторона модульного подхода. В отличие от монолитного
MTA между модулями строго очерчено взаимодействие, и модули только обмениваются
друг с другом минимально необходимой информацией. Это, как правило, Хорошо,
но иногда это добавляет трудности. Например, флаг "-v" программы sendmail
заставляет печать следы ее действий на стандартный выход для отладочных целей.
Начиная с обработки закачки, организации очереди, обработки псевдонима, обработка
файла .forward, и удаленное отправление через SMTP, все это дает возможность
легко прослеживать полную доставку, пока сообщение не будет доставлено. Подобной
возможности в qmail нет, и это потребовало бы существенных изменений
кода и дополнительной сложности, чтобы осуществить флажок "отладка"
от модуля к модулю.
Каталог /var/qmail является корневым для qmail'овской файловой
структуры. Он может быть изменен при компиляции qmail, но вообще-то лучше
оставить как есть, чтобы другие администраторы не занимались поисками. Если
вы действительно хотите переместить некоторые каталоги или все qmail
дерево, то лучше это сделать с использованием символических связей. Смотри подраздел
Создание каталогов.
Подкаталоги верхнего уровня:
| Каталог |
Содержимое |
|
alias
|
.qmail файлы для псевдонимов в масштабе всей системы
|
|
bin
|
Исполняемые файлы и скрипты
|
|
boot
|
Скрипты запуска
|
|
control
|
Файлы конфигурации
|
|
doc
|
Документация (кроме man-страниц)
|
|
man
|
man-страницы
|
|
queue
|
Очередь непосланных сообщений
|
|
users
|
Файлы базы данных qmail-пользователей
|
Файл INTERNALS в каталоге исходников обсуждает детали организации очереди более
подробно. Это более краткий обзор структуры очереди.
| Подкаталог |
Содержимое |
|
bounce
|
постоянные ошибки доставки
|
|
info*
|
Адрес отправителя конверта после предварительной обработки
|
|
intd
|
конверт, создается qmail-queue
|
|
local*
|
Локальные адреса получателя конверта после предварительной обработки
|
|
Lock
|
файлы блокировки
|
|
mess*
|
файлы сообщений
|
|
pid
|
используется qmail-queue для запроса i-node номера
|
|
remote*
|
Удаленные адреса получателя конверта после предварительной обработки
|
|
Todo
|
Полный конверт: откуда сообщение прибыло, куда идет
|
Примечание: Каталоги, отмеченные "*" содержат серию
разделенных подкаталогов, имеющие имя "0", "1"...,
до (conf-split-1), где conf-split - значение, использующееся в процессе
компиляции, установлено в файле conf-split в каталоге исходников. Значения
по умолчанию -- 23. Назначение разбиения этих каталогов состоит в том, чтобы уменьшить
число файлов в отдельном каталоге на очень загруженных серверах.
Файлы в подкаталоге mess названы по их номеру i-node. Что это означает? То,
что Вы вручную не можете перемещать их, используя стандартные UNIX утилиты,
такие как mv, dump/restore и tar. На есть пара утилит
написанных пользователями, которые правильно переименует файлы очереди. См.
http://www.qmail.org/
Примечание: опасно изменять файлы очереди, в то время как qmail
выполняется.
Если Вы хотите модифицировать очередь, сначала остановите qmail, осторожно
поиграйте с ней, и затем перезагрузите qmail.
Это серия файлов в каталоге /var/qmail/doc имена которых начинаются
PIC. Это картинки в текстовом формате показывают, как qmail
обрабатывает различные ситуации. Они показывают алгоритм прохождения сообщения
через различные модули, и очень полезны для отладки и создания сложных конфигураций.
| Файл |
Сценарий |
|
PIC.local2alias
|
Локально-закачанное сообщение доставляется через локальный псевдоним
|
|
PIC.local2ext
|
Локально-закачанное сообщение доставляется на расширенный адрес
|
|
PIC.local2local
|
Локально-закачанное сообщение доставляется локальному пользователю
|
|
PIC.local2rem
|
Локально-закачанное сообщение доставляется удаленному пользователю
|
|
PIC.local2virt
|
Локально-закачанное сообщение доставляется на адрес в виртальном домене
|
|
PIC.nullclient
|
сообщение закачано на нуль-клиента
|
|
PIC.relaybad
|
Неудачная попытка использование локального хоста в качестве ретранслятора
|
|
PIC.relaygood
|
Удачная попытка использование локального хоста в качестве ретранслятора
|
|
PIC.rem2local
|
Сообщение полученное посредством SMTP для локального пользователя
|
В он-лайне эти файлы доступны:
http://www.qmail.org/man/index.html
Если Вы хотите реальные изображения qmail, выберите "big qmail
picture" на сайте Andre Opperman'a: http://www.nrg4u.com/.
|