Обработка почты с помощью DelphiИсточник: delphisources Анатолий Орлов
Часто бывает необходимо обработать почтовые сообщения от пользователей. Например, занести заказчика товара в базу данных или высказывания клиентов о вашей фирме (своеобразная книга жалоб и предложений). Это можно сделать вручную, читать каждое сообщение, копировать, перезаписывать, … Но если к вам ежедневно обращаются сотни или даже тысячи клиентов? Нужно будет нанять нового сотрудника или самостоятельно просматривать всю почту. Конечно, можно написать скрипт на Perl"е, который будет обрабатывать данные, введенные пользователем через форму на вашем сайте. Однако если у вас нет собственной странички или вы не хотите хранить конфиденциальную информацию в базе данных на сервере - нужно приложение под Windows, которое будет находиться на локальном компьютере и заходя в Интернет обрабатывать почту. После этого вы можете делать с содержимым письма что угодно: сохранить его, переслать на другой почтовый ящик, занести в базу, … Также можно создать почтовый фильтр, который будет группировать письма по темам. Так можно избавиться от ненужного спама. Например, если вы на почтовый ящик должны получать только резюме от соискателей работы, можно удалять все письма, тема которых отлична от "резюме" или "работа". Мне приходилось разрабатывать программу, которая получает данные на e-mail, заполненные пользователем через форму на сервере. После этого она анализирует эти данные и заносит их в базу на локальном компьютере. Анализ происходит по заголовку и имени поля формы. Если заголовок письма совпадает с заголовком, записанном в настроиках программы, то после этого осуществляется разбор письма. Письмо после заполнения формы имело следующую структуру: Приложение обрабатывало значения полей и записывало их в базу данных ACCESS, где поля имели те же имена, что и у формы. Таким образом данные хранились на компьютере в офисе и были скрыты от Интернет - хакеров. Такое приложение можно написать практически на любом, имеющимся у вас языке. Я предлагаю вам рассмотреть такое приложение на Delphi и обсудить принципы работы программы. Для работы с протоколами Internet в Delphi на палитре компонентов предназначен раздел FastNet. FastNet
Для приема почты нам понадобится протокол POP3 (Post Office Protocol - Version3) для этого протокола зарезервирован 110 порт, соответствующий ему компонент в разделе FastNet - NMPOP3. Принцип общения с сервером по протоколу POP3 состоит из трех этапов: установления соединения (аунтификация), чтения списка писем и выбор нужного письма, прекращение соединения. Работу с сервером по протоколу необходимо знать, так как он предоставляет широкие возможности не только для программистов, но и для пользователей. Мне много раз приходили письма неимоверного размера, с большим колличеством картинок. После десяти минут работы Outlook Express просто зависал. Приходилось удалять почту, ведя диалог с сервером по POP3, присоединившись к нему через telnet к 110 порту. Создадим новое приложение. Добавим в него компонент 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); После прочтения письма, может возникнуть необходимость очистить ящик от него, чтобы было больше мест для последущих посланий. Это легко сделать, используя процедуру DeleteMailMessage(Number: intger), где Number - это номер письма. Процедура помечает письмо, как не нужное и после разъединения с сервером оно удаляется. Будте осторожнее с этой функцией, после удаления письма, вы его больше не востановите. Для снятия пометки, если вы вдруг передумали удалять писмо, служит метод NMPOP31.Reset. Программу можно модернизировать, создать так называемого "робота". Установить на форму компонент Taimer, выставить время срабатывания через каждые n минут и связать его с событием нажатия на кнопку. И наша программа, работая в фоне, самостоятельно будет каждые n минуть проверять почту, регистрировать все изменения. From: "Test И другие поля, о которых подробнее можно прочитать в документации RFC 822. User: From: "Test В конце ссесии мы должны набрать команду quit. |