почта передается одной из программ рассылки почты.
На рисунке 4 представлена схема функционирования почтового сервера на базе программы sendmail.
Когда программа приема почты получает сообщение, то она передает его программе sendmail для последующей рассылки. Если сообщение достигло машины адресата, то оно отправляется программой местной рассылки в почтовый ящик пользователя.
Первый этап рассылки - сбор сообщений. Sendmail получает почтовые сообщения из трех источников:
- командной строки или стандартного ввода;
- через SMTP-протокол (из сети);
- из очереди сообщений.
При получении сообщений из командной строки или стандартного ввода sendmail вызывается пользователем с указанием адреса доставки сообщения. При этом выполняются следующие действия: определяется адрес отправителя, выбирается из командной строки адрес получателя и оба адреса преобразуются в соответствии с описанием файла конфигурации, определяется способ доставки сообщение, размещается заголовок в оперативной памяти для последующих преобразований, а тело сообщения размещается во временном файле для отправки без изменений.
При получении сообщений по протоколу SMTP sendmail используется как программа клиента и сервера протокола. Протокол определен в RFC-821 и является основным для рассылки почты в Internet. В этом случае sendmail запускается как демон, который "слушает" порт TCP и в случае получения сообщения устанавливает соединение с удаленным клиентом SMTP. Как правило, таким клиентом является другая программа sendmail.
Программа подготовки почты на локальной машине также может использовать SMTP. Для этого sendmail открывает канал (pipe) межпроцессорного обмена.
При получении сообщений из очереди используются временные файлы очередей. Эти очереди используются для хранения не разосланных сообщений. Сообщение хранится в двух файлах. В одном файле хранится тело сообщения, а в Другом конверт и заголовок сообщения. Обычно sendmail опрашивает очереди через определенные администратором почтового сервера промежутки времени на предмет наличия в них не разосланных сообщений.
Вторая стадия рассылки почты - рассылка сообщений. Как только одним из описанных выше способов sendmail получила сообщение, делается попытка его отправить по адресу. Для этого sendmail определяет три параметра: программу рассылки, узел сети и получателя. Эта процедура производится по правилам, которые содержатся в файле конфигурации. Sendmail сохраняет одну копию тела сообщения во временном файле, а заголовок загружает в оперативную память. Для каждого сообщения программа доставки (рассылки) сообщений вызывается отдельно. Если сообщение должно быть доставлено на разные машины, то для каждой из машин также вызывается своя программа доставки. Некоторые программы могут обслуживать сразу несколько абонентов одной машины; если это невозможно, то для каждого абонента вызывается также своя программа доставки. Рассматривают два типа рассылки: на удаленную машину и местную рассылку.
Для вызова программы рассылки sendmail открывает pipe и запускает программу рассылки, командная строка которой находится в файле конфигурации. Sendmail записывает заголовок и тело сообщения в pipe. Если программа рассылки не использует протокол SMTP, то адрес получателя передается через pipe. Если используется SMTP, то открывается двунаправленный канал для интерактивного взаимодействия с удаленным сервером SMTP. Если в качестве транспортного протокола используется TCP, то sendmail не запускает внешнюю программу рассылки, а сама инициирует TCP-соединение с удаленным сервером SMTP. При этом используется трансляция доменного имени.
Если sendmail определяет, что адреса доставки местные, то происходит обращение к файлу адресных синонимов и производится преобразование адресов (расширение). Файл адресных синонимов можно использовать для перенаправления почты в файлы или для обработки местными программами. Пользователь может иметь и свой собственный файл адресных синонимов для управления рассылкой персональной почты. После преобразования адресов почта отправляется программе местной рассылки (например rmail).
Важным моментом при работе sendmail является алгоритм определения типа, адресов. При использовании стандартного файла конфигурации применяются следующие правила: почта рассылается в соответствии с форматом адреса получателя, адреса при этом бывают местные, UUCP и SMTP.
Местные адреса имеют вид:
User
User@localhost
User@localhost.localdomain
User@alias
User@alias.localdomain
user@{local.host.internet.address}
localhost!user
localhost!localhost!user
user@localhost.uucp
Местный адрес - это адрес, который распознается как адрес на машине, с которой осуществляется отправка почты.
Адреса UUCP имеют вид:
Host!user
Host!host!user
user@host.uucp
Если машина, с которой отправляется почта, имеет прямую линию связи по протоколу UUCP со следующей машиной (в адресе), то почта передается на эту машину, если такого соединения нет, то почта не рассылается и выдается сообщение об ошибке. Файл конфигурации должен содержать детальное описание маршрутов для пересылки сообщений на машины по протоколу UUCP.
Адреса SMTP - это адреса, описанные в стандарте RFC-822 или стандартные адреса Internet. Эти адреса имеют вид:
Usr@host
usr@host.domain
<@hostl,@host2,@host3:user@host4>
user@[remote.host's.internet.address]
Почта с адресами SMTP рассылается по протоколу SMTP. Если в системе для адресации используется Berkeley Internet Name Domain (BIND) сервер, то sendmail может определять адреса получателей, используя сервис BIND. Если BIND не используется, то sendmail сама определяет адреса. При рассылке почты можно использовать и смешанную адресацию:
user%hostA@hostB - почта отправляется с машины hostB на машину hostA
user!hostA@hostB - почта отправляется с машины hostB на машину hostA
hostA!user%hostB - почта отправляется с hostA на hostB
Подводя итог под обсуждением принципов работы sendmail, следует специально подчеркнуть тот факт, что почта реально рассылается двумя принципиально разными способами.
При использовании протокола UUCP почта рассылается по принципу "stop-go", т.е. сообщения передаются от машины к машине по указанному в адресе пути. Отметим, что указание пути в адресе получателя не обязательно указывается отправителем, а формируется в почтовых серверах посредством имеющихся в нем таблиц маршрутизации почтовых сообщений. В этих таблицах администраторы прописывают соответствия почтового адреса получателя тому следующему почтовому серверу (а, следовательно, и администратору), с которым есть договоренность о транзите через него писем. При этом каждый сервер добавляет свою строку о прохождении письма в его заголовке. Получатель письма может посмотреть в заголовке пришедшего письма путь его прохождения. Причем такие отметки в заголовках выполняют сервера, работающие по любым протоколам передачи почтовых сообщений, например, SMTP, UUCP и т.д. Однако мы рассматриваем UUCP, и следует ясно представлять: если почта ушла с машины отправителя, то это не означает, что она поступит получателю. Промежуточная машина может вернуть почту назад, если не сможет разослать, например, администраторы не договорись о транзите писем, ошибка администратора при формировании вышеуказанной таблицы, неправильный адрес получателя, неработоспособность каналов связи и т.д.). Электронная почта действительно работает как система обычной почты, физически перемещая и храня сообщения на промежуточных почтовых серверах.
При передаче же писем по протоколу SMTP почта может (но не обязательно) отправляться сразу получателю в случае, когда с ним установлено интерактивное соединение. При этом происходит обмен между ними командами по протоколу SMTP в режиме on-line. Такой режим связи между отправителем и получателем по SMTP возможен и в этом его принципиальное отличие от UUCP,
при котором письмо проходит через многие транзитные почтовые сервера.
Однако возможность работы SMTP по схеме прямой связи клиента-отправителя с клиентом-получателем обладает многими недостатками, например, компьютер получателя выключен или нет связи с ним. Поэтому в настоящее время используется следующая схемы взаимосвязей. Клиент-отправитель передает сначала письмо почтовому серверу, к которому он подключен. Далее почтовый сервер клиента-отправителя в режиме on-line по SMTP передает письмо почтовому серверу клиента-получателя. Клиент-получатель, проснувшись и включив свой компьютер, получает пришедшие письма от своего почтового сервера. Предполагается, что почтовые сервера работают круглосуточно. И сейчас мы не обсуждаем вопрос о том, как почтовый сервер клиента-отправителя письма определяет из множества существующих в Internet других почтовых серверов требуемый. Отметим лишь, что надежность доставки писем поддерживается услугами DNS (Domain Name System), о которой коротко будет сказано ниже. При смешанной адресации доставка почты происходит по смешанному сценарию. Как шла доставка и как маршрутизировалось сообщение, можно определить из заголовка сообщения, которое вы получили.
Как было отмечено ранее, если хост получателя подключен к Internet (достижим через TCP-соединение), то используется протокол SMTP для доставки почты. Что это значит "достижим"? Это значит, что в DNS имеется запись, относящаяся к данному хосту. Такая запись называется MX (Mail eXchenge -- рассылка почты). Т.к. SMTP работает поверх TCP протокола, то данный алгоритм трансляции применим только к почтовым адресам имеющим Internet-формат.
Допустим, Вы хотите отправить почту на адрес user1@mailserver.org. После подготовки сообщения и его сборки (первая стадия рассылки) sendmail анализирует адрес получателя на предмет соответствия формату. Далее, отсекаются имя пользователя и знак "@". Для нашего примера получим mailserver.org.
Данное имя ищется в DNS с записью MX. Для этого используется специальный протокол прикладного уровня, который реализует службу DNS (Domain Name Service). DNS служит не только для трансляции имени хоста в IP-адрес (и наоборот), но и для определения адреса хоста, который отвечает за доставку почты к нужному нам пользователю (user1@mailserver.org). Это может быть хост, на котором находится почтовый ящик для user1@mailserver.org , а может быть промежуточный хост -- релей-хост (Relay-host).
Рассмотрим отрывок базы DNS для нашего примера.
...
mailserver.org IN A 195.195.195.195
IN MX 10 relay1.mailserv.com
IN MX 20 mx.gw3.net.da.net
IN MX 30 smtp.main.mailserver.org
IN MX 40 smtp.hydranet.org
IN MX 50 mail.hypernet.uk
...
Поле IN означает, что данный адрес или имя хоста записаны в Internet-нотации. Видим, что данному имени в Сети соответствует IP-адрес 195.195.195.195 (запись A). Для доставки почты можно использовать любой из пяти серверов (записи MX). Перед их именем указана числовая метка приоритета. Чем меньше число, тем выше приоритет у данного хоста и тем больше вероятность, что почта будет доставлена надежно и быстро через данный хост. По умолчанию Sendmail использует наивысший приоритет, и для нашего примера это будет relay1.mailserv.com с наименьшей из предложенных меткой 10. Метки приоритета могут изменятся динамически, в зависимости от загруженности узла.
Часто не существует записи A для доменного имени, зато существует запись MX. В этом случае можно с большой уверенностью сказать, что для доставки на конечную машину используется протокол UUCP:
...
mailserver.org IN MX 10 uucp-gw1.mailserv.com
IN MX 20 uucp-gw2.mailserv.com
...
В этом случае почта поступает на шлюз (uucp-gw1.mailserv.com), который имеет UUCP-соединение с хостом адресата, и знает как осуществить передачу к этому хосту. Такой способ доставки используется для организаций, не имеющих on-line доступа к Internet.
Для извлечения информации из DNS используется утилита nslookup. Она позволяет отображать IP-адреса в доменные и наоборот и выводить информацию о записях:
- A - обычная запись, для преобразования IP-адрес <-> Доменный адрес;
- CNAME - каноническое имя хоста;
- MX - содержит адрес принимающего почту хоста.
Пример использования nslookup:
$ nslookup -type=MX icmm.ru ns.icmm.ru
Server: relay.icmm.ru
Address: 195.19.188.67
icmm.ru preference = 100, mail exchanger = serv1.pstu.ac.ru
icmm.ru preference = 10, mail exchanger = relay.icmm.ru
icmm.ru preference = 20, mail exchanger = m2.icmm.ru
icmm.ru preference = 40, mail exchanger = m3.icmm.ru
icmm.ru nameserver = ns.icmm.ru
icmm.ru nameserver = ns.ural.ru
icmm.ru nameserver = ns.ccl.ru
icmm.ru nameserver = ns.uran.ru
serv1.pstu.ac.ru internet address = 195.19.160.1
relay.icmm.ru internet address = 195.19.188.67
m2.icmm.ru internet address = 195.19.188.67
m3.icmm.ru internet address = 195.19.188.67
ns.icmm.ru internet address = 195.19.188.67
ns.ural.ru internet address = 195.64.192.35
ns.ccl.ru internet address = 195.222.130.67
ns.uran.ru internet address = 195.19.137.69
Для задания типа записи используется ключ -type. Второй аргумент -- ключ для поиск в базе (icmm.ru). Последний параметр (ns.icmm.ru) указывает программе какой сервер имен использовать при данном поиске.
При использовании адреса типа user@[IP-адрес_хоста] sendmail пробует соединиться с SMTP-сервером, расположенном на хосте с указанным IP-адресом. В этом случае подразумевается, что сам SMTP-сервер должен знать как доставить почту для пользователя user.
Содержание