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?
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?
Respostas:
Às vezes, existem dois métodos que você pode usar para determinar se um destinatário realmente existe:
Você pode se conectar ao servidor e emitir um VRFY
comando. 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
Você pode emitir um RCPT
e 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.
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: <me@myhost.com> 250 Ok rcpt para: <fake@stackoverflow.com> 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
, fwrite
e fread
para 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: <me@myhost.com>\r\n");
fwrite($smtp_server, "rcpt to: <fake@stackoverflow.com>\r\n");
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.
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 ....
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.
Alguns problemas:
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 .
"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.
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.
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
}
}
getmxrr
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.
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.
Posso confirmar as respostas de Joseph e Drew para usar RCTP TO: <address_to_check>
. Gostaria de acrescentar alguns pequenos adendos sobre essas respostas.
Alguns provedores de correio implementam uma política abrangente, o que significa que *@mydomain.com
retornará 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 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.
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.com
endereç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.
Pode ser um caso delicado, mas quando o usuário tiver uma caixa de entrada cheia, RCTP TO:
retornará uma 5.1.1 DSN
mensagem de erro dizendo que está cheia. Isso significa que a conta realmente existe!
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.
<?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";
?>