Como verificar se existe um endereço de E-mail sem enviar um e-mail?

deparei-me com este código de PHP para verificar o endereço de E-mail usando o SMTP sem enviar um email.

Alguém tentou algo parecido ou funcionou para ti? Pode dizer se um cliente / utilizador de E-mail entra está correcto e existe?

Author: SagarPPanchal, 2009-02-19

13 answers

Existem dois métodos que você pode algumas vezes usar para determinar se um destinatário realmente existe:

  1. Pode ligar-se ao servidor e emitir um comando VRFY. Muito poucos servidores suportam este comando, mas ele é destinado exatamente para isso. Se o servidor responde com um 2.0 DSN, o usuário existe.

    Utilizador do VRFY

  2. Você pode emitir um RCPT, e ver se o correio é rejeitado.

    CORREIO DE:

    RCPT Para:

Se o utilizador não existir, obterá um DSN 5.1.1. No entanto, só porque o e-mail não é rejeitado, não significa que o usuário existe. Algum servidor irá silenciosamente descartar pedidos como este para evitar a enumeração de seus usuários. Outros servidores não podem verificar o Usuário, e têm que aceitar a mensagem independentemente.

Existe também uma técnica anti-spam chamada greylisting, que fará com que o servidor rejeite o endereço inicialmente, esperando um SMTP real o servidor tentaria uma Re-entrega algum tempo depois. Isto vai estragar as tentativas de validar o endereço.

Honestamente, se está a tentar validar um endereço, a melhor abordagem é usar uma simples expressão regular para bloquear endereços obviamente inválidos, e depois enviar um e-mail real com um link de volta para o seu sistema que irá validar o e-mail foi recebido. Isso também garante que o usuário entrou em seu e-mail real, não um erro de digitação que acontece pertencer a outra pessoa.

 80
Author: Joseph Tary, 2016-06-07 22:52:01
Outras respostas Aqui discutem os vários problemas de tentar fazer isso. Pensei em mostrar-te como podes tentar isto, caso queiras aprender a fazê-lo sozinho.

Pode ligar-se a um servidor de E-mail através de telnet para perguntar se existe um endereço de E-mail. Aqui está um exemplo de testar um endereço de E-mail para 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

As linhas prefixadas com códigos numéricos são respostas do servidor SMTP. Eu adicionei algumas linhas em branco para torná-lo mais legível.

Muitos e-mails os servidores não devolverão esta informação como um meio para evitar a colheita de endereços de E-mail por spammers, por isso você não pode confiar nesta técnica. No entanto, você pode ter algum sucesso na limpeza de alguns endereços de E-mail obviamente ruim, detectando servidores de E-mail inválidos, ou ter endereços de destinatário rejeitado como acima.

Note também que os servidores de E-mail podem colocá-lo na lista negra se fizer demasiados pedidos deles.


Em PHP acredito que podes usar fsockopen, fwrite e fread para executar o acima de etapas programáticas:

$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, 2012-12-04 11:09:25

A resposta geral é que você pode não Verificar se existe um evento de E-mail se você enviar um e-mail para ele: ele pode simplesmente ir para um buraco negro.

Dito isto, o método descrito é bastante eficaz. Ele é usado em código de produção em ZoneCheck exceto que ele usa RSET em vez de sair. Onde a interacção do utilizador com a sua caixa de correio não é exageradamente, muitos sites testam que a correspondência chega a algum lado, enviando um número secreto que deve ser enviado de volta para o emissor (quer indo para um URL secreto ou enviando de volta este número secreto por e-mail). A maioria das listas de correio funciona assim.
 8
Author: kmkaplan, 2009-02-19 15:51:05
Na verdade, não.....Algum servidor pode não verificar o "rcpt para:"

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

Fazê-lo é um risco para a segurança.....

Se o servidor o fizer, poderá escrever um bot para descobrir todos os endereços no servidor....

 6
Author: l_39217_l, 2009-02-19 14:26:19

Isto irá falhar (entre outros casos) quando o servidor de correio alvo usar a lista de greylisting.

