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


461

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




문자열뿐만 아니라 다른 많은 중요한 유효성 검사가 있습니다.이 smtp 서버에 전자 메일이 있는지 확인하거나 사용자가 전자 메일을 입력하고 있는지 등을 확인하거나 전자 메일을 확실히 처리하는 API를 사용하는 것이 좋습니다 ver.email.com
Amr Magdy


github.com/jstedfast/EmailValidation 라이브러리를 사용할 수 있습니다 .
Mohammad Reza Sadreddini

답변:


784

이건 어때?

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에 대한 설명서

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


23
사실, 그것은 틀리지 않습니다. a @ a는 유효한 이메일 주소입니다. haacked.com/archive/2007/08/21/…을 참조하십시오. 실제로이 방법은 따옴표가있는 주소를 사용하는 경우 잘못된 결과를 반환합니다.
톱니 바퀴

53
+1 : System.Net.Mail클래스를 사용하여 메일을 보내는 경우에 가장 적합한 답변 입니다. 아마도 .NET을 사용하는 경우 일 것입니다. 우리는 전자 우편 주소를 받아 들일 필요가없고 심지어 유효한 주소까지도 메일을 보낼 수 없기 때문에 이러한 유형의 검증을 사용하기로 결정했습니다.
Greg Beech

24
나는 추천하지 않습니다. 그것은 true를 돌려 :IsValidEmail("this is not valid@email$com");
Kakashi

15
MailAddress가 DisplayName도 구문 분석하려고하므로 "single space@domain.com"이 DisplayName "single"및 Address "space@domain.com"으로 구문 분석되기 때문에 많은 문제점이있는 것 같습니다. 이에 대한 수정은 다음과 같습니다. return (addr.Address == email);
스튜어트

18
나는 이것을 좋아한다. 강제가 실제 사양보다 더 제한적이지는 않습니다. 오탐은 오탐보다 나쁩니다 ( "내 이메일이 유효하지 않다는 것은 무엇입니까? ")
Casey

242

이것은 오래된 질문이지만 최근 답변을 포함하여 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;    
    }
}

4
MS가 자신의 문서에 동의하지 않는 것이 실망 스럽지만 멋지다 . 이것은 js@proseware.com9를 거부합니다
Casey

13
EmailAddressAttribute보다 덜 관대 System.Net.Mail.MailAddress예를 들어, - MailAddressTLD의 주소를 받아들입니다. 가능한 한 관대해야 할 경우 명심하십시오.
Aaroninus 2012

5
@Cogwheel : 답변이 주석 어딘가에 있다면 아마도 답변의 본문에 추가되어야합니다.
hofnarwillie

6
@ hofnarwillie : 그것은 본문에 있지만 의견은 정교합니다. 목표가 사용자를 화나게하는 것이 아니라면 검증이 사양보다 더 제한적이어서는 안됩니다. 전자 메일이 유효한지 실제로 확인하는 유일한 방법은 테스트 메시지를 보내는 것입니다.
톱니 바퀴

4
foo.IsValid(null);반환 한다는 점에 유의하십시오 true.
urig

62

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

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);

1
이것은 나를 위해 작동하지 않습니다; " '데이터 주석'이 존재하지 않습니다 ... 조립품 참조가 누락 되었습니까?" 어떤 참조를 추가해야합니까?
B. 클레이 섀넌

source가 null이면 true를 반환합니다. msdn.microsoft.com/ko-kr/library/hh192424 "지정된 값이 유효하거나 null이면 true이고, 그렇지 않으면 false입니다."를 참조 하십시오 .
jao February

2
더 나은 버전 :public static Boolean IsValidMailAddress(this String pThis) => pThis == null ? false : new EmailAddressAttribute().IsValid(pThis);
Sebastian Hofmann

7
또는 더 나은 :public static bool IsValidEmailAddress(this string address) => address != null && new EmailAddressAttribute().IsValid(address);
Patrik Melander

1
이 확장 방법이 falsenull 문자열을 자동으로 반환해야한다고 생각하지 않습니다 . 그렇기 때문에 (더 나은) ++ 버전을 제안합니다 public static bool IsValidEmailAddress(this string address) => new EmailAddressAttribute().IsValid(address ?? throw new ArgumentNullException());. 이제 가서 더 나은 더 나은 버전주의 개혁 교회를 찾았습니다.
Marc.2377

