Jak sprawdzić, czy adres e-mail istnieje bez wysyłania wiadomości e-mail?

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

Czy ktoś próbował czegoś podobnego lub działa na Ciebie? Czy możesz stwierdzić, czy wprowadzony klient / użytkownik poczty e-mail jest poprawny i istnieje?

Author: SagarPPanchal, 2009-02-19

13 answers

Istnieją dwie metody, których możesz Czasami użyć do określenia, czy odbiorca rzeczywiście istnieje:

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

    VRFY user

  2. Możesz wystawić RCPT i sprawdzić, czy Poczta jest odrzucona.

    MAIL FROM:

    RCPT Do:

Jeśli użytkownik nie istnieje, otrzymasz 5.1.1 DSN. Jednak tylko dlatego, że wiadomość e-mail nie zostanie odrzucona, nie oznacza, że użytkownik istnieje. Niektóre serwery po cichu odrzucają takie żądania, aby zapobiec wyliczaniu użytkowników. Inne Serwery nie mogą zweryfikować użytkownika i muszą zaakceptować wiadomość niezależnie od tego.

Istnieje również technika antyspamowa o nazwie greylisting, która spowoduje, że serwer początkowo odrzuci adres, oczekując prawdziwego SMTP serwer spróbuje ponownie dostarczyć jakiś czas później. Spowoduje to bałagan w próbach weryfikacji adresu.

Szczerze mówiąc, jeśli próbujesz zweryfikować adres, najlepszym rozwiązaniem jest użycie prostego wyrażenia regularnego, aby zablokować oczywiście nieprawidłowe adresy, a następnie wysłać rzeczywistą wiadomość e-mail z linkiem z powrotem do systemu, który potwierdzi otrzymaną wiadomość e-mail. Zapewnia to również, że użytkownik wprowadził swój rzeczywisty e-mail, a nie lekką literówkę, która należy do kogoś innego.

 80
Author: Joseph Tary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-07 22:52:01

Inne odpowiedzi tutaj omawiają różne problemy z próbą zrobienia tego. Pomyślałem, że pokażę Ci, jak możesz tego spróbować, gdybyś chciał się 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
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's 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

Linie poprzedzone kodami numerycznymi są odpowiedziami z serwera SMTP. Dodałem kilka pustych linii, aby uczynić go bardziej czytelnym.

Wiele serwerów pocztowych nie zwróci tych informacji jako środka zapobiegającego zbieraniu adresu e-mail przez spamerów, więc nie możesz polegać na tej technice. Jednak możesz mieć pewien sukces w czyszczeniu niektórych oczywiście złych adresów e-mail, wykrywając nieprawidłowe Serwery Pocztowe lub odrzucając adresy odbiorców, jak powyżej.

Zauważ również, że serwery pocztowe mogą Cię na czarnej liście, jeśli wyślesz zbyt wiele żądań.


W PHP wierzę, że można użyć fsockopen, fwrite i fread aby wykonać powyższe kroki programowo:

$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");
 44
Author: Drew Noakes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-04 11:09:25

Ogólna odpowiedź jest taka, że możesz nie sprawdzić, czy istnieje adres e-mail, jeśli wyślesz na niego wiadomość e-mail: może po prostu wejść do czarnej dziury.

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

Gdzie interakcja użytkownika z jego skrzynką pocztową nie jest zbyt wiele stron faktycznie testować, że Poczta dotrzeć gdzieś wysyłając tajny numer, który należy wysłać z powrotem do emitera (albo przechodząc do tajnego adresu URL lub wysyłając ten tajny numer e-mailem). Większość list dyskusyjnych tak działa.

 8
Author: kmkaplan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-19 15:51:05

Niezupełnie.....Niektóre serwery mogą nie sprawdzać "rcpt TO:"

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

Robienie tego jest Zagrożeniem bezpieczeństwa.....

Jeśli serwer tak robi, możesz napisać bota, aby wykrył każdy adres na serwerze....

 6
Author: l_39217_l,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-19 14:26:19

To się nie powiedzie (między innymi), gdy docelowy serwer pocztowy używa greylisting.

