Como verificar se existe um endereço de email sem enviar um email?

123

Encontrei este código PHP para verificar o endereço de email usando SMTP sem enviar um email .

Alguém já tentou algo semelhante ou funciona para você? Você pode dizer se um cliente / usuário de e-mail digitado está correto e existe?

php-guy
fonte
2
Imaginando, por que isso tem a tag Telnet?
Piccolo
2
Há uma biblioteca PHP que faz exatamente isso: github.com/kickboxio/kickbox-php
Dan
O Kickbox não é gratuito. Essa API é apenas um invólucro para se conectar ao seu serviço.
Ashit Vora

Respostas:

92

Às vezes, existem dois métodos que você pode usar para determinar se um destinatário realmente existe:

  1. Você pode se conectar ao servidor e emitir um VRFYcomando. Pouquíssimos servidores suportam esse comando, mas o objetivo é exatamente isso. Se o servidor responder com um DSN 2.0.0, o usuário existe.

    VRFY user
  2. Você pode emitir um RCPTe ver se o email foi rejeitado.

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

Se o usuário não existir, você receberá um DSN 5.1.1. No entanto, apenas porque o email não foi rejeitado, não significa que o usuário exista. Alguns servidores descartam silenciosamente solicitações como essa para impedir a enumeração de seus usuários. Outros servidores não podem verificar o usuário e precisam aceitar a mensagem independentemente.

Há também uma técnica antispam chamada greylisting, que fará com que o servidor rejeite o endereço inicialmente, esperando que um servidor SMTP real tente uma entrega novamente algum tempo depois. Isso atrapalhará as tentativas de validar o endereço.

Honestamente, se você está tentando validar um endereço, a melhor abordagem é usar uma regex simples para bloquear endereços obviamente inválidos e, em seguida, enviar um email real com um link para o seu sistema para validar o recebimento do email. Isso também garante que o usuário inseriu o e-mail real, não um pequeno erro de digitação que pertença a outra pessoa.

Joseph Tary
fonte
10
Alguns servidores até aceitam a mensagem, mas depois enviam uma mensagem de erro de volta ao remetente do envelope, especialmente se for uma organização grande com muitos departamentos internos com seus próprios servidores de correio. O servidor de borda pode nem conhecer todas as contas.
David Mårtensson
3
Então, por que os remetentes de spam não usam esse método para verificar os addies de email? Quero dizer de lado o fato de que esses métodos são suportados por muito poucos servidores. Ou eles?
Shahriyar Imanov 28/02
7
@ Shehi: Na verdade, os spammers podem usar esse método, é difícil dizer. No entanto, como os spammers podem usá-lo, quase todos os servidores de email desabilitam o VRFY; portanto, na prática, o VRFY provavelmente é inútil.
sleske
2
Você pode dar um exemplo de código de como usar um RCPT TO: <usuário @ domínio>? Obrigado
Papa De Beau
4
Para VRFY, responde gmail "Envie alguns e-mails, eu vou tentar o meu melhor" ;-)
Armel Larcier
46

Outras respostas aqui discutem os vários problemas ao tentar fazer isso. Pensei em mostrar como você pode tentar isso, caso queira aprender fazendo você mesmo.

Você pode se conectar a um servidor de email via telnet para perguntar se existe um endereço de email. Aqui está um exemplo de teste de um endereço de email parastackoverflow.com :

C: \> nslookup -q = mx stackoverflow.com
Resposta não autorizada:
stackoverflow.com preferência MX = 40, trocador de correio = STACKOVERFLOW.COM.S9B2.PSMTP.com
stackoverflow.com preferência MX = 10, servidor de mensagens = STACKOVERFLOW.COM.S9A1.PSMTP.com
stackoverflow.com preferência MX = 20, trocador de correio = STACKOVERFLOW.COM.S9A2.PSMTP.com
stackoverflow.com preferência MX = 30, trocador de correio = STACKOVERFLOW.COM.S9B1.PSMTP.com

C: \> telnet STACKOVERFLOW.COM.S9A1.PSMTP.com 25
220 Postini ESMTP 213 y6_35_0c4 pronto. A Seção 17538.45 do Código de Negócios e Profissões da CA proíbe o uso deste sistema para anúncios de correio eletrônico não solicitados.

olá olá
250 Postini diz Olá de volta

email de: <[email protected]>
250 Ok

rcpt para: <[email protected]>
550-5.1.1 A conta de email que você tentou acessar não existe. Tente por favor
550-5.1.1 verificando novamente o endereço de e-mail do destinatário quanto a erros de digitação ou
550-5.1.1 espaços desnecessários. Saiba mais em
550 5.1.1 http://mail.google.com/support/bin/answer.py?answer=6596 w41si3198459wfd.71

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 servidores de email não retornam essas informações como forma de impedir a coleta de endereços de email por remetentes de spam, portanto, você não pode confiar nessa técnica. No entanto, você pode ter algum êxito na limpeza de alguns endereços de email obviamente ruins, detectando servidores de email inválidos ou tendo os endereços de destinatários rejeitados como acima.

