Як перевірити, чи існує електронна адреса без надсилання електронної пошти?


123

Я натрапив на цей PHP-код, щоб перевірити електронну адресу за допомогою SMTP, не надсилаючи повідомлення .

Хтось пробував щось подібне чи це працює для вас? Чи можете ви сказати, чи правильно вказано клієнт / користувач електронної пошти?



2
Цікаво, чому це має тег Telnet?
Пікколо

2
Там в PHP бібліотека , яка робить саме те, що: github.com/kickboxio/kickbox-php
Dan

Kickbox не безкоштовний. Цей API - це лише обгортка для підключення до їх служби.
Ашит Вора

Відповіді:


92

Існує два методи, які іноді можна використовувати, щоб визначити, чи отримувач насправді існує:

  1. Ви можете підключитися до сервера та видати VRFYкоманду. Дуже мало серверів підтримують цю команду, але вона призначена саме для цього. Якщо сервер відповідає на 2.0.0 DSN, користувач існує.

    VRFY user
  2. Ви можете оформити RCPTта перевірити, чи не відхилено пошту.

    MAIL FROM:<>
    RCPT TO:<user@domain>
    

Якщо користувача не існує, ви отримаєте 5.1.1 DSN. Однак те, що електронна пошта не відхилена, не означає, що користувач існує. Деякі сервери будуть мовчки відкидати такі запити, щоб запобігти перерахуванню їх користувачів. Інші сервери не можуть перевірити користувача і повинні приймати повідомлення незалежно.

Існує також антиспам-метод, який називається грайліст, який призведе до того, що сервер спочатку відхиляє адресу, очікуючи, що справжній SMTP-сервер спробує повторну доставку через деякий час. Це зіпсує спроби перевірити адресу.

Чесно кажучи, якщо ви намагаєтесь перевірити адресу, найкращим підходом є використання простого регулярного вираження для блокування очевидно недійсних адрес, а потім надіслати фактичну електронну пошту із посиланням на вашу систему, яка підтвердить отримання електронної пошти. Це також гарантує, що користувач ввів свою фактичну електронну пошту, а не незначну помилку, яку, можливо, належить комусь іншому.


10
Деякі сервери навіть приймуть це повідомлення, але пізніше вони відправлять повідомлення про помилку назад відправника конверту, особливо якщо це велика організація з багатьма внутрішніми відділами з власними поштовими серверами. Прикордонний сервер може навіть не знати всіх облікових записів всередині.
Девід Мартенсон

3
Тоді чому спамери не використовують цей метод для перевірки електронних повідомлень? Я маю на увазі той факт, що ці методи підтримуються дуже небагато серверів. Або вони?
Шахріяр Іманов

7
@Shehi: Фактично спамери можуть використовувати цей метод, це важко сказати. Однак, оскільки спамери можуть використовувати його, майже всі поштові сервери відключають VRFY, тому на практиці VRFY, ймовірно, марний.
sleske

2
Чи можете ви навести приклад коду, як використовувати RCPT TO: <user @ domain>? Спасибі
Папа Де Боу

4
На VRFY, gmail відповідає "Надішліть трохи пошти, я спробую все можливе" ;-)
Армель Ларсьє,

46

Інші відповіді тут обговорюють різні проблеми, намагаючись це зробити. Я думав, я покажу, як ти можеш це спробувати, якщо ти захочеш навчитися робити це самостійно.

Ви можете підключитися до поштового сервера через 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");

Знімаю капелюх! Я знайшов одну проблему, чи порт 25 завжди працює з записом mx з низьким пріоритетом ??
Dhruvenkumar Shah

@DhruvenkumarShah, вибачте, я не знаю. Якщо ви дізнаєтесь, будь ласка, прокоментуйте ще раз.
Дрю Ноакс

Привіт, я просто намагався за власним обліковим записом університету дізнатись про записи MX, але це не працювало за 25 .. але веб-сайт на веб-сайті verify-email.org працював .. як вони це роблять .. я дам вам знати про це, якщо я
дізнаюся

