Обработка почты с помощью Delphi

Источник: delphisources
Анатолий Орлов

Часто бывает необходимо обработать почтовые сообщения от пользователей. Например, занести заказчика товара в базу данных или высказывания клиентов о вашей фирме (своеобразная книга жалоб и предложений). Это можно сделать вручную, читать каждое сообщение, копировать, перезаписывать, … Но если к вам ежедневно обращаются сотни или даже тысячи клиентов? Нужно будет нанять нового сотрудника или самостоятельно просматривать всю почту. Конечно, можно написать скрипт на Perl"е, который будет обрабатывать данные, введенные пользователем через форму на вашем сайте. Однако если у вас нет собственной странички или вы не хотите хранить конфиденциальную информацию в базе данных на сервере - нужно приложение под Windows, которое будет находиться на локальном компьютере и заходя в Интернет обрабатывать почту. После этого вы можете делать с содержимым письма что угодно: сохранить его, переслать на другой почтовый ящик, занести в базу, … Также можно создать почтовый фильтр, который будет группировать письма по темам. Так можно избавиться от ненужного спама. Например, если вы на почтовый ящик должны получать только резюме от соискателей работы, можно удалять все письма, тема которых отлична от "резюме" или "работа". Мне приходилось разрабатывать программу, которая получает данные на e-mail, заполненные пользователем через форму на сервере. После этого она анализирует эти данные и заносит их в базу на локальном компьютере. Анализ происходит по заголовку и имени поля формы. Если заголовок письма совпадает с заголовком, записанном в настроиках программы, то после этого осуществляется разбор письма. Письмо после заполнения формы имело следующую структуру:
имя поля1 формы=значение1
имя поля2 формы=значение2
……………………………….
имя поляN формы=значениеN

Приложение обрабатывало значения полей и записывало их в базу данных ACCESS, где поля имели те же имена, что и у формы. Таким образом данные хранились на компьютере в офисе и были скрыты от Интернет - хакеров.

Такое приложение можно написать практически на любом, имеющимся у вас языке. Я предлагаю вам рассмотреть такое приложение на Delphi и обсудить принципы работы программы. Для работы с протоколами Internet в Delphi на палитре компонентов предназначен раздел FastNet. FastNet

Для приема почты нам понадобится протокол POP3 (Post Office Protocol - Version3) для этого протокола зарезервирован 110 порт, соответствующий ему компонент в разделе FastNet - NMPOP3.
С помощью NMPOP3 можно: соединиться с сервером, послать аунтификационную информацию на сервер, получить информацию о почтовом ящике (колличество писем, размер), получить письма с сервера, удалить письма.

Принцип общения с сервером по протоколу POP3 состоит из трех этапов: установления соединения (аунтификация), чтения списка писем и выбор нужного письма, прекращение соединения. Работу с сервером по протоколу необходимо знать, так как он предоставляет широкие возможности не только для программистов, но и для пользователей. Мне много раз приходили письма неимоверного размера, с большим колличеством картинок. После десяти минут работы Outlook Express просто зависал. Приходилось удалять почту, ведя диалог с сервером по POP3, присоединившись к нему через telnet к 110 порту.
Рассмотрим диалог с сервером по протоколу POP3.
После подключения к почтовому серверу, выдается строка приветствия +OK POP3 server ready. После этого пользователь посылает свой логин, командой USER login и пароль PASS password. Если логин и пароль введены правильно, можно начать просматривать почту.
Командой LIST, можно посмотреть сколько писем к вам пришло и размер писем. Ответ Сервера выглядит следующим образом:
User: LIST
Server: +OK 2 messages (400 octets)
Server: 1 250
Server: 2 150
Данное сообщение гласит о том, что на сервере находится два сообщения объемом в 400 байт, первое сообщение объемом 250 байт, второе -150 байт. Если необходимо посмотреть размер конкретного письма, например пятого необходимо послать серверу команду LIST 5. В результате на терминале появится сообщение Server: +OK 2 200. В том случае, если письмо с таким номером не существует высветится ошибка
Server: -ERR no such message, only 2 messages in maildrop.
Эта ошибка говорит о том, что на сервере находиятся только два письма. Чтобы получить письмо с сервера используют команду RETR m, где m - номер письма. Если письмо слишком длинное, можно прочитать его не полностью, а только первые n - строчек этого письма, это делается командой TOP msg n. Для удаления письма служит команда DEL m. Если письмо удалилось, появится сообщение +OK message 1 deleted, если не существует письма с таким номеров сервер выдасть ошибку -ERR no such message. Закончить обработку почты и выйти из диалога можно командой QUIT. Подробнее протокол описан в документе RFC1081 и RFC 1460.
Для нашего примера вам понадобиться почтовый ящик, получить его в Интернете не составит особой сложности. Возьмем, например, бесплатный почтовый ящик на сервере www.rambler.ru .Сервер исходящий почты на Рамблере mail.rambler.ru (вы легко его можете узнать у администратора сервера или на самом сервере), он нам понадобится для соединения по протоколу POP3. Итак, начнем.

Создадим новое приложение. Добавим в него компонент NMPOP3. По умолчанию он получит в нашем приложение имя NMPOP31, в этом можно убедиться, просмотрев Object Inspector. Это имя мы будем использовать в нашем примере. Вы можете его переименовать для удобства обращения с ним, например назвать его POCHTA. Для соединения с сервером, нам надо вызвать процедуру Connect компонента NMPOP3. Но перед этим мы установим имя сервера, логин и пароль пользователя для аунтификации по протоколу POP3. Сервер задается свойством NMPOP31.Host, логин свойством NMPOP31.UserID, пароль свойством NMPOP31.Password. Имя пользователя и пароль выдается администратором сервера после регистрации. В локальной сети, обычно, вся почта приходит на сервер и только после обращения к нему перенаправляется на рабочие места. Поэтому здесь надо задавать имя сервера (proxy - сервера), который забирает почту и вашу учетную запись (логин и пароль).