41

.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])))\.?$";

2
불행히도 EmaillAddressAttribute는 Ñ 전자 메일에 유효한 문자가 아닙니다
BZ

16
@BZ 그렇습니다. 왜 그렇지 않다고 생각합니까?
Casey

@ 채드 그랜트 : 이것은 C # 버전입니다. VB.Net을 제공 할 수 있습니까? \\에서 \와 같은 문자를 이스케이프하거나 문자열을 그대로 사용할 수 있기 때문입니다.
Nikhil Agrawal

3
이것은 작동하지만 RegexOptions.IgnoreCase이 패턴은 대문자를 명시 적으로 허용하지 않기 때문에 잊지 마십시오 !
Chris

1
Regex는 매우 신중합니다. "이 속성은 jquery validate와 동등한 서버 측 이메일 유효성 검증을 제공하므로 동일한 정규식을 공유합니다."
하드 슈나이더

38

필의 답변을 # 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;
    }
}

5
작지만 사용합니다 : return (! string.IsNullOrEmpty (emailAddress)) && ValidEmailRegex.IsMatch (emailAddress);
Marc

이 :) 단지 공포에게있다
Alexandru Dicu

31

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


6
나는 개인적으로 당신이 그것보다 약간 더 많은 검증을해야한다고 생각합니다. 누군가 Bobby Table의 이메일 주소 이상을 시도해야합니다.
Luke Quinane

31
준비된 문장을 사용하는 경우 바비 테이블의 이메일 주소에 문제가 있습니다. 우리는 올바른 이메일 주소에 대해 이야기하고 있습니다. SQL 주입 문제가 발생하지 않도록 SQL 쿼리를 올바르게 수행하는 방법과 같이 유효한 이메일 주소를 구성하는 것과 관련이없는 다른 일은 아닙니다.
Kibbee September

나는 당신이 누군가가 거기에 넣을 것을 모르지만 악의적 인 사람은 그 가치가 결국 귀하의 메일 시스템에 공급 될 수 있음을 알고 있습니다. 나는 단지 심층 방어를하고 조금 더 엄격 해지는 것을 선호합니다.
Luke Quinane

10
그것은 메일 시스템이 걱정하는 것입니다. 다른 시스템에서 보안 문제가 될 수 있기 때문에 완벽하게 유효한 전자 메일 주소를 거부하지는 않습니다. 보안 문제를 유발하기 위해 모든 전자 메일 서버에 잘못된 전자 메일 주소가 있으면 다른 서버로 전환해야합니다.
Kibbee

4
심층 방어는 보안 양파의 각 수준이 썩지 않은 경우에만 작동합니다. 하나의 썩은 층은 전체 양파를 망치는 것을 의미합니다. 썬의 µ-law 인코딩의 취약점으로부터 방어하기 위해 "foo@example.com.au"를 거부하는 것은 말이되지 않습니다. 그렇지 않습니까? 웃지 마, 나 한테 일어난 일이야 내가 여기에 언급하는 이유는 Medicare Australia가 ".au"주소를 허용하지 않고 ".com"만 허용하기 때문입니다. Mark Swanson, "이메일 확인 방법", mdswanson.com/blog/2013/10/14/…
ManicDee

17

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

    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;
    }

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


이 답변은 도메인 부분에 TLD가있는 주소를 허용하지 않습니다.
Simone

15

짧고 정확한 코드

string Email = txtEmail.Text;
if (Email.IsValidEmail())
{
   //use code here 
}

public static bool IsValidEmail(this string email)
{
  string pattern = @"^(?!\.)(""([^""\r\\]|\\[""\r\\])*""|" + @"([-a-z0-9!#$%&'*+/=?^_`{|}~]|(?<!\.)\.)*)(?<!\.)" + @"@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]$";    
  var regex = new Regex(pattern, RegexOptions.IgnoreCase);    
  return regex.IsMatch(email);
}

2
해결책에 감사드립니다
Jack Gajanan

: 나는 IsValidEmail (문자열 이메일)이 피하기 위해 부울 공공 정적에 IsValidEmail (문자열 이메일) BOOL 공공 정적을 변경했다 stackoverflow.com/questions/10412233/...
고너 더그

@Goner Doug,이 기능은 다음과 같이 작동합니다. (bool flag = EmailAddress.IsValidEmail ())
Naveen