Greylisting : serwer SMTP odmawia dostarczenia za pierwszym razem, gdy nieznany wcześniej klient się połączy, pozwala na następne czasy; to utrzymuje pewien procent spamujących, jednocześnie zezwalając na legalne użycie - , ponieważ oczekuje się, że legalny nadawca poczty spróbuje ponownie, Co zrobią normalni agenci pocztowi.

Jeśli jednak Twój kod sprawdza się na serwerze tylko raz , serwer z greylisting odmówi dostawy (ponieważ twój klient łączy się po raz pierwszy); o ile nie sprawdzisz ponownie za jakiś czas, możesz niepoprawnie odrzucić poprawne adresy e-mail.

 5
Author: Piskvor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-20 17:38:33

Niektóre zagadnienia:

  1. jestem pewien, że niektóre serwery SMTP poinformują cię natychmiast, jeśli podany adres nie istnieje, ale niektóre nie będą miarą prywatności. 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 na niektórych serwerach, będą Cię na czarnej liście.
  3. W przypadku niektórych serwerów SMTP (takich jak gmail), aby cokolwiek zrobić, musisz użyć protokołu SSL. to tylko prawda podczas korzystania z serwera SMTP Gmaila do wysyłania wiadomości e-mail.
 4
Author: Graeme Perrow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-19 15:08:33

" Czy możesz stwierdzić, czy wpisany klient / użytkownik poczty e-mail jest poprawny i istnieje?"

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

Czasami trzeba przyjąć dane użytkownika według wartości nominalnej. Istnieje wiele sposobów na pokonanie systemu w przeciwnym razie.

 2
Author: Learning,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-19 14:41:17

Wszystko, co możesz zrobić, to wyszukać DNS i upewnić się, że domena, która znajduje się w adresie e-mail, ma rekord MX, poza tym, że nie ma wiarygodnego sposobu radzenia sobie z tym.

Niektóre serwery mogą pracować z metodą rcpt-to, gdzie rozmawiasz z serwerem SMTP, ale zależy to całkowicie od konfiguracji serwera. Innym problemem może być przeciążony serwer może zwrócić kod 550 mówiący, że użytkownik jest nieznany, ale jest to tymczasowy błąd, jest stały błąd (451 myślę?), które mogą być zwrócony. To zależy CAŁKOWICIE od konfiguracji serwera.

Osobiście sprawdziłbym rekord DNS MX, a następnie wysłał e-mail z weryfikacją, czy rekord MX istnieje.

 2
Author: Bryan Rehbein,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-19 15:47:58
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
    }
}
 2
Author: Sachin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-17 22:52:57

Chociaż to pytanie jest trochę stare, ta wskazówka może pomóc użytkownikom szukającym podobnego rozwiązania w sprawdzaniu adresów e-mail poza weryfikacją składni przed wysłaniem.

Używam tego open sourced service do bardziej dogłębnego sprawdzania wiadomości e-mail (sprawdzanie rekordów mx w domenie adresu e-mail itp.) dla kilku projektów z dobrymi wynikami. Sprawdza również typowe literówki czarownica jest bardzo przydatna. Demo TUTAJ .

 2
Author: Henkealg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-16 07:25:41

Zakładając, że jest to adres użytkownika, Niektóre serwery pocztowe zezwalają poleceniu SMTP VRFY na weryfikację adresu e-mail w swoich skrzynkach pocztowych. Większość głównych witryn nie da ci zbyt wiele informacji; odpowiedź Gmaila brzmi :" jeśli spróbujesz wysłać go pocztą, postaramy się ją dostarczyć " lub coś sprytnego w tym stylu.

 1
Author: Austin Salonen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-19 15:02:59

Myślę, że nie możesz, Jest tyle scenariuszy, w których nawet wysłanie e-maila może się nie udać. Np. serwer pocztowy Po Stronie Użytkownika jest chwilowo wyłączony, Skrzynka pocztowa istnieje, ale jest pełna, więc wiadomość nie może być dostarczona, itd.

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

 1
Author: PhiLho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-19 15:07:10
<?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";

?>
 -6
Author: user4314333,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-02 06:36:17