Greylisting : o servidor de SMTP recusa a entrega da primeira vez que um cliente anteriormente desconhecido Se liga, permite a(s) próxima (s) Vez (s); isto mantém alguma percentagem de spambots fora, ao mesmo tempo que permite o uso legítimo - , dado que é esperado que um remetente de E-mail legítimo volte a tentar, o que é o que os agentes normais de transferência de E-mail farão.

No entanto, se o seu código só verificar no servidor uma vez, um servidor com listagem cinzenta irá negar a entrega (dado que o seu cliente está a ligar-se pela primeira vez); a menos que volte a verificar daqui a pouco, poderá estar incorrectamente a rejeitar os endereços de E-mail válidos.

 5
Author: Piskvor, 2011-05-20 17:38:33

Algumas questões:

  1. tenho a certeza que alguns servidores SMTP irão avisar-te imediatamente se um endereço que lhes dês não existir, mas alguns não como medida de Privacidade. Aceitarão as moradas que lhes der e ignorarão silenciosamente as que não existem.
  2. Como diz O artigo, se fizer isto com demasiada frequência com alguns servidores, eles vão colocar-lhe uma lista negra.
  3. para alguns servidores SMTP( como o gmail), você precisa usar SSL para fazer qualquer coisa. isto é ... só é verdadeiro quando usar o servidor de SMTP do gmail para o enviar o email.
 4
Author: Graeme Perrow, 2009-02-19 15:08:33

" pode dizer se um cliente / utilizador de E-mail entra está correcto e existe?"

Na verdade, estas são duas coisas distintas. Pode existir mas pode não estar correcto.

Às vezes é preciso levar as entradas do utilizador pelo valor facial. Há muitas maneiras de derrotar o sistema de outra forma.

 2
Author: Learning, 2009-02-19 14:41:17

Sobre tudo o que você pode fazer é procurar DNS e garantir que o domínio que está no endereço de E-mail tem um registro MX, além de que não há nenhuma maneira confiável de lidar com isso.

Alguns servidores podem funcionar com o método rcpt-to onde você fala com o servidor SMTP, mas depende inteiramente da configuração do servidor. Outra questão pode ser um servidor sobrecarregado pode retornar um código 550 dizendo que o Usuário é Desconhecido, mas este é um erro temporário, há um erro permanente(451 eu acho?) que pode ser devolvido. Isto depende inteiramente da configuração do servidor.

Eu pessoalmente Verificaria para o registro DNS MX, em seguida, enviar uma verificação de E-mail se o registro MX existe.

 2
Author: Bryan Rehbein, 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, 2015-11-17 22:52:57

Embora esta questão seja um pouco antiga, esta dica de Serviço poderá ajudar os utilizadores a procurar uma solução semelhante a verificar endereços de E-mail para além da validação da sintaxe antes de enviar.

Tenho estado a usar este open sourced service para uma validação mais aprofundada dos E-mails (a verificar os registos mx no domínio do endereço de E-mail, etc.) para alguns projectos com bons resultados. Ele também verifica para Bruxa comum typos é bastante útil. Demo aqui .

 2
Author: Henkealg, 2016-06-16 07:25:41

Assumindo que é o endereço do utilizador, alguns servidores de E-mail permitem que o comando SMTP VRFY Verifique de facto o endereço de E-mail com as suas caixas de correio. A maioria do site principal não lhe dará muita informação; a resposta do gmail é "se você tentar enviá-lo, vamos tentar entregá-lo" ou algo inteligente como isso.

 1
Author: Austin Salonen, 2009-02-19 15:02:59
Acho que não podes, há tantos cenários em que até o envio de um e-mail pode falhar. Exemplo. o servidor de E-mail do lado do Utilizador está temporariamente em baixo, a caixa de correio existe, mas está cheia, por isso a mensagem não pode ser entregue, etc. É provavelmente por isso que tantos sites validam um registo após o utilizador confirmar que receberam o e-mail de confirmação.
 1
Author: PhiLho, 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, 2014-12-02 06:36:17