Como validar um endereço de E-mail em PHP

Tenho esta função para validar um endereço de E-mail:

function validateEMAIL($EMAIL) {
    $v = "/[a-zA-Z0-9_-.+]+@[a-zA-Z0-9-]+.[a-zA-Z]+/";

    return (bool)preg_match($v, $EMAIL);
}
Pode verificar se o endereço de E-mail é válido ou não?

Author: hakre, 2012-08-19

9 answers

A maneira mais fácil e segura de verificar se um endereço de E-mail está bem formado é usar o filter_var() função:
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    // invalid emailaddress
}

Para além disso, poderá verificar se o domínio define um registo MX:

if (!checkdnsrr($domain, 'MX')) {
    // domain is not valid
}
Mas isto não garante que o correio exista. A única maneira de descobrir isso é enviando um e-mail de confirmação.
Agora que já tem a sua resposta fácil, sinta-se à vontade para ler sobre a validação do endereço de E-mail se quiser aprender ou não. basta usar a resposta rápida e seguir em frente. Sem ressentimentos.

Tentar validar um endereço de E-mail usando uma expressão regular é uma tarefa "impossível". Eu diria que esse regex que você fez é inútil. Há três rfc a respeito de emailadresses e escrever um regex para pegar emailadresses errados e, ao mesmo tempo, não ter falsos positivos é algo que nenhum mortal pode fazer. Confira esta lista para testes (ambos falhados e bem-sucedidos) da regex usada pelo PHP filter_var() funcao.

Mesmo as funções PHP incorporadas, os clientes de E-mail ou os servidores não entendem bem. Ainda na maioria dos casos filter_var é a melhor opção.

Se quiser saber qual o padrão regex que o PHP (actualmente) usa para validar os endereços de E-Mail, veja o código PHP.

Se quiser saber mais sobre endereços de E-mail, sugiro que comece a ler as especificações, mas devo avisá-lo que não é uma leitura fácil de qualquer um. esticar:

Note que filter_var() está tal como já indicado apenas disponível a partir de PHP 5.2. No caso de querer que funcione com versões anteriores do PHP, poderá usar a expressão regular utilizada no PHP:

<?php

$pattern = '/^(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){255,})(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){65,}@)(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22))(?:\\.(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-+[a-z0-9]+)*\\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-+[a-z0-9]+)*)|(?:\\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\\]))$/iD';

$emailaddress = '[email protected]';

if (preg_match($pattern, $emailaddress) === 1) {
    // emailaddress is valid
}

P. S. A note on the regex pattern used above (from the PHP source). Ele parece que tem alguns direitos de autor de Michael Rushton. Como indicado: "Sinta-se livre para usar e redistribuir este código. Mas por favor, mantenha este Aviso de copyright."

 465
Author: PeeHaa, 2018-05-24 14:33:51

Pode usar filter_var para isto.

<?php
   function validateEmail($email) {
      return filter_var($email, FILTER_VALIDATE_EMAIL);
   }
?>
 32
Author: Cameron Martin, 2015-04-22 07:26:07

Na minha experiência, regex as soluções têm demasiados falsos positivos e filter_var() as soluções têm falsos negativos (especialmente com todos os mais recentes TLDs ).

Em vez disso, é melhor certificar-se de que o endereço tem todas as partes necessárias de um endereço de E-mail (Usuário, símbolo"@", e domínio), em seguida, verificar se o domínio em si existe.

Não há forma de determinar (lado do servidor) se existe um utilizador de E-mail para um domínio externo.

Este é um método que criei num Classe de utilidade:
public static function validateEmail($email)
{
    // SET INITIAL RETURN VARIABLES

        $emailIsValid = FALSE;

    // MAKE SURE AN EMPTY STRING WASN'T PASSED

        if (!empty($email))
        {
            // GET EMAIL PARTS

                $domain = ltrim(stristr($email, '@'), '@') . '.';
                $user   = stristr($email, '@', TRUE);

            // VALIDATE EMAIL ADDRESS

                if
                (
                    !empty($user) &&
                    !empty($domain) &&
                    checkdnsrr($domain)
                )
                {$emailIsValid = TRUE;}
        }

    // RETURN RESULT

        return $emailIsValid;
}
 10
Author: Jabari, 2018-02-09 18:26:36

