Статьи о почте

Новости

Все новости

Разное в мире IT

Все заметки

mailinfo.ru - Статьи о почте

E-mail под микроскопом

Прислал(а) Вячеслав ЯКОВЕНКО [19 августа 2002]

раздел: [Разное]

Впервые опубликовано в журнале "Компьютеры+Программы"
Домашняя страничка автора

Будучи современным средством общения, электронная почта, тем не менее, имеет целый ряд атавизмов, которые не только затрудняют работу, но могут доставить вам головную боль. Чтобы все это не мешало вам спокойно жить, необходимо хорошо понимать, что происходит внутри E-mail.

Какие электронные средства связи вы используете дома и в офисе? -- E-mail, ICQ, AOL Instant Messenger? Каждое из них обладает своими достоинствами и недостатками, но факт, что чаще всего для серьезного общения с внешним миром мы используем E-mail. По статистике ежедневный трафик сообщений переваливает за 10 миллиардов сообщений в день. При этом по данным Society for Human Resource Management (SHRM) 34% профессионалов предпочитают получать резюме по электронной почте и только 2% -- по обычной. Своими корнями E-mail уходит в Unix, где она зарождалась и развивается по сей день. Будучи современным средством общения, электронная почта, тем не менее, имеет целый ряд атавизмов, которые не только затрудняют работу, но могут доставить вам головную боль. Чтобы все это не мешало вам спокойно жить -- необходимо хорошо понимать, что происходит внутри E-mail. Этим мы и займемся.

Основы

E-mail -- это комплекс приложений, работающих в архитектуре Клиент -- Сервер. В данном случае это значит, что Клиент (в качестве которого выступает почтовое приложение, например, The Bat, MS Outlook Express и т. п. и т. д.) отвечает за подключение к серверу, формирование, отправку и получение почты. В свою очередь Сервер -- за принятие сообщений и достоверную доставку их адресату. Схема взаимодействия Клиента и Серверов приведена на рис. 1. Но прежде, чем мы перейдем к ней -- небольшое отступление.

Знаете ли вы, что браузер каждый раз, когда вы набираете адресную строку вида: www.comizdat.com, превращает ее во внутренний формат вот такого содержания http://www.comizdat.com/index.html:80? Давайте рассмотрим добавленный префикс и суффикс: http:// -- определят протокол, согласно которому будет происходить передача данных (в данном случае это HTTP -- Hyper Text Transfer Protocol), а index.html:80 -- имя файла, который будет загружен по умолчанию, и номер порта. Что это за порт, можете спросить вы? Порт -- является очень важным параметром для установления связи в TCP/IP сетях. Его номер определен документом RFC1700 “Assigned Numbers” [1, Стр. 401]. Серверное приложение «слушает» порт и при поступлении запроса от Клиента устанавливает сокетное соединение -- канал для передачи информации. HTTP протокол, предназначенный в основном для передачи веб-страниц, осуществляет и прием, и передачу информации через 80-й порт.

Схема взаимодействия Клиента 
      и Серверов
Рис. 1. Схема взаимодействия Клиента и Серверов

С электронной почтой ситуация несколько сложнее: отправка сообщений осуществляется по протоколу SMTP (Simple Mail Transfer Protocol, RFC821, 25-й порт), а прием по протоколу POP3 (Post Office Protocol -- Version 3, RFC1939, 110-й порт). Это подразумевает, что обработку приема и передачи сообщений выполняют разные процессы. Более того, они могут быть разнесены на разные физические системы.

Хотя номера портов и определены стандартом, в некоторых случаях они могут быть изменены администратором сервера на свободный номер. Именно поэтому почтовые клиенты предусматривают переопределение этих параметров (так, например в MS Outlook Express, чтобы переопределить их необходимо из меню «Сервис» выбрать пункт «Учетные записи», затем в появившемся диалоге указать редактируемую запись, далее кнопка «Свойства», и на странице «Дополнительно» указать номера портов).

Подобная схема взаимодействия вашего почтового клиента с Серверами имеет много преимуществ, например, позволяя, отправлять сообщения с одного ящика, а получать из нескольких совершенно разных.

Формат электронного письма

Полностью описать формат электронного письма в рамках одной статьи просто невозможно, поэтому я остановлюсь только на основных моментах. За время своего существования он претерпел множество изменений и в настоящий момент необходимо, чтобы почтовый клиент поддерживал стандарт MIME (Multipurpose Internet Mail Extension -- RFC1521), который определяет, каким образом в тело письма можно заключать дополнительную информацию в виде вложенных файлов.

