PHP → Сервис автоактиваций по e-mail

Сен 4, 2010


Несмотря на то, что электронной почте уже почти 50 лет, она остается одной из главных технологий современного интернета. Сейчас электронный почтовый адрес есть у каждого человека, имеющего хоть малейшее отношение к интернету. Именно поэтому регистрация на различных сайтах и подтверждение регистрации (активация) происходит через e-mail.

Со временем это превратилось в рутину - чтобы получить информацию все чаще и чаще начали требовать регистрацию на сайте. Веб-мастеру сайта не важно, что вы регистрируетесь на пару минут и возможно больше никогда не встретите этот сайт.

Но сегодня, я вам расскажу, как забыть о подтверждении регистрации по почте, раз и навсегда. Мы будем создавать свой сервис автоактиваций по электронной почте. Не спорю, есть сайты временных электронных адресов на 10 минут (10minutemail.ru), но это немного другое - нам ни к чему лишние телодвижения.

Как это работает. При регистрации мы будем указывать e-mail вида: anytext@your-domain.ru, где anytext любое цифро-буквенное сочетание, подчеркивание или тире. Отправленное письмо с ссылкой подтверждения, благодаря catch-all, будет перенаправлено в электронный ящик admin@your-domain.ru. После чего, запускаемый по cron'у скрипт спарсит файл содержащий текст письма и при наличие ссылки перейдет по ней.

Для создания сервиса, нам потребуется хостинг с панелью DirectAdmin (cPanel) и привязанному к хостингу доменному имени. В качестве примера, мной был использован домен domain.ru.

Начнем с того, что настроим функцию catch-all в панели управления сайтом.

Catch-all — функция почтового сервера, позволяющая перенаправлять электронные письма, адресованные несуществующим пользователям, на определённый адрес электронной почты.

В разделе "Управление почтой" переходим в меню "Получение всех E-Mail"

Затем выбираем из выпадающего списка основной электронный адрес, на который будут перенаправляться все письма этого домена.

Если после всех операций мы получим "Catch-All email updated successfully", значит сделано все верно. Теперь все письма попадают в ящик admin@domain.ru. Для проверки отправим тестовое письмо на этот домен, например на адрес test@domain.ru. Убедимся, что письмо пришло, зайдя на почту через SquirrelMail.

Все письма поступающие на этот домен хранятся в файлах и для каждого письма отдельный файл. В моем случае, письма хранились в папке /imap/domain.ru/admin/Maildir/new.


Сам файл имел следующее содержание:

Return-path:
Envelope-to: test@domain.ru
Delivery-date: Sat, 04 Sep 2010 13:01:42 +0200
Received: from server.mail.ru ([8.8.8.8])
by hoster.ru with esmtps (TLSv1:AES256-SHA:256)
(Exim 4.71)
(envelope-from )
for test@domain.ru; Sat, 04 Sep 2010 13:01:42 +0200
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mail.ru; s=mail;
Received: from mail by server.mail.ru with local
for test@domain.ru; Sat, 04 Sep 2010 13:01:33 +0400
Received: from [5.5.5.5] by auth.mail.ru with HTTP;
Sat, 04 Sep 2010 13:01:33 +0400
From:
To: test@domain.ru
Subject: test
Mime-Version: 1.0
X-Mailer: mPOP Web-Mail 2.19
X-Originating-IP: [5.5.5.5]
Date: Sat, 04 Sep 2010 13:01:33 +0400
Reply-To:
Content-Type: text/plain; charset=koi8-r
Content-Transfer-Encoding: 8bit
X-Spam: Not detected
X-Mras: Ok

test message

Все что нам нужно в этом письме, так это тело письма - test message. Оно отделяется от служебных заголовков двумя переходами каретки (CRLF). У нас есть информация где расположены письма и как отделить содержание от остального мусора. Осталось лишь написать парсер.

Реализацию скрипта я сделал на более близком мне языке - PHP. Вы же можете использовать любой удобный для Вас язык программирования.

# Функция HTTP-запроса
function curl($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 0);
curl_setopt($ch, CURLOPT_NOBODY, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
curl_close($ch);}

# Путь до каталога с письмами
$dir = 'imap/domain.ru/admin/Maildir/new/';
# Открываем каталог
$handle = opendir($dir);
# Считываем содержание каталога
while ($file = readdir($handle)) {
# Если это файл
if(is_file($dir.$file)) {
# Получаем его содержимое
$content = file_get_contents($dir.$file);
# Получаем тело письма
$body = strstr($content, "\n\n");
# Парсим тип кодирования
if(preg_match('#Content-Transfer-Encoding:(.*?)$#im', $content, $charset)){
switch (trim($charset[1])) {
# quoted-printable
case 'quoted-printable': $body = quoted_printable_decode($body);break;
# base64
case 'base64': $body = base64_decode($body);break;}}
# Если нашли в файле ссылки
if(preg_match_all('#http:(.*?)[$|\s]#im', $body, $links)){
# Переходим по ним
foreach ($links[1] as $key => $link) {
curl('http:'.$link);}}
# Удаляем файл
unlink($dir.$file);}}
# Закрываем каталог
closedir($handle);

Код подробно прокомментирован, так что вопросов возникнуть не должно.
Скрипт помещаем в корень сайта, после чего добавляем задание в crontab на запуск команды:

php -f /home/user1501/activation.php

где /home/user1501/ абсолютный путь до корневого каталога, где размещен наш скрипт - его можно получить, выполнив php скрипт с командой echo getcwd();.


Значения * во всех полях означает, что команда будет выполнятся каждую минуту.

Примечание. В некоторых случаях, путь до интерпретатора php нужно указывать абсолютный. Таким образом, команда для crontab может принять вид:

/usr/local/bin/php -f /home/user1501/activation.php

Все готово! Теперь пробуем регистрироваться на каком-нибудь сайте, например vkontakte.ru, и если через минуту анкета будет активирована, значит вы делали все верно.

Post to Twitter

Похожие статьи:

  1. Как сделать HTTP-запрос в скрипте

Комментарии (5)

  1. avatar

    Stas
    Январь 10th, 2011 at 20:34 #

    Все письма поступающие на домен хранятся в файле и для каждого письма один файл
    как в этом случае?
    /home/admin/data/email/мойдомен.ru/admin
    а там файл
    mbox (и все письма в этом файле)
    Спасибо

  2. avatar

    GlooK
    Январь 10th, 2011 at 20:41 #

    Видимо у Вас формат почты Mailbox, а не Maildir. Более подробно мог бы подсказать при анализе этого файла.

  3. avatar

    Stas
    Январь 10th, 2011 at 20:42 #

    а зайдя на почту через SquirrelMail
    видно несколько писем отдельно

  4. avatar

    Stas
    Январь 10th, 2011 at 20:45 #

    как мне передать файл
    дайте icq

  5. avatar

    GlooK
    Январь 10th, 2011 at 20:49 #

    Пришлите мне на почту: tdlite(0)mail.ru

Ваш комментарий

Rambler's Top100 Яндекс.Метрика