รหัส C # เพื่อยืนยันที่อยู่อีเมล


461

รหัสที่หรูหราที่สุดในการตรวจสอบความถูกต้องของสตริงคือที่อยู่อีเมลที่ถูกต้อง




มีการตรวจสอบที่สำคัญอื่น ๆ อีกมากมายไม่เพียง แต่เป็นสตริงมันจะดีกว่าที่จะตรวจสอบว่าอีเมลที่มีอยู่ในเซิร์ฟเวอร์ smtp นี้หรือผู้ใช้ป้อนอีเมลใด ๆ .. หรือใช้ API ที่จะจัดการที่สำหรับคุณเพื่อให้แน่ใจว่าอีเมล ถูกต้องเช่นver-email.com
Amr Magdy

lnk ที่ดีที่สุดจาก microsoft docs.microsoft.com/en-us/dotnet/standard/base-types/?hl=th
Kishore Sahasranaman

คุณสามารถใช้ไลบรารี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 แม้ว่าคุณจะไม่ได้ใช้ฟังก์ชั่นที่แน่นอนนี้ แต่คุณอาจต้องการใช้รูปแบบเดียวกัน นอกจากนี้คุณยังสามารถตรวจสอบความล้มเหลวบางประเภทโดยการตรวจจับข้อยกเว้นต่าง ๆ : รูปแบบว่างเปล่าว่างเปล่าหรือไม่ถูกต้อง


ต่อความคิดเห็นของ Stuart การเปรียบเทียบที่อยู่สุดท้ายกับสตริงเดิมแทนที่จะส่งกลับค่าจริงเสมอ MailAddress พยายามที่จะแยกสตริงที่มีช่องว่างใน "ชื่อที่แสดง" และ "ที่อยู่" ส่วนดังนั้นรุ่นเดิมกลับเป็นเท็จบวก


--- อ่านเพิ่มเติม ---

เอกสารสำหรับ System.Net.Mail.MailAddress

คำอธิบายของที่อยู่อีเมลที่ถูกต้อง


23
จริงๆแล้วมันไม่ถูกต้อง a @ a เป็นที่อยู่อีเมลที่ถูกต้อง ดูhaacked.com/archive/2007/08/21/… อันที่จริงวิธีนี้จะส่งคืนผลลัพธ์ที่ไม่ถูกต้องหากคุณใช้ที่อยู่พร้อมคำพูด
Cogwheel

53
+1: นี่เป็นคำตอบที่ดีที่สุดหากคุณใช้System.Net.Mailคลาสเพื่อส่งจดหมายซึ่งอาจเป็นได้ว่าคุณใช้. NET เราตัดสินใจที่จะใช้การตรวจสอบความถูกต้องประเภทนี้เพียงเพราะเราไม่มีจุดรับที่อยู่อีเมล - แม้แต่ที่ถูกต้อง - ที่เราไม่สามารถส่งจดหมายไปได้
เกร็กบีช

24
ฉันไม่แนะนำ ผลตอบแทนจริง:IsValidEmail("this is not valid@email$com");
Kakashi

15
ปัญหาจำนวนมากดูเหมือนจะเกิดขึ้นเนื่องจาก MailAddress พยายามแยก DisplayName ออกเช่นกันดังนั้น "single space@domain.com" จะแยกวิเคราะห์เป็น DisplayName "single" และที่อยู่ "space@domain.com" การแก้ไขสำหรับสิ่งนี้คือ: return (addr.Address == email);
Stuart

18
ฉันชอบสิ่งนี้; ฉันไม่ได้รับการบังคับให้เข้มงวดกว่าสเป็คจริง ฟิล์มเนกาทีฟนั้นเลวร้ายยิ่งกว่าบวกเท็จ ("คุณหมายความว่าอีเมลของฉันไม่ถูกต้องหรือไม่ ")
Casey

242

นี่เป็นคำถามเก่า แต่คำตอบทั้งหมดที่ฉันพบใน SO รวมถึงคำตอบที่ใหม่กว่านั้นได้รับคำตอบคล้ายกับคำถามนี้ อย่างไรก็ตามใน. Net 4.5 / MVC 4 คุณสามารถเพิ่มการตรวจสอบความถูกต้องของที่อยู่อีเมลให้กับแบบฟอร์มได้โดยการเพิ่มคำอธิบายประกอบ [EmailAddress] จาก System.ComponentModel.DataAnnotations ดังนั้นฉันจึงสงสัยว่าทำไมฉันไม่สามารถใช้ฟังก์ชั่นในตัว โดยทั่วไปแล้วสุทธิ