2
양식에 추가 될 때 컴파일러 문제가 발생하지 않도록 "THIS"를 제거해야했습니다.
Goner Doug

@ Goner Doug, 그 기능은 다음과 같이 작동합니다. 문자열 이메일 = "abc@xyz.com"; if (email.IsValidEmail ()) {반환 거짓; } else {return true;}
Naveen

14

가장 우아한 방법은 .Net의 내장 메소드를 사용하는 것입니다.

이 방법들 :

  • 시도하고 테스트했습니다. 이 방법은 내 전문 프로젝트에 사용됩니다.

  • 신뢰할 수 있고 빠른 정규식을 내부적으로 사용하십시오.

  • C #을 위해 Microsoft에서 제작했습니다. 바퀴를 재발 명할 필요가 없습니다.

  • 부울 결과를 반환합니다. True는 이메일이 유효 함을 의미합니다.

.Net 4.5 이상의 사용자

이 참조를 프로젝트에 추가하십시오.

System.ComponentModel.DataAnnotations

이제 다음 코드를 사용할 수 있습니다 :

(new EmailAddressAttribute().IsValid("youremailhere@test.test"));

사용 예

선언 할 방법은 다음과 같습니다.

protected List<string> GetRecipients() // Gets recipients from TextBox named `TxtRecipients`
{
    List<string> MethodResult = null;

    try
    {
        List<string> Recipients = TxtRecipients.Text.Replace(",",";").Replace(" ", "").Split(';').ToList();

        List<string> RecipientsCleaned = new List<string>();

        foreach (string Recipient in RecipientsCleaned)
        {
            if (!String.IsNullOrWhiteSpace(Recipient))
            {
                RecipientsNoBlanks.Add(Recipient);

            }

        }

        MethodResult = RecipientsNoBlanks;

    }
    catch//(Exception ex)
    {
        //ex.HandleException();
    }

    return MethodResult;

}


public static bool IsValidEmailAddresses(List<string> recipients)
{
    List<string> InvalidAddresses = GetInvalidEmailAddresses(recipients);

    return InvalidAddresses != null && InvalidAddresses.Count == 0;

}

public static List<string> GetInvalidEmailAddresses(List<string> recipients)
{
    List<string> MethodResult = null;

    try
    {
        List<string> InvalidEmailAddresses = new List<string>();

        foreach (string Recipient in recipients)
        {
            if (!(new EmailAddressAttribute().IsValid(Recipient)) && !InvalidEmailAddresses.Contains(Recipient))
            {
                InvalidEmailAddresses.Add(Recipient);

            }

        }

        MethodResult = InvalidEmailAddresses;

    }
    catch//(Exception ex)
    {
        //ex.HandleException();

    }

    return MethodResult;

}

... 실제로이를 보여주는 코드 :

List<string> Recipients = GetRecipients();

bool IsValidEmailAddresses = IsValidEmailAddresses(Recipients);

if (IsValidEmailAddresses)
{
    //Emails are valid. Your code here

}
else
{
    StringBuilder sb = new StringBuilder();

    sb.Append("The following addresses are invalid:");

    List<string> InvalidEmails = GetInvalidEmailAddresses(Recipients);

    foreach (string InvalidEmail in InvalidEmails)
    {
        sb.Append("\n" + InvalidEmail);

    }

    MessageBox.Show(sb.ToString());

}

또한이 예는 다음과 같습니다.

  • 단일 문자열을 사용하여 세미콜론으로 구분 된 하나 또는 여러 개의 전자 메일 주소를 포함하기 때문에 단일 문자열이 사용되므로 사양을 넘어 확장됩니다 ;.
  • EmailAddressAttribute 개체의 IsValid 메서드를 사용하는 방법을 명확하게 보여줍니다.

대안, 4.5 미만의 .Net 버전 사용자

.Net 4.5를 사용할 수없는 상황에서는 다음 솔루션을 사용합니다.

구체적으로 다음을 사용합니다.

public static bool IsValidEmailAddress(string emailAddress)
{
    bool MethodResult = false;

    try
    {
        MailAddress m = new MailAddress(emailAddress);

        MethodResult = m.Address == emailAddress;

    }
    catch //(Exception ex)
    {
        //ex.HandleException();

    }

    return MethodResult;

}