Письмо можно условно разделить на две основные части (рис. 2): заголовок письма (header) и тело письма (body). Заголовок содержит информацию о том, кто является отправителем письма, кто получателем, тему и множество служебных записей о прохождении через почтовые серверы по пути к адресату. А также тип кодировки и кодовую страницу, в которой написано письмо.

Основные части электронного 
      письма
Рис. 2. Основные части электронного письма

Самая главная неприятность заключается в том, что все тело письма должно состоять из элементов семибитной таблицы символов ASCII. То есть из символов в пределах от 0- до 127-го символа, а это означает, что о символах русского языка, так же как и о символах немецкого, болгарского или любого, отличного от английского, языка, приходится забыть. Вы можете удивиться ранее, т. к. ежедневно отправляете письма на родном языке. Однако ничего в этом утверждении противоестественного нет, просто каждый символ национального языка, находящийся в письме, перекодируется в формат, не содержащий 8-го бита. Существует несколько вариантов перекодировки: “Base64” и “quoted-printable”. “Base64” чаще всего используется для кодирования файлов, вложенных внутрь письма, “quoted-printable” -- для кодирования текста самого письма. Есть еще и вариант “8bit” -- в этом случае все национальные символы передаются в своем естественном виде. Безусловно, это самый оптимальный вариант, однако, он опускает ограничения стандарта и, таким образом, несовместим с более ранними версиями почтовых клиентов.

Если вы используете в своей работе MS Outlook Express 5.0, то настроить кодирование можно следующим образом: из меню «Сервис» надо выбрать пункт «Параметры…», а затем перейти на страницу «Отправка сообщений» и нажать на кнопку «Настройка HTML…» или «Настройка обычного текста…». В появившемся окне (см. рис. 3) вы можете выбрать тип кодировки и разрешить/запретить использование 8-и битовых знаков.

Настройка кодирования 
      символов письма
Рис. 3. Настройка кодирования символов письма

Особое внимание я хочу обратить на алгоритм кодирования “quoted-printable”, так как именно он будет использоваться вами в том случае, когда вы не знаете, какое ПО установлено у получателя письма (что и бывает чаще всего). Так, например слово «НОВОСТИ» в этой кодировке будет выглядеть вот так «=EE=EF=F7=EF=F3=F4=E9». В этом случае каждый символ национального алфавита будет представлен в виде шестнадцатиричного числа с лидирующим знаком “=”, т. е. каждый символ теперь представляется тремя, что соответственно увеличивает размер русскоязычной части письма в три раза. Важным моментом в этом примере является и то, что представление символа будет различным в зависимости от используемой кодовой страницы. Например, русская буква «Я» будет выглядеть так: в кодовой странице «Cp1251» -- “=DF”, в «Cp866» -- “=9F”, в «koi8-r» -- “=F1”. Сама кодовая страница указывается в заголовке письма. При этом только «koi8-r» имеет повсеместную поддержку, письма в остальных кодировках могут быть недоступны некоторым пользователям Unix и Mac-подобных систем, не имеющим соответствующей поддержки этих кодовых страниц.

Идем дальше, тело письма может в свою очередь состоять из частей (parts). В этом случае в заголовке письма может значиться: «Content-Type: multipart/alternative;», тогда структура тела письма будет такой, как на рис. 4. Чаще всего вы даже можете не подозревать, что используете такую архитектуру. Например, Outlook Express создает ее по умолчанию каждый раз, когда вы отправляете письмо: первая часть в формате “text/plain”, вторая -- “text/html”. Причем текст вашего письма попадает в обе части, но если первый раз просто сплошным текстом, то во второй -- совместно с HTML тегами. Естественно это приводит к увеличению объема письма, как минимум, на 150%. Почтовый клиент в свою очередь решает сам (в зависимости от настроек или от возможностей), какую из этих составляющих предоставить вам.

Настройка кодирования символов письма

Структура письма с 
      несколькими частями
Рис. 4. Структура письма с несколькими частями

Представьте себе теперь, что вы отправили письмо из нескольких десятков страниц пользователю, у которого модемное соединение с провайдером через аналоговую АТС, да еще и модем поддерживает скорость до 14400 бит/с -- не думаю, что он сильно обрадуется. Как выйти из этой ситуации? На самом деле не сложно -- достаточно в адресной книге в свойствах записи на странице «Имя» (дальнейшее справедливо для версии 5.00.ХХ) включить опцию «Отправлять почту только в виде простого текста» (см. рис. 5).

Отправка почты только в виде 
      простого текста
Рис. 5. Отправка почты только в виде простого текста