ดูเหมือนว่าจะใช้งานได้และดูเหมือนว่าฉันจะสง่างามพอสมควร:

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ตัวอย่างเช่นMailAddressยอมรับที่อยู่สำหรับ TLD สิ่งที่คุณควรคำนึงถึงหากคุณจำเป็นต้องได้รับอนุญาตมากที่สุด
Aaroninus

5
@ ล้อเฟือง: ถ้าคำตอบอยู่ที่ความคิดเห็นก็ควรจะเพิ่มเข้าไปในเนื้อหาหลักของคำตอบ
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(ที่อยู่อีเมล) เป็นโมฆะ

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

1
มันไม่ได้ผลสำหรับฉัน ฉันได้รับ "'คำอธิบายประกอบข้อมูล' ไม่มีอยู่ ... คุณขาดการอ้างอิงชุดประกอบหรือไม่" ฉันต้องเพิ่มการอ้างอิงใด
B. Clay Shannon

สิ่งนี้จะคืนค่าจริงหากแหล่งที่มาเป็นโมฆะ ดูmsdn.microsoft.com/en-us/library/hh192424 "เป็นจริงถ้าค่าที่ระบุนั้นถูกต้องหรือเป็นค่าว่างมิฉะนั้นเป็นเท็จ"
jao

2
รุ่นที่ดีกว่า:public static Boolean IsValidMailAddress(this String pThis) => pThis == null ? false : new EmailAddressAttribute().IsValid(pThis);
เซบาสเตียนฮอฟมันน์

7
หรือดียิ่งขึ้น:public static bool IsValidEmailAddress(this string address) => address != null && new EmailAddressAttribute().IsValid(address);
Patrik Melander

1
ฉันไม่คิดว่าวิธีการขยายนี้ควรคืนfalseค่าสตริงว่าง นั่นเป็นเหตุผลที่ผมเสนอรุ่น (ดียิ่งขึ้นดีกว่า) 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นี่คือ Regex ที่ใช้ภายใน:

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

@Chad Grant: นี่เป็นรุ่น C # คุณช่วยมอบ VB.Net ให้หนึ่งอันได้ไหม เพราะนั่นจะเป็นการหลบหลีกตัวละครเช่น \\ to \ หรือคุณสามารถระบุสตริงคำต่อคำ
Nikhil Agrawal

3
ใช้งานได้ แต่อย่าลืมRegexOptions.IgnoreCaseเพราะรูปแบบนี้ไม่อนุญาตให้ใช้ตัวพิมพ์ใหญ่อย่างชัดเจน!
คริส

1
โปรดทราบว่า Regex มีเจตนามาก: "คุณลักษณะนี้ให้การตรวจสอบความถูกต้องทางอีเมลฝั่งเซิร์ฟเวอร์เทียบเท่ากับการตรวจสอบ jquery และดังนั้นจึงใช้การแสดงออกร่วมกันแบบปกติ"
Ohad Schneider

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

โดยส่วนตัวแล้วฉันจะบอกว่าคุณควรตรวจสอบให้แน่ใจว่ามีสัญลักษณ์ @ อยู่ในนั้น ตัวละคร มีหลาย regexes คุณสามารถใช้ความถูกต้องที่แตกต่างกัน แต่ฉันคิดว่าส่วนใหญ่เหล่านี้ออกจากที่อยู่อีเมลที่ถูกต้องหรือให้คนที่ไม่ถูกต้องผ่าน หากคนต้องการใส่ที่อยู่อีเมลปลอมพวกเขาจะใส่ที่อยู่อีเมลปลอม หากคุณต้องการตรวจสอบว่าที่อยู่อีเมลนั้นถูกต้องและบุคคลนั้นเป็นผู้ควบคุมที่อยู่อีเมลนั้นคุณจะต้องส่งอีเมลพร้อมลิงก์รหัสพิเศษให้พวกเขาเพื่อให้พวกเขาสามารถยืนยันได้ว่าเป็นที่อยู่จริงแน่นอน


6
โดยส่วนตัวฉันคิดว่าคุณควรตรวจสอบมากกว่านี้อีกเล็กน้อย มีคนผูกพันที่จะลองใช้ที่อยู่อีเมลของ Bobby Table หรือที่แย่กว่านั้น
ลุค Quinane