После этого можно вызвать метод NMPOP31.Connect. Мы можем посмотреть количество писем на сервере, обратившись к свойству NMPOP31.MailCount. Получим какое - нибудь письмо с сервера, например под номером 1. Для этого вызовем процедуру NMPOP31.GetMailMessage(1). После этого объект TmailMessage содержит информацию о письме. Теперь мы можем проанализировать наше письмо: посмотреть тему письма (NMPOP31.MailMessage.Subject) , почтовый адрес отправителя (NMPOP31.MailMessage.From), прочитать письмо (NMPOP31.MailMessage.Body). Также нам доступны некоторые другие свойства сообщения. С помощью свойства NMPOP31.MailMessage.MessageId, которое имеет тип string просматривается идентификатор письма. Список файлов вложения доступен через свойство NMPOP31.MailMessage.Attachment, это свойства типа TStringList. После прочтения письма нужно разъединиться с сервером, это делается процедурой NMPOP31.Disconnect. Давайте посмотрим, как это все выглядит на нашем примере. Добавим на форму компоненты TEdit, TMemo и TButton. Они получат имена, соответсвенно Edit1, Memo1, Button1. После нажатия кнопки "Получить письмо" в поле Edit1 появится тема первого письма, если на сервере есть письма, а вполе Memo1 - тело письма.

Для этого нам надо запрограммировать кнопку Button1 по следующему алгоритму:

procedure TForm1.Button1Click(Sender: TObject);
begin
NMPOP31.Connect;
NMPOP31.GetMailMessage(1);
Edit1.Text:=NMPOP31.MailMessage.Subject;
Memo1.Lines:=NMPOP31.MailMessage.Body;
NMPOP31.Disconnect;
end;

После прочтения письма, может возникнуть необходимость очистить ящик от него, чтобы было больше мест для последущих посланий. Это легко сделать, используя процедуру DeleteMailMessage(Number: intger), где Number - это номер письма. Процедура помечает письмо, как не нужное и после разъединения с сервером оно удаляется. Будте осторожнее с этой функцией, после удаления письма, вы его больше не востановите. Для снятия пометки, если вы вдруг передумали удалять писмо, служит метод NMPOP31.Reset. Программу можно модернизировать, создать так называемого "робота". Установить на форму компонент Taimer, выставить время срабатывания через каждые n минут и связать его с событием нажатия на кнопку. И наша программа, работая в фоне, самостоятельно будет каждые n минуть проверять почту, регистрировать все изменения.
Вот мы и написали программку для обработки почты. Как вы видете, с помощью Delphi это легко и просто. В разделе FastNet находятся еще много компонентов для работы с протоколами Интернет. Для отправки почты можно использовать компонент NMSMTP, он работает с протоколом SMTP, который подробно расписан в документе RFC 821. С помощью компонента NMSMTP можно организавать свою почтовую рассылку по нескольким адресам, так называемую спам - рекламу. Также можно организавать redirect почты (перенаправление на другой почтовый ящик).
Диалог пользователя с сервером по протоколу SMTP также прост, как и по POP3. После соединения с сервером к 25 TCP порту, клиент посылает команду HELO свое_имя. После чего сервер выдает строку с кодом 250, которая говорит о готовности сервера для работы с вами. Далее мы должны послать команду mail from:, где email - это ваш обратный e-mail адрес. На что сервер опять ответит 250 OK. Далее набираем команду для задания адреса получателя письма rcpt to:email (email - адрес получателя). После этого, набрав команду data можно приступить к вводу заголовка письма и после пустой строки его тела, которое должно заканчиваться двумя символами перевода строки. Тело письма может состоять из следующих полей:

From: "Test" - адрес отправителя
To: "new" - адрес получателя
Subject: Проверка - тема письма
Content-Type: text/html - тип письма

И другие поля, о которых подробнее можно прочитать в документации RFC 822.
С учетом вышеизложенного можно рассмотреть диалог сервера с пользователем после ввода команды data:

User: From: "Test"
User: To: "new"
User: Subject: Проверка
User:
User: Привет! Это тестовое письмо
User: Пока!

В конце ссесии мы должны набрать команду quit.
Если вы хотите программировать для Интернет не только почтовые приложения, то вам помогут компоненты из раздела FastNet, NMFTP - для работы по популярному протоколу FTP (File Transfer Protocol - протокол передачи файлов). Он документирован в RFC 959. С помощью FTP можно закачивать информацию, веб - странички на сервер, а также скачивать программное обеспечение, документация с бесплатных FTP серверов. Компонент TNMFinger предназначен для реализации протокола Finger, который представляет собой адресную книгу в Интернете. По нему вы можете узнать информация об интересующем вас сервере. И конечно же не остался в стороне наиболее используемый протокол в сети Интернет - HTTP (HyperText Transfer Protocol). Протокол для передачи гипер - текста. Его мы ежедневно используем для просмотра страничик во Всемирной паутине WWW. Также стоит уделить внимание разделам Internet Express и Internet в палитре компонентов. В этих разделах находится удобный мини - браузер для просмотра html - страничек, компонент для разбора html - файлов и другие полезные вещи.


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=22757