Jak sprawdzić, czy adres e-mail istnieje bez wysyłania e-maila?


123

Natknąłem się na ten kod PHP, aby sprawdzić adres e-mail za pomocą SMTP bez wysyłania wiadomości e-mail .

Czy ktoś próbował czegoś podobnego lub czy to działa u Ciebie? Czy możesz stwierdzić, czy adres e-mail wprowadzony przez klienta / użytkownika jest poprawny i istnieje?



2
Zastanawiam się tylko, dlaczego ma to tag Telnet?
Piccolo,

2
Jest biblioteka PHP, która dokładnie to robi: github.com/kickboxio/kickbox-php
Dan,

Kickbox nie jest darmowy. Ten interfejs API jest tylko opakowaniem do łączenia się z ich usługą.
Ashit Vora

Odpowiedzi:


92

Istnieją dwie metody, których możesz czasami użyć, aby określić, czy odbiorca rzeczywiście istnieje:

  1. Możesz połączyć się z serwerem i wydać VRFYpolecenie. Bardzo niewiele serwerów obsługuje to polecenie, ale jest ono przeznaczone właśnie do tego. Jeśli serwer odpowiada za pomocą nazwy DSN 2.0.0, użytkownik istnieje.

    VRFY user
  2. Możesz wydać RCPTi sprawdzić, czy wiadomość została odrzucona.

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

Jeśli użytkownik nie istnieje, otrzymasz DSN 5.1.1. Jednak tylko dlatego, że wiadomość e-mail nie została odrzucona, nie oznacza, że ​​użytkownik istnieje. Niektóre serwery po cichu odrzucają takie żądania, aby zapobiec wyliczaniu ich użytkowników. Inne serwery nie mogą zweryfikować użytkownika i mimo to muszą zaakceptować wiadomość.

Istnieje również technika antyspamowa zwana szarą listą, która powoduje, że serwer początkowo odrzuca adres, spodziewając się, że prawdziwy serwer SMTP spróbuje ponownie dostarczyć go jakiś czas później. Spowoduje to zepsucie prób weryfikacji adresu.

Szczerze mówiąc, jeśli próbujesz zweryfikować adres, najlepszym podejściem jest użycie prostego wyrażenia regularnego do zablokowania oczywiście nieprawidłowych adresów, a następnie wysłanie rzeczywistej wiadomości e-mail z łączem z powrotem do systemu, który potwierdzi otrzymanie wiadomości e-mail. Zapewnia to również, że użytkownik wprowadził swój rzeczywisty adres e-mail, a nie drobną literówkę, która należy do kogoś innego.


10
Niektóre serwery nawet zaakceptują wiadomość, ale później wyślą komunikat o błędzie z powrotem do nadawcy w kopercie, zwłaszcza jeśli jest to duża organizacja z wieloma działami wewnętrznymi z własnymi serwerami pocztowymi. Serwer graniczny może nawet nie znać wszystkich kont w obrębie.
David Mårtensson

3
Dlaczego więc spamerzy nie używają tej metody do weryfikacji dodatków do wiadomości e-mail? Pomijając fakt, że te metody są obsługiwane przez bardzo niewiele serwerów. A może oni?
Shahriyar Imanov

7
@Shehi: W rzeczywistości spamerzy mogą używać tej metody, trudno powiedzieć. Jednak ponieważ spamerzy mogą go używać, prawie wszystkie serwery pocztowe wyłączają VRFY, więc w praktyce VRFY jest prawdopodobnie bezużyteczne.
sleske

2
Czy możesz podać przykładowy kod, jak używać RCPT TO: <użytkownik @ domena>? Dzięki
Papa De Beau

4
Na VRFY, gmail odpowiada „Wyślij maila, postaram się jak najlepiej” ;-)
Armel Larcier

46

Inne odpowiedzi omawiają różne problemy związane z próbami zrobienia tego. Pomyślałem, że pokażę, jak możesz tego spróbować, gdybyś chciał się tego nauczyć, robiąc to sam.

Możesz połączyć się z serwerem pocztowym przez telnet, aby zapytać, czy istnieje adres e-mail. Oto przykład testowania adresu e-mail dla stackoverflow.com:

C: \> nslookup -q = mx stackoverflow.com
Nieautorytatywna odpowiedź:
stackoverflow.com MX preference = 40, mail exchangeanger = STACKOVERFLOW.COM.S9B2.PSMTP.com
stackoverflow.com MX preference = 10, mail wymiennik = STACKOVERFLOW.COM.S9A1.PSMTP.com
stackoverflow.com MX preference = 20, mail exchangeanger = STACKOVERFLOW.COM.S9A2.PSMTP.com
stackoverflow.com MX preference = 30, mail exchangeanger = STACKOVERFLOW.COM.S9B1.PSMTP.com

C: \> telnet STACKOVERFLOW.COM.S9A1.PSMTP.com 25
220 Postini ESMTP 213 y6_35_0c4 gotowy. Sekcja 17538.45 Kodeksu Biznesu i Zawodów CA zabrania używania tego systemu do niechcianych reklam wysyłanych pocztą elektroniczną.

cześć cześć
250 Postini wita się ponownie

poczta od: <me@myhost.com>
250 Ok

rcpt to: <fake@stackoverflow.com>
550-5.1.1 Konto e-mail, do którego próbujesz się dostać, nie istnieje. Proszę spróbować
550-5.1.1 podwójne sprawdzenie adresu e-mail odbiorcy pod kątem literówek lub
550-5.1.1 niepotrzebnych spacji. Dowiedz się więcej na
550 5.1.1 http://mail.google.com/support/bin/answer.py?answer=6596 w41si3198459wfd.71

Wiersze poprzedzone kodami numerycznymi to odpowiedzi z serwera SMTP. Dodałem kilka pustych wierszy, aby było bardziej czytelne.

Wiele serwerów pocztowych nie zwraca tych informacji jako środka zapobiegającego przechwytywaniu adresów e-mail przez spamerów, więc nie możesz polegać na tej technice. Jednak możesz odnieść pewien sukces w usuwaniu niektórych ewidentnie złych adresów e-mail, wykrywając nieprawidłowe serwery pocztowe lub odrzucając adresy odbiorców, jak powyżej.

Zauważ też, że serwery pocztowe mogą Cię umieścić na czarnej liście, jeśli wyślesz do nich zbyt wiele żądań.


W PHP Wierzę, że można użyć fsockopen, fwritei freadwykonać powyższe kroki programowe:

$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");

czapki z głów! jeden problem, który znalazłem, to czy port 25 zawsze działa z rekordem mx o niskim priorytecie?
Dhruvenkumar Shah

@DhruvenkumarShah, przepraszam, nie wiem. Jeśli się dowiesz, skomentuj ponownie.
Drew Noakes

Cześć, próbowałem po prostu założyć własne konto uniwersyteckie, aby dowiedzieć się wszystkiego o rekordach MX, ale nie działało to dla 25 ... ale strona internetowa w rodzaju weryfikacji-email.org działała ... jak oni to robią ... poinformuje cię o tym, jeśli się
dowiem

1
@DhruvenkumarShah daje kilka nazw serwerów wymiany poczty. zobacz odpowiedź dla wymienników poczty. więc jeśli jeden zawiedzie, powinien zadziałać inny z listy.
Janaka R Rajapaksha

naprawdę bardzo mi pomogło… dziękuję panu… wypróbowałem to w szpachli i działa jak zaklęcia… dzięki…
Mohammed Sufian

8

Ogólna odpowiedź jest taka, że można nie sprawdzić, czy adres e-mail istnieje zdarzenie jeśli wysłać e-mail do niego: może po prostu pójść do czarnej dziury.

Mimo to opisana metoda jest dość skuteczna. Jest używany w kodzie produkcyjnym w ZoneCheck, z wyjątkiem tego, że używa RSET zamiast QUIT.

Tam, gdzie interakcja użytkownika z jego skrzynką pocztową nie jest zbyt kosztowna, wiele witryn faktycznie testuje, czy poczta gdzieś dotarła, wysyłając tajny numer, który należy odesłać do nadawcy (albo przechodząc do tajnego adresu URL, albo wysyłając ten tajny numer pocztą elektroniczną). Większość list mailingowych działa w ten sposób.



6

To się nie powiedzie (między innymi), gdy docelowy serwer poczty używa szarej listy.