public static List<string> GetInvalidEmailAddresses(List<string> recipients)
{
    List<string> MethodResult = null;

    try
    {
        List<string> InvalidEmailAddresses = new List<string>();

        foreach (string Recipient in recipients)
        {
            if (!IsValidEmail(Recipient) && !InvalidEmailAddresses.Contains(Recipient))
            {
                InvalidEmailAddresses.Add(Recipient);

            }

        }

        MethodResult = InvalidEmailAddresses;

    }
    catch //(Exception ex)
    {
        //ex.HandleException();

    }

    return MethodResult;

}

1
@ThomasAyoub EmailAddressAttribute 답변을 보지 못했고 input == .Address를 확인하여 새 MailAddress ()를 사용하는 답변이 없으므로 매우 유용하다고 생각합니다. 의견을 읽지 않으면 받아 들인 대답은 꽤 잘못되었습니다. new MailAddress ( "Foobar Some@thing.com")가이를 증명합니다.
1

@ Jan fwiw, ManikEmailAddressAttribute4 개월도 채 안되어 Knickerless를 이겼습니다 null.
ruffin

7

솔직히 말해서, 프로덕션 코드에서 내가하는 최선의 방법은 @기호를 확인하는 것 입니다.

이메일을 완전히 검증 할 수있는 곳이 아닙니다. 그것이 실제로 유효한지 어떻게 알 수 있습니까? 보내 졌다면. 그렇지 않은 경우, 나쁜 경우, 인생은 좋습니다. 그게 내가 알아야 할 전부입니다.


6

이 정규식은 @ 마크 이상의 것을 확인하고 이상한 경우를 받아들이는 것 사이에 좋은 절충안이라는 것을 알았습니다.

^[^@\s]+@[^@\s]+(\.[^@\s]+)+$

적어도 @ 마크 주위에 무언가를 넣고 최소한 정상적인 도메인을 배치합니다.


나는 같은 정규 표현식을 생각해 냈다;) 그것은 유효하지 않은 charachters를 허용하지만
Stefan

이 답변은 도메인 부분의 TLD를 허용하지 않습니다.
Simone

: 실제로 불구하고 @Simone 아마 아무도 도메인 부분에서 TLD와 이메일 주소를 가지고하지 않습니다 serverfault.com/a/721929/167961 노트는 의견이 요즘 금지 될 수
마태 복음 잠금

@MatthewLock 인트라넷 주소 일 수 있습니까? 처럼 bob@companyinternal?
시몬

@Simone 현실의 누군가가 실제로 그 계획을 사용합니까?
Matthew Lock

4

이메일 주소 확인은 생각보다 쉽지 않습니다. 실제로는 정규식 만 사용하여 전자 메일 주소를 완전히 검증하는 것은 이론적으로 불가능합니다.

주제에 대한 토론과 FParsec을 사용한 F # 구현에 대해서는 내 블로그 게시물을 확인하십시오 . [/ shameless_plug]


1
대체 접근법 목록이 마음에 들었습니다. 매우 흥미로운.
Luke Quinane

1
재미있는 기사. 그러나 진지하게 누가 이메일 주소에 댓글을 달고 그 안에 댓글을 달고 있습니까?
Matthew Lock

3
@matthew IETF가 왜 그것을 허용했는지조차 모르겠지만 가능합니다 . 따라서 철저한 유효성 검사를 고려해야합니다.
Mauricio Scheffer

4

내 대답은 다음과 같습니다. Phil의 솔루션은 "someone@q.com"과 같은 단일 문자 도메인에서 실패합니다. 믿거 나 말거나, =) 사용됩니다 (예를 들어 CenturyLink로 이동).

Phil의 대답은 PCRE 표준에서만 작동 할 것입니다 ... 그래서 C #은 그것을 취할 것이지만 자바 스크립트는 폭발 할 것입니다. 자바 스크립트에는 너무 복잡합니다. 따라서 mvc 유효성 검사 속성에 Phil의 솔루션을 사용할 수 없습니다.

여기 내 정규식이 있습니다. MVC 유효성 검사 속성과 잘 작동합니다.
-@ 앞의 모든 것이 단순화되어 적어도 자바 스크립트가 작동합니다. Exchange 서버가 5.1.3을 제공하지 않는 한 여기에서 유효성 검사를 완화해도 좋습니다. -@ 뒤의 모든 것은 단일 문자 도메인에 대해 수정 된 Phil의 솔루션입니다.