Observe também que os servidores de email podem colocar você na lista negra se você fizer muitos pedidos.


No PHP eu acredito que você pode usar fsockopen, fwritee freadpara executar os passos acima programaticamente:

$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");
Drew Noakes
fonte
Tiremos o chapéu! um problema que encontrei é, a porta 25 sempre funciona com registro mx de baixa prioridade?
Dhruvenkumar Shah 03/12/12
@DhruvenkumarShah, desculpe, eu não sei. Se você descobrir, comente novamente.
Drew Noakes
Olá, eu estava apenas tentando minha conta da universidade descobrir tudo sobre os registros MX, mas não funcionou para 25 .. mas o tipo de site on-line confirm-email.org funcionou .. como eles estão fazendo isso. vai deixar você saber sobre isso se eu encontrá-lo fora
Dhruvenkumar Shah
1
@DhruvenkumarShah, fornece poucos nomes de servidores de troca de correio. veja a resposta para trocadores de correio. portanto, se um falhar, outro da lista deve funcionar.
Janaka R Rajapaksha
realmente muito ajuda completa para mim .. obrigado senhor .. eu tentei em massa e funciona como encantos .. obrigado ..
Mohammed Sufian
8

A resposta geral é que você não pode verificar se existe um endereço de email, se você enviar um email para ele: ele pode entrar em um buraco negro.

Dito isto, o método descrito é bastante eficaz. É usado no código de produção no ZoneCheck, exceto pelo uso do RSET em vez de QUIT.

Onde a interação do usuário com a caixa de correio não é muito cara, muitos sites realmente testam se o email chega a algum lugar enviando um número secreto que deve ser enviado de volta ao emissor (acessando um URL secreto ou enviando esse número secreto por email). A maioria das listas de discussão funciona assim.

kmkaplan
fonte
6

Na verdade, não ... Alguns servidores podem não marcar o "rcpt to:"

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

Fazer isso é um risco à segurança ...

Se o servidor o fizer, você pode escrever um bot para descobrir todos os endereços no servidor ....

l_39217_l
fonte
eu estava pensando sobre isso também :)
Janaka R Rajapaksha
6

Isso falhará (entre outros casos) quando o servidor de email de destino usar a lista cinza.

Lista de cinzas : o servidor SMTP recusa a entrega na primeira vez em que um cliente anteriormente desconhecido se conecta, permite a próxima vez; isso mantém alguma porcentagem de spambots, enquanto permite o uso legítimo - como é esperado que um remetente legítimo de e-mail tente novamente , que é o que os agentes normais de transferência de mensagens farão.

No entanto, se o seu código apenas verificar o servidor uma vez , um servidor com lista cinza negará a entrega (como seu cliente está se conectando pela primeira vez); a menos que você verifique novamente em alguns instantes, você pode estar rejeitando incorretamente endereços de email válidos.

Piskvor saiu do prédio
fonte
(experiência pessoal: tive que argumentar com o meu provedor de e-mail que sim , eu sei o que estou fazendo e sim , preciso da lista de espera - porque essas verificações de um serviço de terceiros estavam falhando )
Piskvor saiu do prédio
4

Alguns problemas:

  1. Tenho certeza de que alguns servidores SMTP informarão imediatamente se um endereço que você fornecer não existir, mas outros não como medida de privacidade. Eles simplesmente aceitam os endereços que você fornecer e ignoram silenciosamente os que não existem.
  2. Como o artigo diz, se você fizer isso com muita frequência com alguns servidores, eles entrarão na lista negra de você.
  3. Para alguns servidores SMTP (como o gmail), você precisa usar SSL para fazer qualquer coisa. Isso só é verdade ao usar o servidor SMTP do gmail para enviar email.
Graeme Perrow
fonte
Em relação ao terceiro ponto, isso só acontece se você quiser usá-lo como um relé. Não conheço nenhum trocador de correio que exija SSL. Se alguém fizesse isso, eles parariam de receber emails de muitos usuários.
Kmkaplan 19/02/09
Desculpe meu erro. Se você deseja enviar um email usando o servidor SMTP do gmail, use o SSL.
Graeme Perrow
3

Embora essa pergunta seja um pouco antiga, essa dica de serviço pode ajudar os usuários a procurar uma solução semelhante para verificar endereços de email além da validação de sintaxe antes do envio.

Eu tenho usado esse serviço de código aberto para uma validação mais aprofundada de emails (verificação de registros mx no domínio do endereço de email etc.) em alguns projetos com bons resultados. Ele também verifica erros de digitação comuns, o que é bastante útil. Demonstração aqui .