Szara lista : serwer SMTP odmawia dostarczenia przy pierwszym połączeniu nieznanego wcześniej klienta, zezwala na następny raz; dzięki temu pewien procent spamerów pozostaje na zewnątrz, pozwalając jednocześnie na legalne użycie - ponieważ oczekuje się, że legalny nadawca poczty ponowi próbę , co robią zwykli agenci przesyłania poczty.

Jeśli jednak Twój kod sprawdza serwer tylko raz , serwer z szarą listą odmówi dostarczenia (gdy klient łączy się po raz pierwszy); jeśli nie sprawdzisz ponownie za chwilę, możesz nieprawidłowo odrzucać prawidłowe adresy e-mail.


(osobiste doświadczenie: musiałem kłócić się z moim dostawcą poczty e-mail, że tak , jestem świadomy tego, co robię, i tak , potrzebuję wyłączenia szarej listy - ponieważ te kontrole z usługi innej firmy zawiodły )
Piskvor opuścił budynek

4

Niektóre problemy:

  1. Jestem pewien, że niektóre serwery SMTP natychmiast powiadomią Cię, jeśli adres, który im podałeś, nie istnieje, ale niektóre nie istnieją ze względu na ochronę prywatności. Po prostu zaakceptują adresy, które im podasz, i po cichu zignorują te, które nie istnieją.
  2. Jak mówi artykuł, jeśli robisz to zbyt często z niektórymi serwerami, umieszczą Cię na czarnej liście.
  3. W przypadku niektórych serwerów SMTP (takich jak Gmail) musisz użyć SSL, aby cokolwiek zrobić. Dzieje się tak tylko wtedy, gdy do wysyłania wiadomości e-mail używany jest serwer SMTP Gmaila .

Jeśli chodzi o trzeci punkt, dzieje się tak tylko wtedy, gdy chcesz używać go jako przekaźnika. Nie znam żadnego wymiennika poczty, który wymaga SSL. Gdyby ktokolwiek to zrobił, przestałby otrzymywać e-maile od wielu użytkowników.
kmkaplan

Przepraszam, mój błąd. Jeśli chcesz wysyłać e-maile przy użyciu serwera SMTP Gmaila, musisz użyć SSL.
Graeme Perrow

3

Chociaż to pytanie jest nieco stare, ta wskazówka dotycząca usługi może pomóc użytkownikom szukającym podobnego rozwiązania sprawdzającego adresy e-mail poza sprawdzeniem składni przed wysłaniem.

Korzystałem z tej usługi typu open source do dokładniejszego sprawdzania poprawności wiadomości e-mail (sprawdzania rekordów mx w domenie adresu e-mail itp.) W przypadku kilku projektów z dobrymi wynikami. Sprawdza również typowe literówki, które są całkiem przydatne. Demo tutaj .


Twierdzisz, że ta usługa jest open-source. Czy możesz podać link do źródła?
amaurymartiny

Przepraszam @amaurymartiny, nie mogę. W chwili pisania tego tekstu projekt Mailgun był open source, o ile dobrze pamiętam, ale nie mogę znaleźć linku do żadnego repozytorium udostępniającego źródło po tym czasie.
Henkealg

2

„Czy możesz stwierdzić, czy adres e-mail wprowadzony przez klienta / użytkownika jest poprawny i istnieje?”

Właściwie to są dwie różne rzeczy. Może istnieć, ale może nie być poprawne.

Czasami musisz przyjąć dane wejściowe użytkownika za wartość nominalną. W przeciwnym razie istnieje wiele sposobów na pokonanie systemu.


2
+1 Nigdy nie możesz być pewien, że jest poprawny bez wysłania wiadomości e-mail i otrzymania ludzkiej odpowiedzi, takiej jak kliknięcie linku.
Daniel Daranas

możesz zachować łącze (do obrazu itp.) w treści wiadomości e-mail i policzyć każde ładowanie tego łącza. nie trzeba czekać na kliknięcia
Janaka R Rajapaksha

2

Wszystko, co możesz zrobić, to przeszukać DNS i upewnić się, że domena znajdująca się w adresie e-mail ma rekord MX, poza tym, że nie ma niezawodnego sposobu radzenia sobie z tym.

