PHP: Web-почта своими руками
Никита Кислицин
Xakep, номер #059, стр. 059-098-2
Однако тупо использовать чужие решения тоже не годится - поэтому я все же расскажу тебе, как работают все используемые классы. Класс pop3 имеет несколько внешних свойств и методов. Набор свойств стандартен: имя сервера и порт, на котором висит демон. Что касается методов, то и тут нас ждет полная реализация протокола pop3 - класс позволяет осуществлять как обычную открытую, так и защищенную APOP-аутентификацию. Метод Statistics посылает стандартную команду STAT и, обрабатывая результаты, модифицирует два параметра: число сообщений и общий вес корреспонденции. ListMessages при помощи команды LIST получает список сообщений и помещает их в возвращаемый процедурой массив. Метод RetrieveMessage принимает несколько параметров и, в зависимости от них, возвращает либо целиком письмо, либо несколько его строк. Также реализованы методы DeleteMessage, ResetDeletedMessages, Close и IssueNOOP. Что делают первые два понятно из названия, предпоследний же закрывает соединение командой QUIT (это важно, поскольку помеченные для удаления сообщения физически сотрутся только после завершения сессии), а IssueNOOP служит для подтверждения того, что соединение все еще нужно - по дефолту после 10 минут бездействия клиента, сервер автоматически разрывает соединение.
Класс smtp_mail имеет много внутренних функций, большая часть которых производит корректную обработку посылаемых и получаемых данных - подгоняет под 788-ю РФЦ посылаемые серверу строки (в этом документе в качестве конца строки определена последовательность символов CRLF - \r\n, что равно 0x13 0x10 в шестнадцатеричном представлении). Снаружи доступен лишь один метод send_e-mail (hostname, from, to, data). Он, используя описанные выше функции, посылает почту.
Скручиваем все в одну систему
Теперь, когда ты знаешь, как работать с классами, можно приступить и к созданию самой системы. Прежде всего следует создать несколько таблиц mysql - в них мы будем хранить информацию об обслуживаемых почтовых серверах, а также входящую и исходящую корреспонденцию.
Для защиты системы от несанкционированного доступа пользователей будем использовать функции аутентификации, которые писали уже не раз (имеются в виду локальные, а не почтовые пользователи). Т.е. один пользователь системы может иметь множество обслуживаемых аккаунтов, доступ к которым регулируется различными паролями. Вот спецификации создаваемых таблиц:
>create table inbox(mid int not null primary key auto_increment,
to varchar(50), from varchar(50),
subject varchar(50), size int,
date date, text text);
>create table outbox(mid int not null primary key auto_increment,