[C#] 이메일 주소를 확인하는 C # 코드

문자열이 유효한 이메일 주소인지 확인하는 가장 우아한 코드는 무엇입니까?



답변

이건 어때?

bool IsValidEmail(string email)
{
    try {
        var addr = new System.Net.Mail.MailAddress(email);
        return addr.Address == email;
    }
    catch {
        return false;
    }
}

명확히하기 위해 전자 메일 주소가 메시지를 보낼 수있는 유효한 대상인지 여부가 아니라 특정 문자열이 전자 메일 주소의 유효한 표현인지 묻습니다. 이를위한 유일한 방법은 확인 메시지를 보내는 것입니다.

전자 우편 주소는 처음 생각했던 것보다 더 관대합니다. 이들은 모두 완벽하게 유효한 형식입니다.

  • 톱니 바퀴
  • “오렌지 톱니 바퀴”@ example.com
  • 123@$.xyz

대부분의 사용 사례에서 잘못된 “유효하지 않은”은 잘못된 “유효한”것보다 사용자와 향후 교정에 훨씬 나쁩니다. 다음은 이 질문에 대한 답변 으로 사용기사입니다 (해당 답변은 삭제됨). 문제를 해결하는 방법에 대한 더 자세한 내용과 다른 아이디어가 있습니다.

온 전성 검사를 제공하는 것은 여전히 ​​사용자 경험에 대한 좋은 아이디어입니다. 전자 메일 주소가 유효하다고 가정하면 알려진 최상위 도메인을 찾고 도메인에서 MX 레코드를 확인하고 일반적인 도메인 이름 (gmail.cmo)의 철자 오류를 검사하는 등의 작업을 수행 할 수 있습니다. “예, 내 메일 서버는 실제로 이메일 주소로 ???을 허용합니다.”


비즈니스 로직에 예외 처리를 사용하는 것은 피해야 할 것에 동의합니다. 그러나 이것은 편의성과 명확성이 교리보다 클 수있는 경우 중 하나입니다.

또한 전자 메일 주소로 다른 작업을 수행하는 경우 MailAddress로 설정해야 할 수 있습니다. 이 정확한 기능을 사용하지 않더라도 동일한 패턴을 사용하고 싶을 것입니다. 널 (null), 비어 있거나 유효하지 않은 형식 과 같은 다른 예외 를 발견하여 특정 종류의 실패를 확인할 수도 있습니다 .


스튜어트의 의견에 따르면, 이것은 항상 true를 반환하는 대신 최종 주소를 원래 문자열과 비교합니다. MailAddress는 공백이있는 문자열을 “표시 이름”및 “주소”부분으로 구문 분석하려고하므로 원래 버전이 오 탐지를 리턴했습니다.


— 더 읽기 —

System.Net.Mail.MailAddress에 대한 설명서

유효한 이메일 주소를 구성하는 것에 대한 설명


답변

이것은 오래된 질문이지만 최근 답변을 포함하여 SO에서 찾은 모든 답변은이 답변과 비슷합니다. 그러나 .Net 4.5 / MVC 4에서는 System.ComponentModel.DataAnnotations에서 [EmailAddress] 주석을 추가하여 전자 메일 주소 유효성 검사를 양식에 추가 할 수 있으므로에서 내장 기능을 사용할 수없는 이유가 궁금했습니다. 일반적으로 그물.

이것은 작동하는 것처럼 보이며 상당히 우아합니다.

using System.ComponentModel.DataAnnotations;

class ValidateSomeEmails
{
    static void Main(string[] args)
    {
        var foo = new EmailAddressAttribute();
        bool bar;
        bar = foo.IsValid("someone@somewhere.com");         //true
        bar = foo.IsValid("someone@somewhere.co.uk");       //true
        bar = foo.IsValid("someone+tag@somewhere.net");     //true
        bar = foo.IsValid("futureTLD@somewhere.fooo");      //true

        bar = foo.IsValid("fdsa");                          //false
        bar = foo.IsValid("fdsa@");                         //false
        bar = foo.IsValid("fdsa@fdsa");                     //false
        bar = foo.IsValid("fdsa@fdsa.");                    //false

        //one-liner
        if (new EmailAddressAttribute().IsValid("someone@somewhere.com"))
            bar = true;
    }
}


답변

나는이 단일 라이너 방법을 사용하여 나를 위해 일한다.

using System.ComponentModel.DataAnnotations;
public bool IsValidEmail(string source)
{
    return new EmailAddressAttribute().IsValid(source);
}

설명에 따라 source(이메일 주소)가 null 인 경우 “실패”합니다 .

public static bool IsValidEmailAddress(this string address) => address != null && new EmailAddressAttribute().IsValid(address);


답변

.net 4.5 추가 System.ComponentModel.DataAnnotations.EmailAddressAttribute

EmailAddressAttribute의 소스를 찾아 볼 수 있습니다. 이것은 내부적으로 사용되는 정규식입니다.

const string pattern = @"^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$";


답변

필의 답변을 # 1에서 가져 와서이 수업을 만들었습니다. 다음과 같이 호출하십시오.bool isValid = Validator.EmailIsValid(emailString);

수업은 다음과 같습니다.

using System.Text.RegularExpressions;

public static class Validator
{

    static Regex ValidEmailRegex = CreateValidEmailRegex();

    /// <summary>
    /// Taken from http://haacked.com/archive/2007/08/21/i-knew-how-to-validate-an-email-address-until-i.aspx
    /// </summary>
    /// <returns></returns>
    private static Regex CreateValidEmailRegex()
    {
        string validEmailPattern = @"^(?!\.)(""([^""\r\\]|\\[""\r\\])*""|"
            + @"([-a-z0-9!#$%&'*+/=?^_`{|}~]|(?<!\.)\.)*)(?<!\.)"
            + @"@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]$";

        return new Regex(validEmailPattern, RegexOptions.IgnoreCase);
    }

    internal static bool EmailIsValid(string emailAddress)
    {
        bool isValid = ValidEmailRegex.IsMatch(emailAddress);

        return isValid;
    }
}


답변

개인적으로, 나는 거기에 @ 기호가 있는지 확인해야한다고 말하고 싶습니다. 캐릭터. 다양한 정확성으로 사용할 수있는 정규 표현식이 많이 있지만 대부분은 유효한 전자 메일 주소를 남기거나 유효하지 않은 주소를 허용한다고 생각합니다. 사람들이 가짜 전자 메일 주소를 입력하려면 가짜 전자 메일 주소를 입력합니다. 전자 메일 주소가 합법적이며 해당 전자 메일 주소를 제어하는 ​​사람인지 확인해야하는 경우 실제 코드인지 확인할 수 있도록 특수 코드 링크가 포함 된 전자 메일을 보내야합니다.


답변

가장 좋은 방법은 다음과 같습니다.

    public static bool EmailIsValid(string email)
    {
        string expression = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";

        if (Regex.IsMatch(email, expression))
        {
            if (Regex.Replace(email, expression, string.Empty).Length == 0)
            {
                return true;
            }
        }
        return false;
    }

이 정적 함수는 일반 클래스에서 가질 수 있습니다.