1
@DhruvenkumarShah це дає кілька імен серверів обміну поштою. див. відповідь для обмінників пошти. тож якщо один не працює, інший зі списку має працювати.
Janaka R Rajapaksha

дійсно дуже допомагаю мені ... спасибі, сер..я спробував це в шпаклівці і працює як принади .. дякую ..
Мохаммед Суфіан

8

Загальна відповідь полягає в тому, що ви не можете перевірити, чи існує подія електронної пошти, якщо ви надіслали їй електронний лист: це може просто перейти в чорну діру.

Однак, описаний метод є досить ефективним. Він використовується у виробничому коді в ZoneCheck за винятком того, що він використовує RSET замість QUIT.

Якщо взаємодія користувача з його поштовою скринькою не є надмірною, багато сайтів насправді перевіряють, чи приходить пошта кудись, надсилаючи секретний номер, який повинен бути відправлений назад до випромінювача (або перейшовши на секретну URL-адресу, або повернувши цей секретний номер електронною поштою). Більшість списків розсилки працюють так.


6

Насправді ..... Деякі сервери можуть не перевірити "rcpt для:"

http://www.freesoft.org/CIE/RFC/1123/92.htm

Це ризик для безпеки .....

Якщо сервер це зробити, ви можете написати бота для виявлення кожної адреси на сервері ....


Я теж про це думав :)
Janaka R Rajapaksha

6

Це не вдасться (серед інших випадків), коли цільовий сервер поштового зв’язку використовує перегляд списку.

Повторне відображення : SMTP-сервер відмовляється від доставки при першому підключенні раніше невідомого клієнта, дозволяє в наступний раз; це утримує деякий відсоток спам-ботів, одночасно дозволяючи законне використання - оскільки, як очікується, законний відправник пошти повторно спробує , що і звичайні агенти передачі пошти.

Однак якщо ваш код перевіряється на сервері лише один раз , сервер із грайлістичним списком відмовить у доставці (оскільки ваш клієнт підключається вперше); якщо ви ще раз не перевірте, можливо, ви будете неправильно відхиляти дійсні адреси електронної пошти.


(особистий досвід: мені довелося сперечатися з провайдером електронної пошти, що так , я знаю, що я роблю, і так , мені потрібно вимкнути перегляд грайлістів - тому що ці перевірки від сторонньої служби провалилися )
Пісквор вийшов із будівлі

4

Деякі проблеми:

  1. Я впевнений, що деякі SMTP-сервери повідомлять вас негайно про те, що вказана вами адреса не існує, але деякі не будуть мірою конфіденційності. Вони просто прийматимуть будь-які адреси, які ви їм надаєте, і мовчки ігноруватимуть тих, яких немає.
  2. Як зазначено в статті, якщо ви робите це занадто часто з деякими серверами, вони почнуть вас в чорний список.
  3. Для деяких SMTP-серверів (наприклад, gmail) вам потрібно використовувати SSL, щоб зробити що-небудь. Це справедливо лише при використанні SMTP-сервера gmail для надсилання електронної пошти.

Щодо третього пункту, це трапляється лише в тому випадку, якщо ви хочете використовувати його як реле. Я не знаю жодного обмінника пошти, для якого потрібен SSL. Якщо хтось зробив це, вони перестали б отримувати електронну пошту від багатьох користувачів.
kmkaplan

Вибачте, моя помилка. Якщо ви хочете відправити електронну пошту за допомогою SMTP-сервера gmail, потрібно використовувати SSL.
Graeme Perrow

3

Незважаючи на те, що це питання трохи старе, ця порада може допомогти користувачам шукати подібне рішення, перевіряючи адреси електронної пошти, що не відповідають дійсності синтаксису, перед відправленням.

Я використовую цю послугу з відкритими джерелами для більш глибокої перевірки електронних листів (перевірка mx записів у домені адреси електронної пошти тощо) для кількох проектів з хорошими результатами. Він також перевіряє наявність відьом на помилках, які є дуже корисними. Демо тут .