Та же ситуация повторяется, когда вместе с письмом отправке подлежит какой-нибудь файл. Если вы отправляете документ, созданный в среде MS Office (DOC, XLS –файлы и т. д.), то должны помнить, что кроме самой информации они содержат еще и данные о форматировании документа, которые могут в несколько раз превышать объем полезной. Таким образом будет нелишним перед отправкой файлов взглянуть на их суммарный размер, и если он превышает 100 Кб, заархивировать их.

Доставка почты

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

Вы можете опробовать все этапы, не прибегая к услугам почтового клиента (в котором все они скрыты от глаз пользователя), а используя любой инструмент для работы с TCP/IP соединениями, например telnet.

Соединение

Этот этап подразумевает установление сокетного соединения с сервером и в случае положительного результата, получение вами приветствия от сервера. После чего процесс входит в режим авторизации.

Запустите telnet.exe (он находится в каталоге Windows, например, c:windowstelnet.exe). Затем из пункта меню «Терминал» выберете пункт «Параметры…» и в появившемся окне включите опцию «Отображение ввода», чтобы вы видели ту информацию, которую набираете. Теперь переходим к соединению, для этого из меню «Подключить» выбираем «Удаленная система», и в появившемся окне указываем параметры подключения к вашему почтовому ящику. На рис. 6 я привожу параметры для подключения к mail.ru, а вы можете попробовать сделать то же самое, но для своего почтового ящика. Только не забывайте, что имя узла может не совпадать с адресом вашего ящика, например, если адрес ящика -- login@narod.ru, то имя узла -- pop3.narod.ru.

Параметры telnet подключения 
      к mail.ru
Рис. 6. Параметры telnet подключения к mail.ru

После введения данных нажимаем кнопку «Подключить» (к этому моменту у вас уже должно быть установлено соединение с провайдером). Если в окне терминала вы увидите, что-то наподобие:

+OK WinRoute Pro 4.1.25 POP3 server ready <4291137939.996481967@unspecified.host>

Значит соединение установлено, о чем говорит “+OK” в начале ответа. И POP3 сервер готов перейти к авторизации. В дальнейшем все ответы сервера делятся на положительные (“+OK”) и отрицательные (“-ERR”).

Обратите внимание на часть ответа сервера <4291137939.996481967@unspecified.host>, называемую timestamp, она понадобится нам при авторизации.

Авторизация

Авторизацию можно производить двумя методами: открытым, используя команды USER, PASS, и защищенным -- командой APOP. В первом случае вывод будет приблизительно такой:

USER testlogin

+OK please send PASS command

PASS testpass

+OK 2 messages (4665 octets)

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

Второй метод намного надежнее и принцип его работы следующий. Помните timestamp описанный ранее? При каждом подключении к серверу вы получаете совершенно разный timestamp, состоящий из текущего времени на сервере, идентификатора процесса, с которым у вас установлено сокетное соединение, и имени узла. Дальше ваши действия должны быть следующими, вы должны произвести конкатенацию строк timestamp и пароля и от результирующей строки получить 16-ти байтный Message Digest по протоколу MD5 (RFC 1321), преобразовать его в строку и отправить вместе с именем пользователя на сервер. Подобные математические преобразования достаточно сложно выполнить вручную, и самое главное, что в «эфир» попадет не сам пароль, а его хэш-код. MD5 является уникальным для каждой строки и из него практически невозможно получить оригинал. Подробнее см. документацию к команде APOP.

Обработка данных

После удачной авторизации сервер переходит в состояние ожидания команд пользователя (STAT, LIST, RETR, DELE, RSET, QUIT полный список поддерживаемых команд доступен в RFC1725). Так, например, с помощью команды LIST вы можете посмотреть информацию о размере каждого сообщения, как показано далее.

LIST

+OK scan listing follows

1 2265

2 2400

А с помощью RETR N -- вывести содержимое письма на экран. Только помните, что русские символы вы вряд ли увидите по причинам, указанным ранее.

Отсоединение

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

В заключение хочу порекомендовать всем, заинтересовавшимся методами отправки и получения почты, статью Дмитрия Рамодина, в которой рассказывается, как на Java написать почтовый клиент своими руками. Статья доступна по ссылке: http://www.javable.com/docs/jav_mail .

Литература

1. Андрей Робачевский. Операционная система UNIX.-- СПб.: BHV, 1997.—528 с.

2. Дмитрий Рамодин. Почтовая программа -- своими руками! -- http://www.javable.com/docs/jav_mail

3. Все RFC документы доступны с узла http://www.rfc.net