Niektóre serwery mogą współpracować z metodą rcpt-to, w której rozmawiasz z serwerem SMTP, ale zależy to całkowicie od konfiguracji serwera. Innym problemem może być to, że przeciążony serwer może zwrócić kod 550 z informacją, że użytkownik jest nieznany, ale jest to błąd tymczasowy, istnieje błąd stały (myślę, że 451?), Który można zwrócić. Zależy to całkowicie od konfiguracji serwera.

Osobiście sprawdzę rekord DNS MX, a następnie wyślę wiadomość e-mail z potwierdzeniem, czy rekord MX istnieje.


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
port 80 nie ma sensu
jrosell

5
Myślę, że to po prostu sprawdzenie, czy nazwa domeny istnieje, a nie samego e-maila.
The Angry Saxon

To może być bardziej przydatne:getmxrr
jchook

1

Zakładając, że jest to adres użytkownika , niektóre serwery pocztowe pozwalają komendzie SMTP VRFY na faktyczną weryfikację adresu e-mail w swoich skrzynkach pocztowych. Większość głównych witryn nie zawiera zbyt wielu informacji; odpowiedź w Gmailu brzmi „jeśli spróbujesz to wysłać pocztą, postaramy się ją dostarczyć” lub coś podobnego.


1

Myślę, że nie możesz, jest tak wiele scenariuszy, w których nawet wysłanie e-maila może się nie udać. Na przykład. serwer pocztowy po stronie użytkownika jest tymczasowo wyłączony, skrzynka pocztowa istnieje, ale jest pełna, więc nie można dostarczyć wiadomości itp.

Prawdopodobnie dlatego tak wiele witryn weryfikuje rejestrację po tym, jak użytkownik potwierdził, że otrzymał wiadomość e-mail z potwierdzeniem.


0

Mogę potwierdzić odpowiedzi Josepha i Drew do wykorzystania RCTP TO: <address_to_check>. Chciałbym dodać kilka uzupełnień do tych odpowiedzi.

Dostawcy typu catch-all

Niektórzy dostawcy poczty implementują strategię typu catch-all, co oznacza, że ​​polecenie *@mydomain.comzwróci wartość dodatnią RCTP TO:. Ale to niekoniecznie oznacza, że ​​skrzynka pocztowa „istnieje”, jak w przypadku „należy do człowieka”. Nic tu nie da się zrobić, po prostu bądź świadomy.

Szara / czarna lista adresów IP

Szara lista: pierwsze połączenie z nieznanego adresu IP jest zablokowane. Rozwiązanie: spróbuj ponownie co najmniej 2 razy.

Czarna lista: jeśli wyślesz zbyt wiele żądań z tego samego adresu IP, ten adres IP zostanie zablokowany. Rozwiązanie: użyj rotacji adresów IP; Reacher używa Tora.

Żądania HTTP w formularzach rejestracji

Jest to bardzo specyficzne dla dostawcy, ale czasami można użyć dobrze spreparowanych żądań HTTP i przeanalizować odpowiedzi na te żądania, aby sprawdzić, czy nazwa użytkownika jest już zarejestrowana u tego dostawcy.

Oto odpowiednia funkcja z biblioteki open source, którą napisałem, aby sprawdzić *@yahoo.comadresy za pomocą żądań HTTP: sprawdź, czy e-mail-istnieje . Wiem, że mój kod to Rust, a ten wątek jest oznaczony jako PHP, ale mają zastosowanie te same pomysły.

Pełna skrzynka odbiorcza

Może to być przypadek skrajny, ale gdy użytkownik ma pełną skrzynkę odbiorczą, RCTP TO:zwróci 5.1.1 DSNkomunikat o błędzie informujący, że jest pełna. Oznacza to, że konto faktycznie istnieje!

Ujawnienie

Biegnę Reacher , w czasie rzeczywistym weryfikacji email API. Mój kod jest napisany w Rust i jest w 100% open-source. Sprawdź to, jeśli chcesz bardziej niezawodnego rozwiązania:

Github: https://github.com/amaurymartiny/check-if-email-exists

Dzięki połączeniu różnych technik przeskakiwania przez obręcze udaje mi się zweryfikować około 80% e-maili sprawdzanych przez moich klientów.


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

?>

Użytkownik prosi o rozwiązanie .Net, a nie php.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.