Ви стверджуєте, що ця послуга є відкритим кодом. Чи можете ви надати посилання на джерело?
amaurymartiny

Вибачте @amaurymartiny, що не можу. На момент написання проекту Mailgun був відкритим кодом, якщо я пам'ятаю правильно, але я не можу знайти посилання на будь-яке репо, яке надає джерело після закінчення часу.
Henkealg

2

"Чи можете ви сказати, чи правильно вказано клієнт / користувач електронної пошти?"

Насправді це дві окремі речі. Він може існувати, але може бути невірним.

Іноді доводиться приймати дані користувача за номіналом. Є багато способів перемогти систему інакше.


2
+1 Ви ніколи не можете бути впевнені, що це правильно, не надсилаючи повідомлення електронної пошти та не отримуючи відповіді на нього, наприклад, натискання посилання.
Даніель Даранас

ви можете зберігати посилання (для зображення тощо) в тілі електронної пошти і рахувати кожне завантаження цього посилання. не потрібно чекати кліків
Janaka R Rajapaksha

2

Все, що ви можете зробити, - це пошук DNS і переконатися, що домен, що знаходиться в електронній пошті, має запис MX, окрім того, що немає надійного способу вирішення цього питання.

Деякі сервери можуть працювати з методом rcpt-to, коли ви спілкуєтесь із сервером SMTP, але це повністю залежить від конфігурації сервера. Інша проблема може бути перевантаженим сервером, може повернути код 550, кажучи, що користувач невідомий, але це тимчасова помилка, є постійна помилка (я думаю, 451?), Яку можна повернути. Це повністю залежить від конфігурації сервера.

Я особисто перевіряв би запис DNS MX, а потім надсилав підтвердження електронною поштою, чи існує запис MX.


2
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
    }
}

1
порт 80 не має сенсу
jrosell

5
Я думаю, що це лише перевірка доменного імені, а не перевірка самої електронної пошти.
The Angry Saxon

Це може бути корисніше:getmxrr
jchook

1

Якщо припустити, що це адреса користувача, деякі поштові сервери дозволяють команді SMTP VRFY фактично перевіряти адресу електронної пошти щодо своїх поштових скриньок. Більшість основних сайтів не дадуть вам багато інформації; відповідь gmail - "якщо ви спробуєте надіслати її поштою, ми спробуємо доставити її" або щось таке розумне.


1

Я думаю, що ви не можете, існує так багато сценаріїв, коли навіть надсилання електронної пошти може не вдатися. Напр. поштовий сервер з боку користувача тимчасово не працює, поштова скринька існує, але повна, тому повідомлення не може бути доставлено тощо.

Можливо, тому стільки сайтів підтверджують реєстрацію після того, як користувач підтвердив, що отримав підтвердження електронною поштою.


0

Я можу підтвердити відповіді Джозефа та Дру RCTP TO: <address_to_check>. Я хотів би додати трохи доповнень поверх цих відповідей.

Ловлять усіх постачальників

Деякі постачальники пошти реалізують політику загального лову, тобто *@mydomain.comвона поверне позитивну RCTP TO:команду. Але це не обов'язково означає, що поштова скринька "існує", як в "належить людині". Тут нічого не можна зробити, просто будьте в курсі.

IP Greylisting / чорний список

Повторне відображення: 1-е з'єднання з невідомого IP заблоковано. Рішення: повторіть спробу принаймні 2 рази.

Чорний список: якщо ви надсилаєте занадто багато запитів з одного і того ж IP-адреси, ця IP-адреса блокується. Рішення: використовувати обертання IP; Ричер використовує Тор.

HTTP-запити на реєстраційних формах

Це дуже специфічно для провайдера, але іноді ви можете використовувати добре складені 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% електронних листів, які перевіряють мої клієнти.


-8
<?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";

?>

Користувач запитує рішення .Net не php.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.