public const string EmailPattern =
        @"^\s*[\w\-\+_']+(\.[\w\-\+_']+)*\@[A-Za-z0-9]([\w\.-]*[A-Za-z0-9])?\.[A-Za-z][A-Za-z\.]*[A-Za-z]$";

system.net.mail MailMessage () 사용을 제안하는 사람들에게는 그 방법이 유연합니다. 물론 C #은 전자 메일을 수락하지만 전자 메일을 보내려고하면 Exchange 서버에서 5.1.3 런타임 오류가 발생합니다.


Ralph에게 감사드립니다.
Fattie

이것은 지금까지 가장 좋은 답변입니다! basket@ball유효한 이메일 주소로 허용되는 나쁜 해결책이 모든 정답뿐만 아니라 정답을 얻었음을 믿을 수 없습니다 . 어쨌든 고마워!
disasterkid

감사합니다. 이것이 최선의 해결책이며 답이되어야합니다.
Bat_Programmer

3

당신이 정말로 이메일 주소가 유효한지 알고 싶다면 메일 교환기에게 그것을 증명하도록 요청하십시오. 정규식이 필요하지 않습니다. 요청하면 코드를 제공 할 수 있습니다.

일반적인 단계는 다음과 같습니다. 1. 이메일 주소에 도메인 이름 부분이 있습니까? (@> 0의 색인) 2. DNS 쿼리를 사용하여 도메인에 메일 교환기가 있는지 묻습니다. 3. 메일 교환기에 대한 TCP 연결을 엽니 다 4. smtp 프로토콜을 사용하여 전자 메일 주소를 수신자로 사용하여 서버에 메시지를 엽니 다 5. 서버의 응답을 구문 분석하십시오. 6. 지금까지 메시지를 작성한 경우 모든 메시지가 종료됩니다.

이것은 상상할 수 있듯이 시간이 많이 걸리고 smtp에 의존하지만 작동합니다.


해당 인터페이스에 대한 가짜, 스텁 및 / 또는 모의를 만들었습니까?
Mark A

1
작동하지 않습니다. 전자 메일 주소를 확인하는 smtp 프로토콜이 더 이상 사용되지 않거나 사용되지 않았습니다. 스패머가 해당 기능을 사용하므로 메일 서버에서이를 사용하는 것은 좋지 않은 것으로 간주됩니다.
채드 그랜트

2 단계까지 제안을 유지하겠습니다. 알려진 도메인 이름 패턴을 확인하는 것보다 미래 지향적 인 방법입니다.
Simone

Nitpicking, 그러나 "메일 교환기 있음"을 정의 하시겠습니까? MX 레코드가 없으면 RFC2821 / 5321에 따라 SMTP가 A / AAAA 레코드로 폴백해야합니다. MX 레코드가 존재하더라도 여전히 메일 교환기가 존재 함을 나타내지 않을 수 있습니다 (RFC7505). 실제로 유일한 방법은 클릭 유도 문안 링크가 포함 된 메일을 발송하고 응답을 기다리는 것입니다.
jimbobmcgee

2

일반적으로, 이메일 주소를 확인하는 정규식은 쉽게 구할 수 없습니다. 이 글을 쓰는 시점에서 전자 메일 주소의 구문은 비교적 많은 수의 표준을 따라야하며 정규 표현식 내에서 모든 표준을 구현하는 것은 실제로 불가능합니다!

현재 모든 IETF 표준 (RFC 1123, RFC 2821, RFC 2822, RFC 3696, RFC 4291, RFC 5321 및 RFC 5322)에 따라 전자 메일 주소를 확인할 수있는 성숙한 .NET 라이브러리 인 EmailVerify.NET 을 사용해보십시오. , 관련 DNS 레코드를 테스트하고 대상 사서함이 메시지를 수락 할 수 있는지 확인하고 지정된 주소가 일회용인지 여부를 확인할 수도 있습니다.

면책 조항 : 나는이 구성 요소의 수석 개발자입니다.


감동적인! "다음으로 지정된 전자 메일 주소를 담당하는 메일 교환기에 연락을 시도하고 해당 서버와 가짜 SMTP 대화 상자를 시작하여 실제 메일 서버를 에뮬레이트합니다. 이렇게하면 서버가 주소의 전자 메일을 처리 할 수 ​​있습니다. 실제로 많은 SMTP 서버 스패머로부터 보호하기위한 오 탐지 답변을 다시 제공합니다.이 문제를 극복하기 위해 EmailVerify for .NET은 최종적으로 다른 조작 된 주소로 대상 메일 교환기를 여러 번 쿼리하려고 시도합니다. "
Matthew Lock

