Я столкнулся с этим PHP-кодом для проверки адреса электронной почты с помощью SMTP без отправки электронной почты.
Кто-нибудь пробовал что-то подобное или работает для вас? Можете ли вы сказать, правильно ли он входит в клиент/пользователь электронной почты?
Есть два метода, которые вы иногда можете использовать, чтобы определить, действительно ли существует получатель:
Вы можете подключиться к серверу и выполнить команду VRFY. Очень немногие серверы поддерживают эту команду, но она предназначена именно для этого. Если сервер отвечает с 2.0.0 DSN, пользователь существует.
Пользователь VRFY
Вы можете указать RCPT и посмотреть, отклонено ли письмо.
ПОЧТА ОТ: < gt;
RCPT TO: < user @domain >
Если пользователь не существует, вы получите 5.1.1 DSN. Однако только потому, что письмо не отклонено, не означает, что пользователь существует. Некоторые серверы молча отбрасывают такие запросы, чтобы предотвратить перечисление своих пользователей. Другие серверы не могут проверять пользователя и должны принимать сообщение независимо.
Существует также метод антиспама, называемый greylisting, который заставит сервер первоначально отклонить адрес, ожидая, что реальный SMTP-сервер попытается повторно отправить некоторое время спустя. Это испортит попытки проверки адреса.
Честно говоря, если вы пытаетесь проверить адрес, лучшим подходом является использование простого регулярного выражения для блокировки явно недействительных адресов, а затем отправка фактического сообщения электронной почты со ссылкой на вашу систему, которая будет проверять, что письмо было получено. Это также гарантирует, что пользователь ввел свой фактический адрес электронной почты, а не небольшую опечатку, которая, как оказалось, принадлежит кому-то другому.
Другие ответы здесь обсуждают различные проблемы с попыткой сделать это. Я думал, что покажу, как вы могли бы попробовать это, если бы вы хотели узнать, сделав это сами.
Вы можете подключиться к почтовому серверу через telnet, чтобы узнать, существует ли адрес электронной почты. Здесь приведен пример тестирования адреса электронной почты для stackoverflow.com
:
C:\>nslookup -q=mx stackoverflow.com Non-authoritative answer: stackoverflow.com MX preference = 40, mail exchanger = STACKOVERFLOW.COM.S9B2.PSMTP.com stackoverflow.com MX preference = 10, mail exchanger = STACKOVERFLOW.COM.S9A1.PSMTP.com stackoverflow.com MX preference = 20, mail exchanger = STACKOVERFLOW.COM.S9A2.PSMTP.com stackoverflow.com MX preference = 30, mail exchanger = STACKOVERFLOW.COM.S9B1.PSMTP.com C:\>telnet STACKOVERFLOW.COM.S9A1.PSMTP.com 25 220 Postini ESMTP 213 y6_35_0c4 ready. CA Business and Professions Code Section 17538.45 forbids use of this system for unsolicited electronic mail advertisements. helo hi 250 Postini says hello back mail from: <[email protected]> 250 Ok rcpt to: <[email protected]> 550-5.1.1 The email account that you tried to reach does not exist. Please try 550-5.1.1 double-checking the recipient email address for typos or 550-5.1.1 unnecessary spaces. Learn more at 550 5.1.1 http://mail.google.com/support/bin/answer.py?answer=6596 w41si3198459wfd.71
Линии с префиксом числовых кодов - это ответы от SMTP-сервера. Я добавил несколько пустых строк, чтобы сделать его более читаемым.
Многие почтовые серверы не возвращают эту информацию в качестве средства предотвращения сбоев электронной почты спамерами, поэтому вы не можете полагаться на эту технику. Однако у вас может быть некоторый успех при очистке некоторых явно плохих адресов электронной почты, обнаружение недопустимых почтовых серверов или отказ адресов получателей, как указано выше.
Также обратите внимание, что почтовые серверы могут помечать черный список, если вы делаете слишком много запросов от них.
В PHP я считаю, что вы можете использовать fsockopen
, fwrite
и fread
для программных программ:
$smtp_server = fsockopen("STACKOVERFLOW.COM.S9A1.PSMTP.com", 25, $errno, $errstr, 30);
fwrite($smtp_server, "helo hi\r\n");
fwrite($smtp_server, "mail from: <[email protected]>\r\n");
fwrite($smtp_server, "rcpt to: <[email protected]>\r\n");
Общий ответ: вы не можете проверить, существует ли почтовый адрес, если вы отправляете ему электронное письмо: он может просто попасть в черную дыру.
Таким образом, описанный там метод довольно эффективен. Он используется в производственном коде в ZoneCheck, за исключением того, что он использует RSET вместо QUIT.
Если взаимодействие пользователя с его почтовым ящиком не происходит чрезмерно, многие сайты фактически проверяют, что почта прибывает куда-то, отправив секретный номер, который должен быть отправлен обратно эмитенту (либо перейдя на секретный URL-адрес, либо отправив этот секретный номер по электронной почте). Большинство списков рассылки работают так.
Не совсем..... Некоторые серверы не могут проверить "rcpt to:"
http://www.freesoft.org/CIE/RFC/1123/92.htm
Это риск безопасности.....
Если сервер делает, вы можете написать бот для обнаружения каждого адреса на сервере....
Это не удастся (в числе других случаев), когда целевой почтовый сервер использует greylisting.
Greylisting: SMTP-сервер отказывается от доставки при первом подключении к ранее неизвестному клиенту, позволяет в следующий раз (-ы); это удерживает некоторый процент спам-ботов вне зависимости от законного использования - так как ожидается, что законный отправитель почты будет повторять попытку, что и будут делать обычные почтовые агенты.
Однако, если ваш код проверяет только один сервер на сервере, сервер с greylisting откажется от доставки (поскольку ваш клиент подключается в первый раз); если вы не повторите попытку через некоторое время, вы можете неправильно отклонить действительные адреса электронной почты.
Некоторые проблемы:
Хотя этот вопрос немного устарел, этот совет может помочь пользователям найти аналогичное решение, проверяющее адреса электронной почты за пределами проверки синтаксиса до отправки.
Я использую эту службу открытых источников для более глубокой проверки электронных писем (проверка наличия записей mx в домене адреса электронной почты и т.д.) для нескольких проектов с хорошими результатами. Он также проверяет, что обычная опечатка ведьма весьма полезна. Демо здесь.
Все, что вы можете сделать, это поиск DNS и обеспечение того, что домен, который находится на адресе электронной почты, имеет запись MX, кроме того, что нет надежного способа справиться с этим.
Некоторые серверы могут работать с методом rcpt-to, где вы разговариваете с SMTP-сервером, но полностью зависит от конфигурации сервера. Другая проблема может быть перегруженным сервером, может вернуть код 550, говорящий, что пользователь неизвестен, но это временная ошибка, есть постоянная ошибка (451 я думаю?), Которая может быть возвращена. Это полностью зависит от конфигурации сервера.
Я лично проверил бы запись DNS MX, а затем отправлю подтверждение по электронной почте, если запись MX существует.
"Можете ли вы сказать, правильно ли он входит в клиент/пользователь электронной почты?"
На самом деле это две разные вещи. Он может существовать, но может быть неправильным.
Иногда вам приходится вводить пользовательские входы с номинальной стоимостью. Есть много способов победить систему иначе.
function EmailValidation($email)
{
$email = htmlspecialchars(stripslashes(strip_tags($email))); //parse unnecessary characters to prevent exploits
if (eregi('[a-z||0-9]@[a-z||0-9].[a-z]', $email)) {
//checks to make sure the email address is in a valid format
$domain = explode( "@", $email ); //get the domain name
if (@fsockopen ($domain[1],80,$errno,$errstr,3)) {
//if the connection can be established, the email address is probably valid
echo "Domain Name is valid ";
return true;
} else {
echo "Con not a email domian";
return false; //if a connection cannot be established return false
}
return false; //if email address is an invalid format return false
}
}
Предполагая, что это адрес пользователя, некоторые почтовые серверы позволяют команде SMTP VRFY фактически проверять адрес электронной почты на свои почтовые ящики. Большая часть основного сайта не даст вам много информации; ответ gmail "если вы попытаетесь отправить его по почте, мы постараемся его доставить" или что-то умное.
Я думаю, что вы не можете, существует так много сценариев, где даже отправка электронной почты может закончиться неудачей. Например. почтовый сервер на стороне пользователя временно недоступен, почтовый ящик существует, но он заполнен, поэтому сообщение не может быть доставлено и т.д.
Вероятно, поэтому так много сайтов проверяют регистрацию после подтверждения пользователем, что они получили подтверждение по электронной почте.
<?php
$email = "someone@exa mple.com";
if(!filter_var($email, FILTER_VALIDATE_EMAIL))
echo "E-mail is not valid";
else
echo "E-mail is valid";
?>