Я натрапив на цей PHP-код, щоб перевірити електронну адресу за допомогою SMTP, не надсилаючи повідомлення .
Хтось пробував щось подібне чи це працює для вас? Чи можете ви сказати, чи правильно вказано клієнт / користувач електронної пошти?
Я натрапив на цей PHP-код, щоб перевірити електронну адресу за допомогою SMTP, не надсилаючи повідомлення .
Хтось пробував щось подібне чи це працює для вас? Чи можете ви сказати, чи правильно вказано клієнт / користувач електронної пошти?
Відповіді:
Існує два методи, які іноді можна використовувати, щоб визначити, чи отримувач насправді існує:
Ви можете підключитися до сервера та видати VRFY
команду. Дуже мало серверів підтримують цю команду, але вона призначена саме для цього. Якщо сервер відповідає на 2.0.0 DSN, користувач існує.
VRFY user
Ви можете оформити RCPT
та перевірити, чи не відхилено пошту.
MAIL FROM:<>
RCPT TO:<user@domain>
Якщо користувача не існує, ви отримаєте 5.1.1 DSN. Однак те, що електронна пошта не відхилена, не означає, що користувач існує. Деякі сервери будуть мовчки відкидати такі запити, щоб запобігти перерахуванню їх користувачів. Інші сервери не можуть перевірити користувача і повинні приймати повідомлення незалежно.
Існує також антиспам-метод, який називається грайліст, який призведе до того, що сервер спочатку відхиляє адресу, очікуючи, що справжній SMTP-сервер спробує повторну доставку через деякий час. Це зіпсує спроби перевірити адресу.
Чесно кажучи, якщо ви намагаєтесь перевірити адресу, найкращим підходом є використання простого регулярного вираження для блокування очевидно недійсних адрес, а потім надіслати фактичну електронну пошту із посиланням на вашу систему, яка підтвердить отримання електронної пошти. Це також гарантує, що користувач ввів свою фактичну електронну пошту, а не незначну помилку, яку, можливо, належить комусь іншому.
Інші відповіді тут обговорюють різні проблеми, намагаючись це зробити. Я думав, я покажу, як ти можеш це спробувати, якщо ти захочеш навчитися робити це самостійно.
Ви можете підключитися до поштового сервера через telnet, щоб запитати, чи існує адреса електронної пошти. Ось приклад тестування електронної адреси для stackoverflow.com
:
C: \> nslookup -q = mx stackoverflow.com Неавторитетна відповідь: stackoverflow.com налаштування MX = 40, обмінник пошти = STACKOVERFLOW.COM.S9B2.PSMTP.com stackoverflow.com налаштування MX = 10, обмінник пошти = STACKOVERFLOW.COM.S9A1.PSMTP.com stackoverflow.com MX настройки = 20, обмінник пошти = STACKOVERFLOW.COM.S9A2.PSMTP.com stackoverflow.com налаштування MX = 30, обмінник пошти = STACKOVERFLOW.COM.S9B1.PSMTP.com C: \> telnet STACKOVERFLOW.COM.S9A1.PSMTP.com 25 220 Postini ESMTP 213 y6_35_0c4 готовий. Розділ 17538.45 CA Кодекс комерційної діяльності та професій забороняє використовувати цю систему для небажаної реклами електронною поштою. привіт привіт 250 Постіні вітається назад пошта від: <me@myhost.com> 250 Ок 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 для:"
http://www.freesoft.org/CIE/RFC/1123/92.htm
Це ризик для безпеки .....
Якщо сервер це зробити, ви можете написати бота для виявлення кожної адреси на сервері ....
Це не вдасться (серед інших випадків), коли цільовий сервер поштового зв’язку використовує перегляд списку.
Повторне відображення : SMTP-сервер відмовляється від доставки при першому підключенні раніше невідомого клієнта, дозволяє в наступний раз; це утримує деякий відсоток спам-ботів, одночасно дозволяючи законне використання - оскільки, як очікується, законний відправник пошти повторно спробує , що і звичайні агенти передачі пошти.
Однак якщо ваш код перевіряється на сервері лише один раз , сервер із грайлістичним списком відмовить у доставці (оскільки ваш клієнт підключається вперше); якщо ви ще раз не перевірте, можливо, ви будете неправильно відхиляти дійсні адреси електронної пошти.
Деякі проблеми:
Незважаючи на те, що це питання трохи старе, ця порада може допомогти користувачам шукати подібне рішення, перевіряючи адреси електронної пошти, що не відповідають дійсності синтаксису, перед відправленням.
Я використовую цю послугу з відкритими джерелами для більш глибокої перевірки електронних листів (перевірка 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 - "якщо ви спробуєте надіслати її поштою, ми спробуємо доставити її" або щось таке розумне.
Я думаю, що ви не можете, існує так багато сценаріїв, коли навіть надсилання електронної пошти може не вдатися. Напр. поштовий сервер з боку користувача тимчасово не працює, поштова скринька існує, але повна, тому повідомлення не може бути доставлено тощо.
Можливо, тому стільки сайтів підтверджують реєстрацію після того, як користувач підтвердив, що отримав підтвердження електронною поштою.
Я можу підтвердити відповіді Джозефа та Дру RCTP TO: <address_to_check>
. Я хотів би додати трохи доповнень поверх цих відповідей.
Деякі постачальники пошти реалізують політику загального лову, тобто *@mydomain.com
вона поверне позитивну RCTP TO:
команду. Але це не обов'язково означає, що поштова скринька "існує", як в "належить людині". Тут нічого не можна зробити, просто будьте в курсі.
Повторне відображення: 1-е з'єднання з невідомого IP заблоковано. Рішення: повторіть спробу принаймні 2 рази.
Чорний список: якщо ви надсилаєте занадто багато запитів з одного і того ж IP-адреси, ця IP-адреса блокується. Рішення: використовувати обертання IP; Ричер використовує Тор.
Це дуже специфічно для провайдера, але іноді ви можете використовувати добре складені HTTP-запити та аналізувати відповіді на ці запити, щоб побачити, чи є вже ім’я користувача, зареєстроване в цьому постачальнику.
Ось відповідна функція бібліотеки з відкритим кодом, яку я написав, щоб перевірити *@yahoo.com
адреси за допомогою HTTP-запитів: check-if-email-існує . Я знаю, що мій код Rust і ця тема позначена PHP, але застосовуються ті самі ідеї.
Це може бути крайній випадок, але коли користувач має повну папку "Вхідні", RCTP TO:
поверне 5.1.1 DSN
повідомлення про помилку, вказуючи, що воно заповнене. Це означає, що акаунт насправді існує!
Я запускаю Reacher , API підтвердження електронної пошти в реальному часі. Мій код написаний на іржі та є 100% відкритим кодом. Перевірте це, чи хочете більш надійне рішення:
Github: https://github.com/amaurymartiny/check-if-email-exists
За допомогою комбінації різних методик, щоб перестрибувати обручі, мені вдається перевірити близько 80% електронних листів, які перевіряють мої клієнти.
<?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";
?>