감사합니다, @MatthewLock;)
Efran Cobisi

멋지지만 유료 버전 만 볼 수 있습니다. 커뮤니티 / 오픈 소스 에디션에 대한 계획이 있습니까?
하드 슈나이더

1
@OhadSchneider 예 : SaaS 이메일 확인 서비스 인 Verifalia를 통해 무료 버전의 이메일 검증 기술을 제공하고 있습니다. Verifalia는 .NET을 포함한 주요 소프트웨어 개발 플랫폼을위한 무료 오픈 소스 SDK와 함께 제공됩니다 .
Efran Cobisi

2
For the simple email like goerge@xxx.com, below code is sufficient. 

 public static bool ValidateEmail(string email)
        {
            System.Text.RegularExpressions.Regex emailRegex = new System.Text.RegularExpressions.Regex(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$");
            System.Text.RegularExpressions.Match emailMatch = emailRegex.Match(email);
            return emailMatch.Success;
        }

a@b.info를 유효한 이메일 주소로 확인하지 못합니다.
Ray Cheng

2

FluentValidation 을 사용하는 경우 다음과 같이 간단한 것을 작성할 수 있습니다.

public cass User
{
    public string Email { get; set; }
}

public class UserValidator : AbstractValidator<User>
{
    public UserValidator()
    {
        RuleFor(x => x.Email).EmailAddress().WithMessage("The text entered is not a valid email address.");
    }
}

// Validates an user. 
var validationResult = new UserValidator().Validate(new User { Email = "açflkdj" });

// This will return false, since the user email is not valid.
bool userIsValid = validationResult.IsValid;

2

@Cogwheel 답변에 약간의 수정

public static bool IsValidEmail(this string email)
{
  // skip the exception & return early if possible
  if (email.IndexOf("@") <= 0) return false;

  try
  {
    var address = new MailAddress(email);
    return address.Address == email;
  }
  catch
  {
    return false;
  }
}

이것은 도움이되지 않는 것 같습니다 ... Console.WriteLine(MailAddress("asdf@asdf.").Address);"asdf @ asdf."를 출력 하는데 , 이것은 유효하지 않습니다.
Langdon

.net은 유효한 자체 정의를 가지고있는 것 같습니다. 관련 토론
waitforit

2

여기에는 많은 강력한 답변이 있습니다. 그러나 한 걸음 물러나는 것이 좋습니다. @Cogwheel은 https://stackoverflow.com/a/1374644/388267 질문에 답변합니다 . 그럼에도 불구하고, 검증되는 많은 이메일 주소가 유효하지 않은 경우 대량 검증 시나리오에서 비용이 많이들 수 있습니다. try-catch 블록에 들어가기 전에 약간의 논리를 사용하는 것이 좋습니다. RegEx를 사용하여 다음 코드를 작성할 수 있지만 새로운 개발자가 이해하기에는 비용이 많이들 수 있습니다. 이것은 내 두 펜스 가치입니다.

    public static bool IsEmail(this string input)
    {
        if (string.IsNullOrWhiteSpace(input)) return false;

        // MUST CONTAIN ONE AND ONLY ONE @
        var atCount = input.Count(c => c == '@');
        if (atCount != 1) return false;

        // MUST CONTAIN PERIOD
        if (!input.Contains(".")) return false;

        // @ MUST OCCUR BEFORE LAST PERIOD
        var indexOfAt = input.IndexOf("@", StringComparison.Ordinal);
        var lastIndexOfPeriod = input.LastIndexOf(".", StringComparison.Ordinal);
        var atBeforeLastPeriod = lastIndexOfPeriod > indexOfAt;
        if (!atBeforeLastPeriod) return false;

        // CODE FROM COGWHEEL'S ANSWER: https://stackoverflow.com/a/1374644/388267 
        try
        {
            var addr = new System.Net.Mail.MailAddress(input);
            return addr.Address == input;
        }
        catch
        {
            return false;
        }
    }

2

@Cogwheel에서 가장 많이 투표 된 답변은 가장 좋은 답변이지만 trim()문자열 방법 을 구현하려고 시도 했기 때문에 문자열 시작에서 끝까지 모든 사용자 공백을 잘라냅니다. 전체 예제는 다음 코드를 확인하십시오.

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

이것의 위험은 소스와 다른 이메일 주소의 유효성을 검사하여 (이 경우) 지정된 이메일 주소의 트리밍되지 않은 버전으로 메일을 보낼 수 있다고 생각하게하는 것입니다. 더 좋은 방법은 SanitizeEmail(string email)해당 방법의 결과를 사용하여 전자 메일을 확인하고 보내는 별도의 방법을 만드는 것 입니다.
Marco de Zeeuw

1
private static bool IsValidEmail(string emailAddress)
{
    const 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).IsMatch(emailAddress);
}

