Qual é o código mais elegante para validar que uma string é um endereço de email válido?
c#
email
email-validation
leora
fonte
fonte
Respostas:
Que tal isso?
Para esclarecer, a pergunta é perguntar se uma sequência específica é uma representação válida de um endereço de email, não se um endereço de email é um destino válido para enviar uma mensagem. Para isso, a única maneira real é enviar uma mensagem para confirmar.
Observe que os endereços de email são mais tolerantes do que você imagina. Todas estas são formas perfeitamente válidas:
Para a maioria dos casos de uso, um falso "inválido" é muito pior para seus usuários e provas futuras do que um falso "válido". Aqui está um artigo que costumava ser a resposta aceita para esta pergunta (essa resposta já foi excluída). Ele tem muito mais detalhes e algumas outras idéias de como resolver o problema.
O fornecimento de verificações de sanidade ainda é uma boa idéia para a experiência do usuário. Supondo que o endereço de e-mail seja válido, você pode procurar domínios de nível superior conhecidos, verificar se há um registro MX no domínio, verificar erros de ortografia em nomes de domínio comuns (gmail.cmo) etc. Em seguida, apresente um aviso informando ao usuário a chance de dizer "sim, meu servidor de email realmente permite 🌮🍳🎁 como endereço de email".
Quanto ao uso de manipulação de exceção para a lógica de negócios, concordo que isso é algo a ser evitado. Mas esse é um daqueles casos em que a conveniência e a clareza podem superar o dogma.
Além disso, se você fizer mais alguma coisa com o endereço de e-mail, provavelmente envolverá transformá-lo em um endereço de email. Mesmo se você não usar essa função exata, provavelmente desejará usar o mesmo padrão. Você também pode verificar tipos específicos de falha capturando diferentes exceções : formato nulo, vazio ou inválido.
De acordo com o comentário de Stuart, isso compara o endereço final com a string original em vez de sempre retornar true. MailAddress tenta analisar uma seqüência de caracteres com espaços nas partes "Nome para exibição" e "Endereço", para que a versão original retornasse falsos positivos.
--- Leitura adicional ---
Documentação para System.Net.Mail.MailAddress
Explicação do que constitui um endereço de email válido
fonte
System.Net.Mail
classes para enviar e-mail, o que provavelmente será se estiver usando o .NET. Decidimos usar esse tipo de validação simplesmente porque não faz sentido aceitar endereços de email - mesmo válidos - para os quais não podemos enviar emails.IsValidEmail("this is not valid@email$com");
Esta é uma pergunta antiga, mas todas as respostas que encontrei no SO, incluindo as mais recentes, são respondidas de maneira semelhante a esta. No entanto, no .Net 4.5 / MVC 4, você pode adicionar a validação de endereço de email a um formulário, adicionando a anotação [EmailAddress] de System.ComponentModel.DataAnnotations, então fiquei pensando por que não poderia usar apenas a funcionalidade interna. Rede em geral.
Isso parece funcionar e me parece bastante elegante:
fonte
EmailAddressAttribute
é menos permissivo do que,System.Net.Mail.MailAddress
por exemplo,MailAddress
aceita um endereço para um TLD. Apenas algo a ter em mente se você precisar ser o mais permissivo possível.foo.IsValid(null);
retornatrue
.Eu uso esse método de liner único que faz o trabalho para mim
Pelos comentários, isso "falhará" se o
source
(o endereço de email) for nulo.fonte
public static Boolean IsValidMailAddress(this String pThis) => pThis == null ? false : new EmailAddressAttribute().IsValid(pThis);
public static bool IsValidEmailAddress(this string address) => address != null && new EmailAddressAttribute().IsValid(address);
false
para seqüências nulas. É por isso que proponho a (melhor ainda melhor) ++ versão:public static bool IsValidEmailAddress(this string address) => new EmailAddressAttribute().IsValid(address ?? throw new ArgumentNullException());
. Agora irei encontrar a Igreja Reformada dos Versionistas Ainda Melhores..net 4.5 adicionado System.ComponentModel.DataAnnotations.EmailAddressAttribute
Você pode procurar a fonte do EmailAddressAttribute , este é o Regex que ele usa internamente:
fonte
RegexOptions.IgnoreCase
porque esse padrão não permite letras maiúsculas explicitamente!Peguei a resposta de Phil do nº 1 e criei esta classe. Chame assim:
bool isValid = Validator.EmailIsValid(emailString);
Aqui está a classe:
fonte
Pessoalmente, eu diria que você deve apenas garantir que haja um símbolo @, com possivelmente a. personagem. Você pode usar muitas expressões regulares de correção variável, mas acho que a maioria deixa de fora endereços de email válidos ou deixa passar endereços inválidos. Se as pessoas quiserem inserir um endereço de e-mail falso, eles o inserirão. Se você precisar verificar se o endereço de email é legítimo e se a pessoa está no controle desse endereço de email, será necessário enviar um email com um link codificado especial para que eles possam verificar se realmente é um endereço real.
fonte
Eu acho que a melhor maneira é a seguinte:
Você pode ter essa função estática em uma classe geral.
fonte
Código curto e preciso
fonte
A maneira mais elegante é usar os métodos incorporados do .Net.
Estes métodos:
São experimentados e testados. Esses métodos são usados em meus próprios projetos profissionais.
Use expressões regulares internamente, confiáveis e rápidas.
Feito pela Microsoft para C #. Não há necessidade de reinventar a roda.
Retornar um resultado booleano. Verdadeiro significa que o email é válido.
Para usuários do .Net 4.5 e superior
Adicione esta referência ao seu projeto:
Agora você pode usar o seguinte código:
Exemplo de uso
Aqui estão alguns métodos para declarar:
... e código demonstrando-os em ação:
Além disso, este exemplo:
;
.Alternativa, para usuários de uma versão do .Net menor que 4.5
Para situações em que o .Net 4.5 não está disponível, eu uso a seguinte solução:
Especificamente, eu uso:
fonte
EmailAddressAttribute
por pouco menos de quatro meses, apesar de este pegar onull
problema.Para ser honesto, no código de produção, o melhor que faço é procurar um
@
símbolo.Nunca estou em um local para validar completamente os e-mails. Você sabe como eu vejo se era realmente válido? Se foi enviado. Se não, é ruim, se é, a vida é boa. É tudo o que preciso saber.
fonte
Acho que esse regex é uma boa opção entre verificar algo além da marca @ e aceitar casos extremos estranhos:
Isso fará com que você coloque algo em torno da marca @ e coloque pelo menos um domínio com aparência normal.
fonte
bob@companyinternal
?A validação do endereço de email não é tão fácil quanto parece. Na verdade, é teoricamente impossível validar completamente um endereço de email usando apenas uma expressão regular.
Confira meu post sobre isso para uma discussão sobre o assunto e uma implementação de F # usando FParsec. [/ shameless_plug]
fonte
Aqui está a minha resposta - a solução de Phil falha em domínios de letra única como "[email protected]". Acredite ou não, isso é usado =) (vai para centurylink, por exemplo).
A resposta de Phil também funcionará apenas com o padrão PCRE ... então o C # aceitará, mas o javascript está bombando. É muito complexo para javascript. Portanto, você não pode usar a solução de Phil para atributos de validação de mvc.
Aqui está o meu regex. Funcionará bem com os atributos de validação do MVC.
- Tudo antes do @ é simplificado, para que pelo menos o javascript funcione. Estou bem relaxando a validação aqui, desde que o servidor do Exchange não me dê um 5.1.3. - Tudo após o @ é a solução de Phil modificada para domínios de uma letra.
Para as pessoas que sugerem o uso de system.net.mail MailMessage (), essa coisa é MUITO flexível. Claro, o C # aceitará o email, mas o servidor do Exchange sofrerá um erro de tempo de execução 5.1.3 assim que você tentar enviar o email.
fonte
basket@ball
como endereço de e-mail válido tenha recebido a resposta correta e todos os votos positivos. Obrigado mesmo assim!Se você quer realmente saber se um endereço de e-mail é válido ... peça ao trocador de e-mail para provar isso, não é necessário regex. Eu posso fornecer o código, se solicitado.
As etapas gerais são as seguintes: 1. o endereço de email possui uma parte de nome de domínio? (índice de @> 0) 2. usando uma consulta DNS, pergunte se o domínio tem um trocador de correio 3. abra a conexão tcp com o trocador de correio 4. usando o protocolo smtp, abra uma mensagem para o servidor usando o endereço de email como destinatário 5. analisar a resposta do servidor. 6. saia da mensagem se você chegou até aqui, tudo está bem.
Isso é como você pode imaginar, muito caro em termos de tempo e depende do smtp, mas funciona.
fonte
De um modo geral, uma expressão regular para validar endereços de email não é algo fácil de se apresentar; no momento da redação deste artigo, a sintaxe de um endereço de email deve seguir um número relativamente alto de padrões e a implementação de todos eles em uma expressão regular é praticamente inviável!
Eu sugiro que você experimente a nossa EmailVerify.NET , uma biblioteca .NET madura que pode validar endereços de e-mail depois de tudo os padrões atuais da IETF (RFC 1123, RFC 2821, RFC 2822, RFC 3696, RFC 4291, RFC 5321 e RFC 5322) , testa os registros DNS relacionados, verifica se as caixas de correio de destino podem aceitar mensagens e até podem dizer se um determinado endereço está disponível ou não.
Isenção de responsabilidade: Eu sou o desenvolvedor principal deste componente.
fonte
fonte
Caso esteja usando o FluentValidation, você pode escrever algo simples assim:
fonte
uma pequena modificação na resposta @Cogwheel
fonte
Console.WriteLine(MailAddress("asdf@asdf.").Address);
gera "asdf @ asdf.", Que não é válido.Há muitas respostas fortes aqui. No entanto, recomendo dar um passo atrás. O @Cogwheel responde à pergunta https://stackoverflow.com/a/1374644/388267 . No entanto, pode ser caro em um cenário de validação em massa, se muitos dos endereços de email que estão sendo validados forem inválidos. Sugiro que empregemos um pouco de lógica antes de entrarmos no bloco try-catch. Eu sei que o código a seguir pode ser escrito usando o RegEx, mas pode ser caro para os novos desenvolvedores entenderem. Este é o meu valor de dois centavos:
fonte
A resposta mais votada do @Cogwheel é a melhor resposta, no entanto, tentei implementar o
trim()
método string, para aparar todo o espaço em branco do usuário, do início ao fim. Verifique o código abaixo para obter exemplos completos -fonte
SanitizeEmail(string email)
, usando o resultado desse método para validar e enviar o email para.fonte
Verifique se a sequência de e-mail está no formato correto ou incorreto ao
System.Text.RegularExpressions
:fonte
/ Usando o Regex interno usado na criação do "novo EmailAddressAttribute ();" componente em .Net4.5 >>> using System.ComponentModel.DataAnnotations; // Para validar um endereço de email ...... Testado e funcionando.
Além disso, você pode usar isso:
http://msdn.microsoft.com/en-us/library/01escwtf(v=vs.110).aspx
fonte
Eu resumi a resposta de Poyson 1 da seguinte maneira:
fonte
A maneira simples de identificar o emailid é válida ou não.
fonte
Há um problema de cultura no regex em C # em vez de js. Portanto, precisamos usar regex no modo americano para verificação de e-mail. Se você não usar o modo ECMAScript, os caracteres especiais do seu idioma estarão implicados em AZ com regex.
fonte
Acabei usando esse regex, pois ele valida com êxito vírgulas, comentários, caracteres Unicode e endereços de domínio IP (v4).
Os endereços válidos serão:
fonte
Um simples sem usar o Regex (que eu não gosto por sua baixa legibilidade):
Exemplos:
IsValidEmail("@b.com") // false
IsValidEmail("[email protected]") // false
IsValidEmail("a@bcom") // false
IsValidEmail("a.b@com") // false
IsValidEmail("a@b.") // false
IsValidEmail("a [email protected]") // false
IsValidEmail("a@b c.com") // false
IsValidEmail("[email protected]") // true
IsValidEmail("[email protected]") // true
IsValidEmail("[email protected]") // true
IsValidEmail("[email protected]") // true
Ele deve ser simples e, portanto, não lida com casos raros, como emails com domínios entre colchetes que contêm espaços (normalmente permitidos), emails com endereços IPv6 etc.
fonte
Aqui está uma resposta para sua pergunta para você verificar.
fonte
Com base na resposta do @Cogwheel, quero compartilhar uma solução modificada que funcione para o SSIS e o "Componente de script":
Coloque este código no método certo:
Em seguida, você pode usar uma divisão condicional para filtrar todos os registros inválidos ou o que você quiser fazer.
fonte