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?13 answers
Existem dois métodos que você pode algumas vezes usar para determinar se um destinatário realmente existe:
-
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
-
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.
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");
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.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....
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.
Algumas questões:
- 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.
- Como diz O artigo, se fizer isto com demasiada frequência com alguns servidores, eles vão colocar-lhe uma lista negra.
-
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.
" 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.
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.
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
}
}
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 .
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.
<?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";
?>