31
มีอะไรผิดปกติกับที่อยู่อีเมลของตารางบ๊อบบี้ถ้าคุณใช้คำสั่งที่เตรียมไว้ เรากำลังพูดถึงที่อยู่อีเมลที่ถูกต้องไม่ใช่สิ่งอื่น ๆ ที่ไม่เกี่ยวข้องกับสิ่งที่ถือเป็นที่อยู่อีเมลที่ถูกต้องเช่นวิธีการทำแบบสอบถาม SQL อย่างถูกต้องเพื่อให้คุณไม่ได้รับปัญหาการฉีด SQL
Kibbee

ฉันเดาว่าคุณไม่รู้ว่าจะมีใครใส่เข้าไปในนั้น แต่บุคคลที่เป็นอันตรายรู้ว่าคุณค่าอาจถูกป้อนเข้าสู่ระบบอีเมลของคุณในที่สุด ฉันแค่อยากจะป้องกันในเชิงลึกและเข้มงวดขึ้นหน่อย
ลุค Quinane

10
สำหรับระบบจดหมายที่ต้องกังวล ฉันจะไม่ปฏิเสธที่อยู่อีเมลที่ถูกต้องอย่างสมบูรณ์เพราะอาจเป็นปัญหาด้านความปลอดภัยกับระบบอื่น ๆ หากความต้องการเซิร์ฟเวอร์อีเมลของคุณทั้งหมดคือที่อยู่อีเมลที่มีรูปแบบไม่ถูกต้องเพื่อทำให้เกิดปัญหาด้านความปลอดภัยคุณควรเปลี่ยนไปใช้เซิร์ฟเวอร์อื่น
Kibbee

4
การป้องกันในเชิงลึกจะใช้งานได้ก็ต่อเมื่อหัวหอมความปลอดภัยแต่ละระดับไม่เน่าเสีย ชั้นหนึ่งที่เน่าเสียหมายความว่าคุณทำลายหัวหอมทั้งหมด การปฏิเสธ "foo@example.com.au" เพราะคุณต้องการป้องกันช่องโหว่ในการเข้ารหัส law-law ของ Sun ไม่สมเหตุสมผลใช่ไหม อย่าหัวเราะมันเกิดขึ้นกับฉัน เหตุผลที่ฉันแสดงความคิดเห็นที่นี่คือ 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 (อีเมลสตริง) เพื่อหลีกเลี่ยงปัญหานี้: stackoverflow.com/questions/10412233/…
Goner Doug

@Goner Doug ฟังก์ชันนี้จะใช้งานได้เช่นนี้ (bool flag = EmailAddress.IsValidEmail ())
Naveen

2
จำเป็นต้องลบ "this" ออกเพื่อหลีกเลี่ยงปัญหาการคอมไพเลอร์เมื่อเพิ่มลงในแบบฟอร์มของฉัน
Goner Doug

@Goner Doug, ฟังก์ชั่นของมันจะทำงานเช่นนี้ string email = "abc@xyz.com"; if (email.IsValidEmail ()) {return false; } else {return true;}
Naveen

14

วิธีที่หรูหราที่สุดคือการใช้วิธีการของ. Net ในตัว

วิธีการเหล่านี้:

  • มีความพยายามและทดสอบ วิธีการเหล่านี้ใช้ในโครงการมืออาชีพของฉัน

  • ใช้นิพจน์ทั่วไปภายในซึ่งเชื่อถือได้และรวดเร็ว

  • ทำโดย Microsoft สำหรับ C # ไม่จำเป็นต้องบูรณาการล้อ

  • ส่งคืนผลลัพธ์บูล จริงหมายถึงอีเมลนั้นถูกต้อง

สำหรับผู้ใช้. 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());

}

นอกจากนี้ตัวอย่างนี้:

  • ขยายเกินสเปคตั้งแต่สายเดียวที่จะใช้ในการมี 0, หนึ่งหรือที่อยู่อีเมลหลาย sperated ;โดยลำไส้ใหญ่กึ่ง
  • อธิบายวิธีใช้ IsValid ของวัตถุ EmailAddressAttribute อย่างชัดเจน

ทางเลือกสำหรับผู้ใช้เวอร์ชัน. Net น้อยกว่า 4.5

สำหรับสถานการณ์ที่ไม่รองรับ. 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 และไม่มีคำตอบที่ใช้ MailAddress ใหม่ () พร้อมการตรวจสอบอินพุต ==. ที่อยู่ดังนั้นฉันคิดว่ามันมีประโยชน์มาก คำตอบที่ยอมรับนั้นค่อนข้างผิด ใหม่ MailAddress ("Foobar Some@thing.com") พิสูจน์ได้ว่า
Jan