1

이메일 문자열이 올바른 형식인지 또는 잘못된 형식인지 확인하십시오 System.Text.RegularExpressions.

    public static bool IsValidEmailId(string InputEmail)
    {
        Regex regex = new Regex(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$");
        Match match = regex.Match(InputEmail);
        if (match.Success)
            return true;
        else
            return false;
    }

    protected void Email_TextChanged(object sender, EventArgs e)
    {
        String UserEmail = Email.Text;
        if (IsValidEmailId(UserEmail))
        {
            Label4.Text = "This email is correct formate";
        }
        else
        {
            Label4.Text = "This email isn't correct formate";
        }
    }

1

/ "new EmailAddressAttribute ();"작성에 사용 된 내부 정규식 사용 System.ComponentModel.DataAnnotations를 사용하는 .Net4.5의 >>> 구성 요소; // 이메일 주소의 유효성을 검사하려면 ...... 테스트 및 작동.

public bool IsEmail(string email)
{
    if (String.IsNullOrEmpty(email))
    {   return false;  }
    try
    {
        Regex _regex = new Regex("^((([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\\u" +
                "FDF0-\\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-\\uFF" +
                "EF])))\\.?$", RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture | RegexOptions.Compiled);
        return _regex.IsMatch(email);
    }
    catch (RegexMatchTimeoutException)
    {
        return false;
    }
}

또한 이것을 사용할 수 있습니다 :

http://msdn.microsoft.com/en-us/library/01escwtf(v=vs.110).aspx


그것은이 이메일에 대한 진정한 말한다 : "fulya_42_@hotmail.coö"그것은 드릴 API에서 오류가 발생합니다
MonsterMMORPG

1
먼저 이메일은 유효한 wrt example@example.co 또는 example@example.com ...입니다. 이메일에는 마지막 문자 "ö"를 제외한 모든 유효한 문자열과 기준이 있으며 이러한 문자를 확인하기위한 간단한 조건을 쉽게 추가 할 수 있습니다. . 둘째, 그 mandrill api 오류에 대해 확신하지 못합니다. 다른 환경 / api 에서이 유효성 검사를 사용하여 나에게 도움이되는 bcos 사용 방법을 확인하고 싶을 수도 있습니다.
아이나 아데 몰라 C

1

나는 Poyson 1의 대답을 다음과 같이 간결하게 만들었습니다.

public static bool IsValidEmailAddress(string candidateEmailAddr)
{
    string regexExpresion = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
    return (Regex.IsMatch(candidateEmailAddr, regexExpresion)) && 
           (Regex.Replace(candidateEmailAddr, regexExpresion, string.Empty).Length == 0);
}

1

이메일 ID를 식별하는 간단한 방법은 유효합니다.

public static bool EmailIsValid(string email)
{
        return Regex.IsMatch(email, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$");
}

1

C #의 정규 표현식에는 js가 아닌 문화 문제가 있습니다. 따라서 이메일 확인을 위해 미국 모드에서 정규식을 사용해야합니다. ECMAScript 모드를 사용하지 않으면 언어 특수 문자가 정규식이있는 AZ에 포함됩니다.

Regex.IsMatch(email, @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9_\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$", RegexOptions.ECMAScript)

1

쉼표, 주석, 유니 코드 문자 및 IP (v4) 도메인 주소의 유효성을 성공적으로 확인하기 때문에이 정규식을 사용했습니다.

유효한 주소는 다음과 같습니다.

""@ example.org

(comment)test@example.org

тест@example.org

ტესტი @ example.org

test @ [192.168.1.1]

 public const string REGEX_EMAIL = @"^(((\([\w!#$%&'*+\/=?^_`{|}~-]*\))?[^<>()[\]\\.,;:\s@\""]+(\.[^<>()[\]\\.,;:\s@\""]+)*)|(\"".+\""))(\([\w!#$%&'*+\/=?^_`{|}~-]*\))?@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$";

1

Regex를 사용하지 않는 간단한 것 (가독성이 좋지 않기 때문에 좋아하지 않음) :

bool IsValidEmail(string email)
{
    string emailTrimed = email.Trim();

    if (!string.IsNullOrEmpty(emailTrimed))
    {
        bool hasWhitespace = emailTrimed.Contains(" ");

        int indexOfAtSign = emailTrimed.LastIndexOf('@');

        if (indexOfAtSign > 0 && !hasWhitespace)
        {
            string afterAtSign = emailTrimed.Substring(indexOfAtSign + 1);

            int indexOfDotAfterAtSign = afterAtSign.LastIndexOf('.');

            if (indexOfDotAfterAtSign > 0 && afterAtSign.Substring(indexOfDotAfterAtSign).Length > 1)
                return true;
        }
    }

    return false;
}

예 :

  • IsValidEmail("@b.com") // false
  • IsValidEmail("a@.com") // false
  • IsValidEmail("a@bcom") // false
  • IsValidEmail("a.b@com") // false
  • IsValidEmail("a@b.") // false
  • IsValidEmail("a b@c.com") // false
  • IsValidEmail("a@b c.com") // false
  • IsValidEmail("a@b.com") // true
  • IsValidEmail("a@b.c.com") // true
  • IsValidEmail("a+b@c.com") // true
  • IsValidEmail("a@123.45.67.89") // true

단순해야하므로 공백이 포함 된 괄호로 묶인 도메인이있는 이메일 (일반적으로 허용됨), IPv6 주소가있는 이메일 등과 같은 드문 경우를 처리하지 않습니다.


1

확인할 질문에 대한 답변입니다.

using System;
using System.Globalization;
using System.Text.RegularExpressions;

public class RegexUtilities
{    
   public bool IsValidEmail(string strIn)
   {
       if (String.IsNullOrEmpty(strIn))
       {
          return false;

       }

       // Use IdnMapping class to convert Unicode domain names.

       try 
       {
          strIn = Regex.Replace(strIn, @"(@)(.+)$", this.DomainMapper, RegexOptions.None, TimeSpan.FromMilliseconds(200));

       }
       catch (RegexMatchTimeoutException) 
       {
           return false;

       }

       if (invalid)
       {
           return false;

       }

       // Return true if strIn is in valid e-mail format.    

       try 
       {
          return Regex.IsMatch(strIn, @"^(?("")("".+?(?<!\\)""@)|(([0-9a-z]((\.(?!\.))|       [-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]{0,22}[a-z0-9]))$", RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250));

       }
       catch (RegexMatchTimeoutException) 
       {
          return false;

       }

   }


   private string DomainMapper(Match match)
   {
      // IdnMapping class with default property values.

      IdnMapping idn = new IdnMapping();

      string domainName = match.Groups[2].Value;

      try 
      {
         domainName = idn.GetAscii(domainName);

      }
      catch (ArgumentException) 
      {
         invalid = true;

      }

      return match.Groups[1].Value + domainName;

   }

}

1

@Cogwheel의 답변을 바탕으로 SSIS와 "스크립트 구성 요소"에서 작동하는 수정 된 솔루션을 공유하고 싶습니다.

  1. "스크립트 구성 요소"를 Data Flow Connect에 배치 한 다음여십시오.
  2. "입력 열"섹션에서 전자 우편 주소가 포함 된 필드를 "ReadWrite"(예 : 'fieldName')로 설정하십시오.
  3. "스크립트"섹션으로 다시 전환하고 "스크립트 편집"을 클릭하십시오. 그런 다음 코드가 열린 후 기다려야합니다.
  4. 이 코드를 올바른 방법으로 배치하십시오.

    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        string email = Row.fieldName;
    
        try
        {
            System.Net.Mail.MailAddress addr = new System.Net.Mail.MailAddress(email);
            Row.fieldName= addr.Address.ToString();
        }
        catch
        {
            Row.fieldName = "WRONGADDRESS";
        }
    }

그런 다음 조건부 분할을 사용하여 모든 유효하지 않은 레코드 나 원하는 것을 필터링 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.