Я столкнулся с этим кодом PHP, чтобы проверить адрес электронной почты, используя SMTP, не отправляя электронное письмо .
Кто-нибудь пробовал что-то подобное или работает для вас? Можете ли вы сказать, правильно ли введет клиент / пользователь электронной почты и существует?
Есть два метода, которые вы иногда можете использовать, чтобы определить, действительно ли получатель существует:
Вы можете подключиться к серверу и выдать команду VRFY. Очень немногие серверы поддерживают эту команду, но она предназначена именно для этого. Если сервер отвечает с 2.0.0 DSN, пользователь существует.
Пользователь VRFY
Вы можете выдать RCPT и посмотреть, отклонено ли письмо.
ПОЧТА ОТ: <>
RCPT TO: <пользовательский домен>
Если пользователь не существует, вы получите 5.1.1 DSN. Однако только потому, что письмо не отклонено, не означает, что пользователь существует. Некоторые серверы молча отбрасывают такие запросы, чтобы предотвратить перечисление своих пользователей. Другие серверы не могут проверить пользователя и должны принимать сообщение независимо.
Существует также антиспам-метод, называемый greylisting, что приведет к тому, что сервер сначала отклонит адрес, ожидая, что реальный SMTP-сервер попытается повторно отправить некоторое время спустя. Это испортит попытки проверки адреса.
Честно говоря, если вы пытаетесь проверить адрес, лучшим подходом является использование простого регулярного выражения для блокировки явно недействительных адресов, а затем отправьте фактическое электронное письмо со ссылкой на вашу систему, которая будет подтверждать, что письмо было получено. Это также гарантирует, что пользователь ввел свою фактическую электронную почту, а не небольшую опечатку, которая, как оказалось, принадлежит кому-то еще.
Другие ответы здесь обсуждают различные проблемы с попыткой сделать это. Я думал, что покажу, как вы могли бы попробовать это, если бы вы хотели учиться, делая это сами.
Вы можете подключиться к почтовому серверу через telnet, чтобы узнать, существует ли адрес электронной почты. Ниже приведен пример тестирования адреса электронной почты для stackoverflow.com
:
C: \> nslookup -q = mx stackoverflow.com Неавторитетный ответ: stackoverflow.com MX preference = 40, почтовый обменник = STACKOVERFLOW.COM.S9B2.PSMTP.com stackoverflow.com MX preference = 10, почтовый обменник = STACKOVERFLOW.COM.S9A1.PSMTP.com stackoverflow.com MX preference = 20, почтовый обменник = STACKOVERFLOW.COM.S9A2.PSMTP.com stackoverflow.com MX preference = 30, почтовый обменник = STACKOVERFLOW.COM.S9B1.PSMTP.com C: \> telnet STACKOVERFLOW.COM.S9A1.PSMTP.com 25 220 Postini ESMTP 213 y6_35_0c4 готов. Кодекс бизнеса и профессий CA Раздел 17538.45 запрещает использование этой системы для рекламы нежелательной электронной почты. helo hi 250 Postini приветствует привет mail от: <me@myhost.com> 250 Ok rcpt: <fake@stackoverflow.com> 550-5.1.1 Учетная запись электронной почты, к которой вы пытались связаться, не существует. Пожалуйста попробуйте 550-5.1.1. Двойная проверка адреса получателя для опечаток или 550-5.1.1 ненужные пробелы. Узнайте больше на 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: <me@myhost.com>\r\n"); fwrite($smtp_server, "rcpt to: <fake@stackoverflow.com>\r\n");
Общий ответ заключается в том, что вы не можете проверить, существует ли почтовый адрес, если вы отправляете ему электронное письмо: он может просто попасть в черную дыру.
При этом описанный здесь метод довольно эффективен. Он используется в производственном коде в ZoneCheck, за исключением того, что он использует RSET вместо QUIT.
Когда взаимодействие пользователя с его почтовым ящиком не происходит чрезмерно, многие сайты фактически проверяют, что почта прибывает куда-то, отправив секретный номер, который должен быть отправлен обратно эмитенту (либо перейдя на секретный URL-адрес, либо отправив этот секретный номер по электронной почте). Большинство списков рассылки работают так.
Не совсем ….. Некоторые серверы не могут проверить «rcpt to:»
http://www.freesoft.org/CIE/RFC/1123/92.htm
Это – риск для безопасности …..
Если сервер делает, вы можете написать бот для обнаружения каждого адреса на сервере ….
Некоторые вопросы:
Это не удастся (в других случаях), когда целевой почтовый сервер использует greylisting.
Greylisting : SMTP-сервер отказывается от доставки при первом подключении к ранее неизвестному клиенту, позволяет в следующий раз (-ы); это удерживает некоторый процент спам-ботов, но при этом разрешает законное использование – так как ожидается, что законный отправитель почты будет повторять попытку , что и будут делать обычные почтовые агенты.
Однако, если ваш код проверяет только один сервер на сервере, сервер с greylisting откажется от доставки (поскольку ваш клиент подключается в первый раз); если вы не повторите попытку через некоторое время, вы можете неправильно отклонить действительные адреса электронной почты.
«Можете ли вы сказать, правильно ли вставлен клиент / пользователь электронной почты и существует?»
На самом деле это две разные вещи. Он может существовать, но может быть неправильным.
Иногда вам приходится вводить пользовательские входы с номинальной стоимостью. В противном случае есть много способов победить систему.
Предполагая, что это адрес пользователя , некоторые почтовые серверы позволяют команде SMTP VRFY фактически проверять адрес электронной почты на свои почтовые ящики. Большая часть основного сайта не даст вам много информации; ответ gmail «если вы попытаетесь отправить его по почте, мы постараемся его доставить» или что-то умное.
Я думаю, что вы не можете, существует так много сценариев, где даже отправка электронной почты может закончиться неудачей. Например. почтовый сервер на стороне пользователя временно недоступен, почтовый ящик существует, но он заполнен, поэтому сообщение не может быть доставлено и т. д.
Вероятно, поэтому многие сайты проверяют регистрацию после того, как пользователь подтвердил, что получил подтверждение по электронной почте.
Все, что вы можете сделать, это поиск DNS и обеспечение того, что домен, который находится на адресе электронной почты, имеет запись MX, отличную от того, что нет надежного способа справиться с этим.
Некоторые серверы могут работать с методом rcpt-to, где вы разговариваете с SMTP-сервером, но полностью зависит от конфигурации сервера. Другая проблема может быть перегруженным сервером, может вернуть код 550, говорящий, что пользователь неизвестен, но это временная ошибка, есть постоянная ошибка (451 я думаю?), Которая может быть возвращена. Это полностью зависит от конфигурации сервера.
Я лично проверил бы запись DNS MX, а затем отправлю подтверждение по электронной почте, если запись MX существует.
Хотя этот вопрос немного устарел, этот совет может помочь пользователям найти аналогичное решение, проверяющее адреса электронной почты за пределами проверки синтаксиса до отправки.
Я использую эту службу с открытым исходным кодом для более глубокой проверки электронных писем (проверка записей mx в домене адреса электронной почты и т. Д.) Для нескольких проектов с хорошими результатами. Он также проверяет, что обычная опечатка ведьма весьма полезна. Демо здесь .
function EmailValidation($email) { $email = htmlspecialchars(stripslashes(strip_tags($email))); //parse unnecessary characters to prevent exploits if (eregi('[az||0-9]@[az||0-9].[az]', $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 } }
<?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"; ?>