@Jan fwiw, Manikเอาชนะได้อย่างไร้ที่ติEmailAddressAttributeโดยเพียงแค่ภายใต้สี่เดือนแม้ว่าอันนี้จะจับnullปัญหา
ruffin

7

ตามจริงแล้วในรหัสการผลิตสิ่งที่ดีที่สุดที่ฉันทำได้คือตรวจสอบ@สัญลักษณ์

ฉันไม่เคยอยู่ในสถานที่ที่จะตรวจสอบอีเมลได้อย่างสมบูรณ์ คุณรู้ว่าฉันดูว่ามันถูกต้องจริงเหรอ? ถ้ามันถูกส่ง หากไม่เป็นเช่นนั้นก็ไม่ดีถ้าเป็นเช่นนั้นชีวิตก็ดี นั่นคือทั้งหมดที่ฉันต้องรู้


6

ฉันพบว่า regex นี้เป็นการแลกเปลี่ยนที่ดีระหว่างการตรวจสอบสิ่งที่มากกว่าเครื่องหมาย @ และยอมรับกรณีขอบแปลก ๆ :

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

อย่างน้อยมันจะทำให้คุณใส่เครื่องหมาย @ และวางอย่างน้อยก็เป็นโดเมนปกติ


ฉันมากับ regex เดียวกัน;) มันอนุญาตให้ charachters ที่ไม่ถูกต้องแม้ว่า
Stefan

คำตอบนี้ไม่รับ TLD ในส่วนของโดเมน
Simone

@Simone อาจไม่มีใครมีที่อยู่อีเมลที่มี TLD ในส่วนของโดเมนแม้ว่าในทางปฏิบัติ: serverfault.com/a/721929/167961หมายเหตุในความคิดเห็นอาจไม่ได้รับอนุญาตในวันนี้
Matthew Lock

@MatthewLock เป็นที่อยู่อินทราเน็ตหรือไม่ ชอบbob@companyinternalไหม
Simone

@Simone ใครในชีวิตจริงใช้รูปแบบนั้นจริงหรือ
Matthew Lock

4

การตรวจสอบที่อยู่อีเมลนั้นไม่ง่ายอย่างที่คิด จริงๆแล้วมันเป็นไปไม่ได้ในทางทฤษฎีที่จะตรวจสอบความถูกต้องของที่อยู่อีเมลโดยใช้การแสดงออกปกติ

ลองอ่านโพสต์บล็อกของฉันเกี่ยวกับเรื่องนี้เพื่อทำการสนทนาในหัวข้อและการนำ F # ไปใช้โดยใช้ FParsec [/ shameless_plug]


1
ฉันชอบรายการวิธีการอื่น ๆ ที่คุณชอบ น่าสนใจมาก.
ลุค Quinane

1
บทความที่น่าสนใจ แต่ใครเป็นคนให้ความคิดเห็นและซ้อนกันอย่างจริงจังในที่อยู่อีเมล
Matthew Lock

3
@matthew ฉันไม่รู้ว่าทำไม IETF ถึงได้อนุญาตให้ทำเช่นนั้น แต่มันเป็นไปได้ดังนั้นการตรวจสอบอย่างละเอียดจึงต้องคำนึงถึง
Mauricio Scheffer

4

นี่คือคำตอบของฉัน - โซลูชันของ Phil ล้มเหลวสำหรับโดเมนจดหมายเดี่ยวเช่น "someone@q.com" เชื่อหรือไม่ว่ามันถูกใช้ =) (ไปที่ Centurylink เป็นต้น)

คำตอบของฟิลนั้นจะใช้งานได้เฉพาะกับมาตรฐาน PCRE เท่านั้น ... ดังนั้น C # จะเอาไปใช้ แต่จาวาสคริปต์ก็กำลังจะระเบิด ซับซ้อนเกินไปสำหรับจาวาสคริปต์ ดังนั้นคุณไม่สามารถใช้โซลูชันของ Phil สำหรับแอตทริบิวต์การตรวจสอบ mvc

นี่คือ regex ของฉัน มันจะทำงานได้ดีกับแอตทริบิวต์การตรวจสอบ MVC
- ทุกอย่างก่อนที่ @ จะทำให้ง่ายขึ้นดังนั้นอย่างน้อยจาวาสคริปต์ก็จะทำงานได้ ฉันโอเคที่จะใช้การตรวจสอบความผ่อนคลายที่นี่ตราบใดที่เซิร์ฟเวอร์การแลกเปลี่ยนไม่ได้ให้ 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 # จะยอมรับอีเมล แต่จากนั้นเซิร์ฟเวอร์แลกเปลี่ยนจะระเบิดด้วยข้อผิดพลาด runtime 5.1.3 ทันทีที่คุณพยายามส่งอีเมล


