PHP→ Сервис автоактиваций по e-mail
Сен 4, 2010
Несмотря на то, что электронной почте уже почти 50 лет, она остается одной из главных технологий современного интернета. Сейчас электронный почтовый адрес есть у каждого человека, имеющего хоть малейшее отношение к интернету. Именно поэтому регистрация на различных сайтах и подтверждение регистрации (активация) происходит через e-mail.
Со временем это превратилось в рутину — чтобы получить информацию все чаще и чаще начали требовать регистрацию на сайте. Веб-мастеру сайта не важно, что вы регистрируетесь на пару минут и возможно больше никогда не встретите этот сайт.
Но сегодня, я вам расскажу, как забыть о подтверждении регистрации по почте, раз и навсегда. Мы будем создавать свой сервис автоактиваций по электронной почте. Не спорю, есть сайты временных электронных адресов на 10 минут (практически не возможно найти такой сервис в 2022 году), но это немного другое — нам ни к чему лишние телодвижения.
Как это работает. При регистрации мы будем указывать 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, и если через минуту анкета будет активирована, значит вы делали все верно.
обновлено 2022 от IS
не готово( сайт VK очень изменился, для использования данного кода так-же не обходимо знаний команд Linux.