Что нового

Проверка адреса электронной почты

tar

Новичок
Сообщения
58
Репутация
0
Здравствуйте.
Задача для скрипта: взять из документа roma.txt е-адрес проверить его на существование. Если не существует, то переместить его в документ nomail.txt.
Оплата 600 р.

bahs скрипт
Код:
#!/bin/bash

HOST=$1
PORT=25
USER=$2

if [ "$1" == "" ]
then
    echo "Usage: $0 host user"
    exit
fi

exec 3<>/dev/tcp/$HOST/$PORT
read -u 3 STATUS
echo "HELO 127.0.0.1" >&3
read -u 3 STATUS
echo "VRFY $USER" >&3
read -u 3 STATUS
RESULT=$(echo $STATUS | cut -d" " -f 1)
if [ "$RESULT" == "252" ]
then
    echo "User $USER at host $HOST exists"
else
    echo "User $USER at host $HOST does not exist"
fi

Может пригодится, описание для РНР.
Что нужно сделать для проверка существования email?

1) определить к какому домену привязана почта

2) определить MX сервера почты

3) соединится с MX сервером



4) попытаться отправить письмо по указанному адресу (если пользователя нет, сервер ответит с ошикой, если есть — скажет, что готов отправлять).

Первый пункт – самый простой, выделяем домен почты, при помощи регулярного выражения:



$re='/.*@(.*)/';
preg_match($re, $email, $match);
$domain=$match[1];
Итак, домен для почты мы нашли. Дальше нужно определить MX сервер для этого почтового адреса/домена.
Определить MX сервер домена можно при помощи встроенной в PHP функции dns_get_record. Ей и воспользуемся:

$mx_records=dns_get_record($domain, DNS_MX);
В результате мы получим массив с ассоциативными массивами, каждый из которых — MX запись домена (их может быть несколько). Выберем любую, и приступим к следующему пункту.

Теперь при помощи socket подключится к MX серверу и провести с ним диалог.

$port = 25; //Порт работы сервера
if (($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
//AF_INET - семейство протоколов
//SOCK_STREAM - тип сокета
//SOL_TCP - протокол
echo "\nSocket creating error\n";
}
$result = socket_connect($socket, $domain, $port);
if ($result === false) {
echo "\nError connecting to socket\n";
} else {
echo "\nSocket connected\n";
}
Итак, к серверу подключились, и он ждет от нас информации. Для этого проведем диалог с сервером.

В идеале диалог с сервером должно происходить так:
Код:
> HELO domain.com
< 250 OK
> MAIL FROM: <[email protected]>
< 250 OK
> RCPT TO: <email@dlya_proverki.com>
< Ответ с резульатом проверки
</email@dlya_proverki.com></[email protected]>
И вот на этом месте как раз и происходит самое интересное для нашей задачи "проверка существования email". Может быть несколько вариантов ответа сервера, но чаще всего выдаёт 3:
250 или 251: почтовый адрес существует и сервер готов отправлять на него письмо
451 или 450: сервер занят или не хочет отвечать на ваш запрос (чаще всего это значит, что IP адрес, с которого вы обращаетесь к серверу скомпроментирован)
5хх: любой ответ из 500-х означает, что такого пользователя нет

Именно этого мы и ждем: если получили 25Х — почта существует, 5ХХ — почты не существует, 45Х — ещё под вопросом, нужно попробовать через несколько минут.



Собственно, отправка сообщения сервису для проведения диалога делается через функцию:

$msg="HELO domain.com";
socket_write($socket, $msg, strlen($msg));
Ну а получение, через функцию:

$out = socket_read($socket, 1024);
echo $out;
То есть вам для того, чтобы провелась проверка существования email нужно в цикле провести диалог с сервером для каждого из почтовых адресов.

Класс
Код:
<?php
class MailCheck
{
    protected $domains;
    protected $topDomains;
    protected $distanceFunction;
    protected $minDistance;
    public function __construct(array $domains = null, array $topDomains = null, $distanceFunction = null, $minDistance = null)
    {
        $this->domains = $domains ?: array(
            "yahoo.com", "google.com", "hotmail.com", "gmail.com", "me.com", "aol.com", "mac.com",
            "live.com", "comcast.net", "googlemail.com", "msn.com", "facebook.com", "gmx.com", "mail.com");
        $this->topDomains = $topDomains ?: array("fr", "com", "net", "org", "info", "edu", "gov", "mil", "eu");
        $this->distanceFunction = $distanceFunction ?: 'levenshtein';
        $this->minDistance = $minDistance ?: 3;
    }
    public function suggest($email)
    {
        $email = strtolower($email);
        list($user, $domain) = explode('@', $email, 2);
        if (!$domain) {
            return false;
        }
        $closestDomain = $this->findClosest($domain, $this->domains, $this->minDistance);
        if (is_string($closestDomain)) {
            return preg_replace('{'.$domain.'$}', $closestDomain, $email);
        }
        $topDomain = substr($domain, strrpos($domain, '.')+1);
        $closestTopDomain = $this->findClosest($topDomain, $this->topDomains, 1);
        if (is_string($closestTopDomain)) {
            return preg_replace('{'.$topDomain.'$}', $closestTopDomain, $email);
        }
        return false;
    }
    protected function findClosest($string, $collection, $minDistance)
    {
        if (in_array($string, $collection)) {
            return $string;
        }
        $closest = false;
        foreach ($collection as $tested) {
            $distance = call_user_func($this->distanceFunction, $string, $tested);
            if ($distance <= $minDistance) {
                $minDistance = $distance-1;
                $closest = $tested;
            }
        }
        return $closest;
    }
}
 
Верх