ที่ดูเหมือนจะเป็นคำตอบที่ดีที่สุดที่สมเหตุสมผล / สมเหตุสมผล / จริงที่สุดขอบคุณ Ralph!
Fattie

นี่คือคำตอบที่ดีที่สุดจนถึงตอนนี้! ฉันไม่อยากเชื่อว่าโซลูชันที่ไม่ดีที่ยอมรับbasket@ballว่าเป็นที่อยู่อีเมลที่ถูกต้องได้รับคำตอบที่ถูกต้องเช่นเดียวกับ upvotes ทั้งหมด ขอขอบคุณ!
disasterkid

ขอบคุณนี่เป็นทางออกที่ดีที่สุดและควรได้รับคำตอบ
Bat_Programmer

3

หากคุณและฉันหมายถึงต้องการทราบว่าที่อยู่อีเมลนั้นถูกต้องหรือไม่ ... ขอให้ผู้แลกเปลี่ยนอีเมลยืนยันว่าไม่จำเป็นต้องใช้ regex ฉันสามารถให้รหัสถ้ามีการร้องขอ

ขั้นตอนทั่วไปมีดังนี้: 1. ที่อยู่อีเมลมีชื่อโดเมนหรือไม่? (ดัชนีของ @> 0) 2. ใช้แบบสอบถาม DNS ถามว่าโดเมนมีตัวแลกเปลี่ยนอีเมลหรือไม่ 3. เปิดการเชื่อมต่อ tcp ไปยังตัวแลกเปลี่ยนจดหมาย 4. ใช้โปรโตคอล smtp เปิดข้อความไปยังเซิร์ฟเวอร์โดยใช้ที่อยู่อีเมลเป็นผู้รับ 5 แยกการตอบสนองของเซิร์ฟเวอร์ 6. ออกจากข้อความถ้าคุณทำมาไกลขนาดนี้ทุกอย่างดี

นี่คือคุณสามารถจินตนาการเวลาแพงมากและอาศัย smtp แต่ทำงานได้


คุณสร้าง fakes, stubs และ / หรือ mocks สำหรับอินเตอร์เฟสเหล่านั้นหรือไม่?
ทำเครื่องหมาย A

1
นั่นไม่ได้ผล โพรโทคอล smtp เพื่อตรวจสอบที่อยู่อีเมล LONG ถูกเลิกใช้แล้ว / ไม่ได้ใช้ ถือว่าเป็นการปฏิบัติที่ไม่ดีในการเปิดใช้งานบนเซิร์ฟเวอร์อีเมลเนื่องจากผู้ส่งสแปมใช้ฟังก์ชันการทำงานนั้น
ชาดแกรนท์

ฉันจะให้ข้อเสนอแนะของคุณถึงจุดที่ 2 วิธีพิสูจน์อนาคตได้มากกว่าการตรวจสอบรูปแบบชื่อโดเมนที่รู้จัก
Simone

Nitpicking แต่ให้คำจำกัดความ"มีตัวแลกเปลี่ยนอีเมล" ? หากไม่มีระเบียน MX อยู่ SMTP ควรย้อนกลับไปยังระเบียน A / AAAA ตาม RFC2821 / 5321 หากมีระเบียน MX อยู่ แต่ก็ยังไม่อาจระบุว่ามีตัวแลกเปลี่ยนเมลอยู่ (RFC7505) จริงๆแล้วมีเพียงวิธีเดียวคือส่งอีเมลพร้อมลิงก์การเรียกร้องให้ดำเนินการและรอให้พวกเขาตอบกลับ ...
jimbobmcgee

2

โดยทั่วไปแล้วการแสดงออกในการตรวจสอบที่อยู่อีเมลไม่ใช่เรื่องง่ายที่จะเกิดขึ้น ในขณะที่เขียนนี้ไวยากรณ์ของที่อยู่อีเมลจะต้องเป็นไปตามมาตรฐานที่ค่อนข้างสูงและการดำเนินการทั้งหมดในการแสดงออกปกติไม่สามารถทำได้จริง!

