Содержание |
Система электронной почты состоит из многих компонентов. Они могут быть выполнены в виде одной или нескольких программ.
На рисунке представлены основные компоненты:
Если брать в качестве примера Microsoft Exchange, то большинство компонентов являются частью этой программы, т.е. находятся внутри программы. В большинстве реализаций системы электронной почты в UNIX принято каждый из компонентов делать в виде нескольких программ. В результате мы получаем большую свободу выбора. Вы можете комбинировать различные компоненты от разных производителей и получать почтовый сервер, настроенный под ваши конкретные задачи.
Например, в качестве MTA можно использовать sendmail или postfix. А для доставки сообщений в почтовые ящики mail.local или procmail.
При помощи пользовательских агентов пользователи составляют и отправляют письма. Агент должен сформировать тело письма согласно стандарта, и передать его на отправку транспортному агенту или агенту подачи.
В роли пользовательских агентов выступают такие программы как: The Bat, Outlook и Outlook Express. Если говорить про Linux: Evolution, KMail, pine и др.
При передаче письма транспортному агенту и агенту подачи используется протокол SMTP.
Транспортный агент (mail transport agent) выполняет две основные задачи:
При приеме почты от пользователя он должен проверить правильность адреса назначения, возможность доставки почты и доставить почту по назначению.
На другой стороне транспортный агент проверяет:
После всех проверок он принимает письмо и передает его Агенту доставки почты.
В мире UNIX существует большое количество программ, реализующих функции транспортного агента. Среди наиболее популярных бесплатных реализаций транспортных агентов можно выделить sendmail, postfix, exim и qmail. Каждая из программ имеет свои достоинства и недостатки.
Агенты подачи сообщений (Message Submission Agemt — MSA) — это одна из разновидностей режима работы транспортного агента.
В идеале, в системе электронной почты должно быть разделение функций:
Сейчас все эти функции лежат на MTA (25 порт). MSA (587 порт) был придуман как раз для второй задачи — прием почты от своих пользователей. Таким образом, можно было попытаться ввести элементарные антиспамерские приемы. Но для того что бы эта защита заработала, на всех серверах электронной почты должны перейти на прием почты от локальных клиентов при помощи MSA. Этого к сожалению не случилось.
При помощи агента подачи сообщений пытаются разделить две составных части обработки почтовых сообщений: прием сообщения от клиента и его маршрутизацию (доставку). Это позволяет облегчить разработку программ для обработки электронной почты. Агент подачи сообщений:
Агент подачи слушает запросы на 587 порту, поэтому все пользовательские агенты необходимо сконфигурировать таким образом, чтобы они отправляли почту на этот порт.
Все особенности работы агента подачи описаны в RFC 2476.
Существует много различных способов хранении почты в почтовых ящиках. Это может быть один файл на пользователя, в котором лежит вся его почта. Это может быть директория, в которой каждое письмо представлено в виде отдельного файла. Это может быть база данных.
Транспортные агенты, после того как они принимают письмо для пользователя, должны как то поместить его в почтовый ящик. Авторы программ (MTA) не обязаны предусматривать все возможные способы и форматы хранения писем. Поэтому был введен промежуточный слой программного обеспечения, берущий на себя обслуживание почтовых ящиков. Один из компонентов этого программного обеспечения — Агенты доставки почты.
Транспортный агент передает письмо агенту доставки (обычно по протоколу LMTP), а уж Агент доставки сам решает, как и где сохранить письмо пользователя.
В качестве агента доставки может выступать простейшая программа, которая просто складывает почту в ящик. Так и программы фильтры, которые могут что либо сделать с почтой, перед тем как поместить ее в почтовый ящик.
Еще одна часть программного обеспечения, работающего с почтовыми ящиками пользователей — это Агенты доступа.
Агенты доступа позволяют пользователю получить доступ к своему почтовому ящику. Что конкретно может делать пользователь со своей почтой определяется тем, какой протокол доступа он будет использовать.
Например, протокол pop3 позволяет только проверять есть ли почта в ящике, забирать ее и удалять из почтового ящика. Это наиболее простой протокол доступа к ящику. Программы реализующие его не сильно нагружают сервера.
Протокол imap так же позволяет пользователю создавать дополнительные папки на сервере, перемещать сообщения между ними. Программы реализующие доступ по imap протоколу обычно требуют большее количество серверных ресурсов.
Если пользователь работает непосредственно на машине, где находится его почтовый ящик. То он может получить непосредственный доступ к файлам со своей почтой. И ему не требуется использовать протоколы доступа. Но в большинстве случаев пользователь не сможет напрямую обратиться к файлам с почтой, поэтому все же лучше пользоваться Агентом доступа.
В качестве основного протокола взаимодействия в системе электронной почты используются протоколы SMTP (Simple Mail Transfer Protocol) и ESMTP (Extended SMTP). Они описаны в RFC 2821, RFC 1869, RFC 1870, RFC 1891 и RFC 1985.
Протокол SMTP задумывался как простой протокол взаимодействия, при помощи которого пользователь мог напрямую общаться с почтовым транспортным агентом. Конечно же, сейчас пользователи сами не работают с транспортными агентами. Для облечения работы используются пользовательские агенты. Но они (пользовательские агенты) для взаимодействия с транспортными агентами используют протокол SMTP или ESMTP.
В качестве примера можно показать, как пользователь при помощи программы telnet может подключиться к транспортному агенту и отправить письмо.
Пользователь, при помощи транспортного агента может только отправлять письма. Прием почты происходит при помощи агентов доступа.
Для подключения к почтовому транспортному агенту использовалась программа telnet, с явным указанием порта — 25.
$ telnet localhost 25 Trying 127.0.0.1... Connected to localhost.localdomain (127.0.0.1). Escape character is '^]'. 220 Artur ESMTP mail server
В начале сеанса необходимо представиться.
EHLO artur 250-localhost Hello localhost [127.0.0.1], pleased to meet you 250-ENHANCEDSTATUSCODES 250-PIPELINING 250-8BITMIME 250-SIZE 250-DSN 250-ETRN 250-AUTH DIGEST-MD5 CRAM-MD5 250-STARTTLS 250-DELIVERBY 250 HELP
Команда HELO предназначена для представления клиента серверу. В качестве аргумента используется имя клиента. Имеется в виду не имя пользователя, а имя машины-клиента системы электронной почты (MUA).
EHLO — это расширенный вариант приветствия.
В качестве ответа, сервер должен вернуть 250 (подробнее о кодах ответов смотрите ниже). Заодно, мы можем узнать, какие технологии поддерживает SMTP сервер.
После представления друг другу, мы должны дать команду MAIL. Эта команда означает начало транзакции -- начало почтовой сессии.
В качестве аргумента вы должны указать email пользователя отправляющего письмо. Email необходимо поместить в угловые скобки.
MAIL FROM: <artur@kryukov.biz> 250 2.1.0 artur@kryukov.biz... Sender ok
Если почтовый сервер согласен принять письмо от указанного пользователя, выдается сообщение с подтверждением.
При помощи команды RCPT мы указываем почтовый ящик получателя. В самом простом варианте это может выглядеть так:
rcpt to: <artur@kryukov.biz> 250 2.1.5 artur@kryukov.biz... Recipient ok
Можно указать несколько адресов назначения в одной команде.
rcpt to: <artur@kryukov.biz,any@body.com>
Или дать несколько команд RCPT.
Так же в этой команде можно указать маршрут, по которому необходимо доставить письмо.
rcpt to: <@bk.ru:artur@kryukov.biz>
В этом примере показано, что письмо для отправки следует доставить на сервер bk.ru. А тот в свою очередь должен передать его по адресу artur@kryukov.biz. Но вы должны понимать, что на сервере bk.ru может быть запрещена ретрансляция, в этом случае он вернет сообщение об ошибке. Адреса с включенными маршрутами сейчас большая редкость.
Команда DATA определяет начало передачи данных. Получатель в ответ выдает оклик 354 и все остальные строки, пришедшие от клиента, трактует как почтовые данные. Данные должны включать только печатаемые символы. Данные должны завершаться строкой, в начале которой стоит символ точка.
DATA 354 Enter mail, end with "." on a line by itself Hello user I'm send a letter for you ^) Regards, Artur . 250 2.0.0 m7MEn569008029 Message accepted for delivery
После того, как мы ввели точку, сообщение было принято на доставку.
После передачи данных, необходимо дать команду QUIT.
quit 221 2.0.0 cosmos.kryukov.biz closing connection Connection closed by foreign host.
Как видно из приведенного примера, в самом простом случае, транспортному агенту для доставки почты необходимо указать два параметра: адрес отправителя и адрес получателя, а также тело письма
Отклики на запросы служат для синхронизации действий клиента и сервера SMTP. На каждую команду должен генерироваться единственный отклик. В данном случае имеется ввиду — единственный номер отклика.
Отклик SMTP содержит трехзначный номер, за которым обычно следует строка текста. Числовые коды предназначены для автоматической обработки, текст для человека.
Отклик состоит из трех цифр.
| Код | Описание |
|---|---|
| 500 | Ошибка в синтаксисе, команда не опознана. |
| 501 | Ошибка в синтаксисе параметров. |
| 502 | Команда не поддерживается. |
| 503 | Неправильная последовательность команд. |
| 504 | Параметр команды не поддерживается. |
| Код | Описание |
|---|---|
| 211 | Состояние системы или помощь. |
| 214 | Сообщение-справка. |
| Код | Описание |
|---|---|
| 220 | Служба готова. |
| 221 | Служба закрывает канал передачи. |
| 421 | Служба недоступна |
| Код | Описание |
|---|---|
| 250 | Запрошенное действие выполнено успешно (ОК). |
| 251 | Пользователь не является локальным, сообщение будет переслано по <путь-пересылки> |
| 354 | Начать ввод сообщения: закончить по <CRLF>.<CRLF> |
| 450 | Запрошенное действие не выполнено — почтовый ящик недоступен. |
| 451 | Запрошенное действие отвергнуто — ошибка обработки. |
| 452 | Запрошенное действие не выполнено — в системе недостаточно дискового пространства. |
| 550 | Запрошенное действие не выполнено — почтовый ящик недоступен. |
| 551 | Пользователь не является локальным, попробуйте переслать сообщение по <путь-пересылки>. |
| 552 | Запрошенное действие отвергнуто — превышены допустимые пределы хранения. |
| 553 | Запрошенное действие не выполнено — указано недопустимое имя почтового ящика. |
| 554 | Операция прекращена. |