Henkealg
fonte
Você alega que este serviço é de código aberto. Você poderia fornecer um link para a fonte?
amaurymartiny 13/06
Desculpe @amaurymartiny, não posso. No momento em que escrevi, o projeto Mailgun era de código aberto, se bem me lembro, mas não consigo encontrar um link para qualquer repositório que forneça a fonte após esse período.
Henkealg 13/06
2

"Você pode dizer se um cliente / usuário de email entra está correto e existe?"

Na verdade, essas são duas coisas separadas. Pode existir mas pode não estar correto.

Às vezes, é necessário considerar as entradas do usuário pelo valor nominal. Existem muitas maneiras de derrotar o sistema.

Aprendendo
fonte
2
+1 Você nunca pode ter certeza de que está correto sem enviar um email e obter uma resposta humana para ele, como clicar em um link.
22630 Daniel Daranas
você pode manter um link (para uma imagem, etc.) no corpo do email e contar cada carregamento desse link. Não há necessidade de esperar por cliques
Janaka R Rajapaksha
2

Tudo o que você pode fazer é pesquisar no DNS e garantir que o domínio que está no endereço de email tenha um registro MX, exceto que não existe uma maneira confiável de lidar com isso.

Alguns servidores podem funcionar com o método rcpt-to no qual você fala com o servidor SMTP, mas isso depende inteiramente da configuração do servidor. Outro problema pode ser que um servidor sobrecarregado possa retornar um código 550 dizendo que o usuário é desconhecido, mas esse é um erro temporário, há um erro permanente (451, eu acho?) Que pode ser retornado. Isso depende inteiramente da configuração do servidor.

Pessoalmente, verificaria o registro MX do DNS e enviaria uma verificação por e-mail se o registro MX existir.

Bryan Rehbein
fonte
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
    }
}
Sachin
fonte
1
porta 80 não faz sentido
jrosell
5
Eu acho que é apenas verificar o nome do domínio, em vez de verificar o próprio email.
The Angry Saxon
Isso pode ser mais útil:getmxrr
jchook 25/03
1

Supondo que seja o endereço do usuário , alguns servidores de email permitem que o comando SMTP VRFY verifique o endereço de email nas caixas de correio. A maior parte do site principal não fornece muitas informações; a resposta do gmail é "se você tentar enviá-lo, tentaremos entregá-lo" ou algo inteligente como esse.

Austin Salonen
fonte
1

Eu acho que você não pode, existem muitos cenários em que até o envio de um email pode falhar. Por exemplo. o servidor de correio no lado do usuário está temporariamente inoperante, a caixa de correio existe, mas está cheia; portanto, a mensagem não pode ser entregue etc.

É provavelmente por isso que muitos sites validam um registro depois que o usuário confirma que recebeu o email de confirmação.

PhiLho
fonte
0

Posso confirmar as respostas de Joseph e Drew para usar RCTP TO: <address_to_check>. Gostaria de acrescentar alguns pequenos adendos sobre essas respostas.

Fornecedores abrangentes

Alguns provedores de correio implementam uma política abrangente, o que significa que *@mydomain.comretornará positivo para oRCTP TO: comando. Mas isso não significa necessariamente que a caixa de correio "exista", como em "pertence a um ser humano". Nada muito pode ser feito aqui, apenas esteja ciente.

Lista negra / lista negra de IP

Lista cinza: a 1ª conexão de IP desconhecido está bloqueada. Solução: tente novamente pelo menos 2 vezes.

Lista negra: se você enviar muitas solicitações do mesmo IP, esse IP será bloqueado. Solução: use rotação IP; Reacher usa Tor.

Solicitações HTTP em formulários de inscrição

Isso é muito específico do provedor, mas às vezes você pode usar solicitações HTTP bem criadas e analisar as respostas dessas solicitações para verificar se um nome de usuário já se inscreveu ou não nesse provedor.

Aqui está a função relevante de uma biblioteca de código aberto que escrevi para verificar *@yahoo.comendereços usando solicitações HTTP: verifique se existe um email . Eu sei que meu código é Rust e esse tópico está marcado como PHP, mas as mesmas idéias se aplicam.

Caixa de entrada completa

Pode ser um caso delicado, mas quando o usuário tiver uma caixa de entrada cheia, RCTP TO:retornará uma 5.1.1 DSNmensagem de erro dizendo que está cheia. Isso significa que a conta realmente existe!

Divulgação

Eu corro Reacher , um tempo real de verificação de e-mail API. Meu código está escrito em Rust e é 100% de código aberto. Confira se você deseja uma solução mais robusta:

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

Com uma combinação de várias técnicas para avançar, consigo verificar cerca de 80% dos e-mails que meus clientes verificam.

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

?>
user4314333
fonte
O usuário está solicitando uma solução .Net, não php.