Acho que seria melhor usar os filtros do PHP inbuilt - neste caso em particular:

Pode devolver um verdadeiro ou falso quando fornecido com o {[[0]} param.

 8
Author: Fluffeh, 2012-08-19 13:32:43

Isto não só validará o seu e-mail, como também o sanitizará para caracteres inesperados:

$email  = $_POST['email'];
$emailB = filter_var($email, FILTER_SANITIZE_EMAIL);

if (filter_var($emailB, FILTER_VALIDATE_EMAIL) === false ||
    $emailB != $email
) {
    echo "This email adress isn't valid!";
    exit(0);
}
 7
Author: Excalibur, 2017-03-23 07:51:45

Respondi a isto na "pergunta principal" sobre a verificação dos E-mails https://stackoverflow.com/a/41129750/1848217

Para mim, a forma correcta de verificar e-mails é:
  1. verifique se o símbolo @ existe, e antes e depois existem alguns símbolos Não -@: /^[^@]+@[^@]+$/
  2. tente enviar um e-mail para este endereço com algum "código de activação".
  3. Quando o utilizador "ativou" o seu endereço de E-mail, veremos que está tudo bem.

De claro, você pode mostrar algum aviso ou dica no front-end quando o usuário e-mail "estranho" escrito para ajudá - lo a evitar erros comuns, como não dot in domain part or spaces in name without quoting and so on. Mas você deve aceitar o endereço "hello@world" se o usuário realmente quiser.

Além disso, deve lembrar-se que o padrão do endereço de E-mail era e pode evolute, então você não pode apenas digitar algum" padrão-válido " uma vez e para sempre. E você deve lembrar que alguma internet concreta os servidores podem falhar alguns detalhes do padrão comum e, de facto, trabalhar com própria "norma modificada".

Então, basta verificar @, dica de utilizador na interface e enviar e-mails de verificação no endereço indicado.

 2
Author: FlameStorm, 2017-05-23 12:02:59

Se você está apenas à procura de uma réplica real que permite vários pontos, sublinhados e traços, é o seguinte: [a-zA-z0-9.-]+\@[a-zA-z0-9.-]+.[a-zA-Z]+. Isso permitirá que um email com um aspecto bastante estúpido como tom_anderson.1-neo@my-mail_matrix.com seja validado.

 0
Author: smulholland2, 2016-12-28 18:19:47

Se quiser verificar se o domínio fornecido pelo a partir do endereço de E-Mail é válido, use algo do tipo:

/*
* Check for valid MX record for given email domain
*/
if(!function_exists('check_email_domain')){
    function check_email_domain($email) {
        //Get host name from email and check if it is valid
        $email_host = explode("@", $email);     
        //Add a dot to the end of the host name to make a fully qualified domain name and get last array element because an escaped @ is allowed in the local part (RFC 5322)
        $host = end($email_host) . "."; 
        //Convert to ascii (http://us.php.net/manual/en/function.idn-to-ascii.php)
        return checkdnsrr(idn_to_ascii($host), "MX"); //(bool)       
    }
}

Esta é uma forma útil de filtrar muitos endereços de E-mail inválidos, juntamente com a validação de E-mail standart, porque o formato de E-mail válido não significa válido.

Note que idn_to_ascii() (ou a sua função irmã idn_to_utf8()) pode não estar disponível na sua instalação de PHP, requer extensões PECL intl > = 1,0.2 e PECL idn > = 0.1.

Tenha também em mente que o IPv4 ou o IPv6 como parte do domínio no email (por exemplo user@[IPv6:2001:db8::1]) não pode ser validado, apenas nomeado As máquinas podem.

Veja mais aqui.

 0
Author: bodi0, 2018-05-02 09:49:07
/(?![[:alnum:]]|@|-|_|\.)./
[[5]} Hoje em dia, se você usar um formulário HTML5 com {[[2]} então você já está 80% seguro, uma vez que os motores de navegador têm o seu próprio validador. Para complementá-lo, adicione este regex ao seu preg_match_all() e negá-lo:
if (!preg_match_all("/(?![[:alnum:]]|@|-|_|\.)./",$email)) { .. }

Procurar a expressão regular usada pelos formulários HTML5 para validação
https://regex101.com/r/mPEKmy/1

 -1
Author: Thielicious, 2017-08-14 12:32:09