ผมขอแนะนำให้คุณลองของเราEmailVerify.NETห้องสมุด .NET ผู้ใหญ่ซึ่งสามารถตรวจสอบที่อยู่อีเมลต่อไปนี้ทั้งหมดของ IETF มาตรฐานปัจจุบัน (RFC 1123, RFC 2821 RFC 2822, RFC 3696, RFC 4291, RFC 5321 และ RFC 5322) ทดสอบระเบียน DNS ที่เกี่ยวข้องตรวจสอบว่ากล่องจดหมายเป้าหมายสามารถรับข้อความได้หรือไม่และสามารถบอกได้ว่าที่อยู่ที่ระบุนั้นถูกทิ้งหรือไม่

คำเตือน: ฉันเป็นผู้พัฒนานำสำหรับส่วนนี้


ที่น่าประทับใจ! "ถัดไปจะพยายามติดต่อผู้แลกเปลี่ยนอีเมลที่รับผิดชอบต่อที่อยู่อีเมลที่กำหนดและเริ่มต้นกล่องโต้ตอบ SMTP ปลอมกับเซิร์ฟเวอร์นั้นจำลองเซิร์ฟเวอร์อีเมลจริงด้วยวิธีนี้จะช่วยให้มั่นใจได้ว่าเซิร์ฟเวอร์สามารถจัดการอีเมลสำหรับที่อยู่ได้ ให้คำตอบที่ผิดพลาดเพื่อป้องกันสแปมเมอร์: เพื่อเอาชนะปัญหานี้ EmailVerify สำหรับ. NET ก็พยายามค้นหาตัวแลกเปลี่ยนเมลเป้าหมายหลายครั้งด้วยที่อยู่ปลอมที่แตกต่างกัน "
Matthew Lock

ขอบคุณ
@MatthewLock

ดีมาก แต่ฉันเห็นเฉพาะรุ่นที่จ่ายเงินเท่านั้น มีแผนสำหรับรุ่นชุมชน / OpenSource หรือไม่?
Ohad Schneider

1
@OhadSchneider ใช่: เราจะนำเสนอรุ่นฟรีของเทคโนโลยีการตรวจสอบอีเมลของเราโดยวิธีการ Verifalia, SaaS ของเราบริการตรวจสอบอีเมล Verifalia มาพร้อมกับ SDK ของฟรีและเปิดแหล่งสำหรับแพลตฟอร์มการพัฒนาซอฟแวร์ที่สำคัญรวมทั้ง.NET
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

/ ใช้ Regex ภายในที่ใช้ในการสร้าง "ใหม่ EmailAddressAttribute ();" องค์ประกอบใน. Net4.5 >>> โดยใช้ System.ComponentModel.DataAnnotations; // เพื่อตรวจสอบที่อยู่อีเมล ...... ผ่านการทดสอบและใช้งานได้

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ö" และมันเกิดข้อผิดพลาดที่ mandrill api
MonsterMMORPG

1
อันดับแรกอีเมลคือ wrt example@example.co หรือ example@example.com ที่ถูกต้อง .... อีเมลมีสตริงและเกณฑ์ที่ถูกต้องทั้งหมดยกเว้นอักขระตัวสุดท้าย "ö" และคุณสามารถเพิ่มเงื่อนไขง่าย ๆ ในการตรวจสอบอักขระดังกล่าว . ประการที่สองไม่แน่ใจเกี่ยวกับข้อผิดพลาด mandrill api คุณอาจต้องการตรวจสอบวิธีการใช้งานของคุณ bcos ฉันได้ใช้การตรวจสอบนี้ในสภาพแวดล้อม / api อื่น ๆ และเป็นสิ่งที่ดีสำหรับฉัน
Aina Ademola 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

วิธีง่ายๆในการระบุอีเมลนั้นถูกต้องหรือไม่

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

มีปัญหาวัฒนธรรมใน regex ใน C # แทนที่จะเป็น js ดังนั้นเราจำเป็นต้องใช้ regex ในโหมด US สำหรับการตรวจสอบอีเมล หากคุณไม่ได้ใช้โหมด ECMAScript อักขระพิเศษภาษาของคุณแปลเป็น AZ ด้วย regex

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

ฉันลงเอยด้วยการใช้ regex นี้เพราะมันสามารถตรวจสอบคอมม่า, คอมเมนท์, ตัวอักษร Unicode และที่อยู่โดเมน IP (v4) ได้สำเร็จ

ที่อยู่ที่ถูกต้องจะเป็น:

"" @ example.org

(comment)test@example.org

тест@example.org

ტესტი @ example.org

ทดสอบ @ [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 ของคุณเชื่อมต่อแล้วเปิด
  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.