Звезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активна
 

 <- назад к содержанию

Системы почтовой рассылки (программа sendmail)

 

 

В данном разделе описывается система почтовой рассылки или агент передачи почты (Message Transfer Agent, MTA). Здесь под sendmail подразумевается любая программа, предоставляющая интерфейс для рассылки почты, реализующая протоколы SMTP, UUCP и т.д. В Windows такими программами являются Microsoft Exchenge, Netscape Messaging Server, MDaemon и др. Для Unix систем -- это Sendmail, Exim, RSMTP и др. Т.к. первенство в Internet вообще и в частности Internet-почте принадлежит Unix, то рассмотрим самую популярную программу для этой платформы -- Sendmail.

Основным средством рассылки почты в Internet является программа sendmail. Она обеспечивает работу модульной системы рассылки, которая предназначена для получения и отправки корреспонденции, а также управления программами подготовки и просмотра почтовых сообщений. Sendmail позволяет организовать почтовую службу локальной сети и обмениваться почтой с другими серверами почтовых служб через специальные шлюзы. Sendmail может быть сконфигурирована для работы с различными почтовыми протоколами. Обычно это протоколы UUCP (Unix-Unix-CoPy) и SMTP (Simple Mail Transfer Protocol).

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

Первые являются стандартными адресами Internet и фактически являются стандартом де-факто. Именно этот адрес обычно указан на визитных карточках.

Sendmail можно настроить для поддержки:

  • списка адресов-синонимов;
  • списка адресов рассылки пользователя;
  • автоматической рассылки почты через шлюзы;
  • поддержки очередей сообщений для повторной рассылки почты в случае отказов при рассылке;
  • работы в качестве SMTP-сервера;
  • доступа к адресам машин через сервер доменных имен BIND;
  • для доступа к внешним серверам имен.

  Принцип работы программы sendmail

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

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

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

Тело сообщения. Первая пустая строка в файле почтового сообщения отделяет заголовок от тела сообщения. Все, что следует после этой строки, называется телом сообщения и передается по почте без изменений.

Sendmail может быть вызвана:

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

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

  • адреса отправителя и получателя преобразуются в формат сети-получателя почты;
  • если необходимо, то в заголовок сообщения добавляются строки, позволяющие получателю отвечать на принятое сообщение (например: FROM: <адрес>);
  • почта передается одной из программ рассылки почты.

На рисунке 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
Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.
User@alias
Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.
user@{local.host.internet.address}
localhost!user
localhost!localhost!user
Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.

Местный адрес - это адрес, который распознается как адрес на машине, с которой осуществляется отправка почты.

Адреса UUCP имеют вид:

Host!user
Host!host!user
Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.

Если машина, с которой отправляется почта, имеет прямую линию связи по протоколу UUCP со следующей машиной (в адресе), то почта передается на эту машину, если такого соединения нет, то почта не рассылается и выдается сообщение об ошибке. Файл конфигурации должен содержать детальное описание маршрутов для пересылки сообщений на машины по протоколу UUCP.

Адреса SMTP - это адреса, описанные в стандарте RFC-822 или стандартные адреса Internet. Эти адреса имеют вид:

Usr@host

Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.

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

 Преобразование доменного имени получателя в IP-адрес почтового сервера.

 Как было отмечено ранее, если хост получателя подключен к Internet (достижим через TCP-соединение), то используется протокол SMTP для доставки почты. Что это значит "достижим"? Это значит, что в DNS имеется запись, относящаяся к данному хосту. Такая запись называется MX (Mail eXchenge -- рассылка почты). Т.к. SMTP работает поверх TCP протокола, то данный алгоритм трансляции применим только к почтовым адресам имеющим Internet-формат.

Допустим, Вы хотите отправить почту на адрес Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.. После подготовки сообщения и его сборки (первая стадия рассылки) sendmail анализирует адрес получателя на предмет соответствия формату. Далее, отсекаются имя пользователя и знак "@". Для нашего примера получим mailserver.org.

Данное имя ищется в DNS с записью MX. Для этого используется специальный протокол прикладного уровня, который реализует службу DNS (Domain Name Service). DNS служит не только для трансляции имени хоста в IP-адрес (и наоборот), но и для определения адреса хоста, который отвечает за доставку почты к нужному нам пользователю (Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.). Это может быть хост, на котором находится почтовый ящик для Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript. , а может быть промежуточный хост -- релей-хост (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.


 

 

 

 

©1997- 2024 Масич Григорий Фёдорович
Email: masich@icmm.ru
Адрес: 614061, Пермь, ул. Академика Королева, 1, ИМСС УрО РАН
Тел: +7 (342) 2-378-376