2011-08-11 34 views
25

Hiện nay, để tránh sai sót khỏi bị ném lên do địa chỉ email không hợp lệ, tôi thực hiện như sau:Kiểm tra địa chỉ email có giá trị trong System.Net.Mail.MailAddress

Dim mailAddress As MailAddress 
Try 
    mailAddress = New MailAddress("[email protected]@email.com") 
Catch ex As Exception 
    'Invalid email 
End Try 

Tuy nhiên, thay vì phụ thuộc vào Try..Catch, có cách xác thực rằng địa chỉ email sẽ có giá trị 100% cho loại MailAddress không?

Tôi biết có rất nhiều chức năng regex ở đó để xác thực email, nhưng tôi đang tìm kiếm chức năng sử dụng loại MailAddress để xác thực địa chỉ của nó.

+0

Bạn có thử sử dụng một decompiler để xem những gì 'MailAddress' sử dụng? – Oded

+1

@Oded: Tôi có. Nó sử dụng một lớp nội bộ lớn được gọi là 'MailBnfHelper', đã thay đổi đáng kể trong .Net 4.0. Tôi không khuyên bạn nên giải nén nó. – SLaks

+0

Các phiên bản khác nhau của khuôn khổ .Net sử dụng các quy tắc khác nhau cho những gì nó hỗ trợ vì vậy tôi sẽ lo lắng rằng bất kỳ regex nào: bạn tạo ra có thể không phải là bằng chứng trong tương lai. 'Try Catch' sẽ là bằng chứng trong tương lai mặc dù vậy tôi đồng ý với câu trả lời của SLaks. Nếu không, nếu bạn thực sự muốn viết một regex, tài liệu cho [MailAddress] (http://msdn.microsoft.com/en-us/library/system.net.mail.mailaddress.aspx) mô tả các quy tắc mà nó sử dụng để bạn có thể sử dụng nó làm điểm khởi đầu. –

Trả lời

25

Thật không may, không có phương thức MailAddress.TryParse.

Mã của bạn là cách lý tưởng để xác thực địa chỉ email trong .Net.

+2

Tôi sẽ không đồng ý với điều này, tôi giả sử sử dụng cụm từ thông dụng trên khối thử/nắm bắt vì chúng thường chậm. – Cromat

+8

@Cromat - vì RegEx được biết đến là nhanh, phải không? – Oded

+0

@Cromat: Sai. Regexes cũng chậm và mọi regex phức tạp đủ để _approximate_ một địa chỉ email sẽ là _very_ chậm. Ngoài ra, các khối 'catch' chỉ chậm nếu ngoại lệ thực sự bị bắt, do đó, điều này sẽ không làm chậm bất kỳ thứ gì trong trường hợp phổ biến của một địa chỉ hợp lệ. – SLaks

0

Một số ký tự hợp lệ trong một số nhà cung cấp dịch vụ nhưng không giống nhau ở những người khác! SmtpClient không biết gì về nhà cung cấp dịch vụ. Vì vậy, nó phải lọc ít nhất có thể. Các Wikipedia là welly đề cập về các standers.

Xác thực MailAddress được đề cập trên MSDN. Do đó tôi nghĩ rằng bạn có thể kiểm tra các xác nhận hợp lệ trước khi khởi tạo MailAddress.

6

Nếu bạn cần đảm bảo địa chỉ email đã cho hợp lệ theo tiêu chuẩn IETF - lớp MailAddress dường như chỉ theo một phần, tại thời điểm viết bài này - tôi khuyên bạn hãy xem EmailVerify. NET, một thành phần .NET bạn có thể dễ dàng tích hợp trong các giải pháp của mình. Nó không phụ thuộc vào các biểu thức thông thường để thực hiện công việc của nó nhưng nó dựa trên một máy trạng thái hữu hạn bên trong, vì vậy nó rất nhanh.

Disclaimer: Tôi là nhà phát triển chính của thành phần này.

+0

Thật đẹp! –

+2

Thành phần này không phải là một thành phần miễn phí - nó được bán với giá $ 50,00. – bgmCoder

1

Không thực sự là câu trả lời cho câu hỏi này, nhưng trong trường hợp bất cứ ai cần nó, tôi đã viết một hàm C# để xác nhận địa chỉ email bằng cách sử dụng phương pháp này.

FixEmailAddress("[email protected]")

lợi nhuận "[email protected]"

FixEmailAddress("[email protected]@xyz.com,[email protected],asdfdsf,[email protected]")

lợi nhuận "[email protected],[email protected]"

tôi xử lý danh sách địa chỉ email theo cách này vì dấu phẩy tách ra danh sách email là một tham số hợp lệ cho MailAddressCollection.Add ()

/// <summary> 
/// Given a single email address, return the email address if it is valid, or empty string if invalid. 
/// or given a comma delimited list of email addresses, return the a comma list of valid email addresses from the original list. 
/// </summary> 
/// <param name="emailAddess"></param> 
/// <returns>Validated email address(es)</returns> 
public static string FixEmailAddress(string emailAddress) 
{ 

    string result = ""; 

    emailAddress = emailAddress.Replace(";",","); 
    if (emailAddress.Contains(",")) 
    { 
     List<string> results = new List<string>(); 
     string[] emailAddresses = emailAddress.Split(new char[] { ',' }); 
     foreach (string e in emailAddresses) 
     { 
      string temp = FixEmailAddress(e); 
      if (temp != "") 
      { 
       results.Add(temp); 
      } 
     } 
     result = string.Join(",", results); 
    } 
    else 
    { 

     try 
     { 
      System.Net.Mail.MailAddress email = new System.Net.Mail.MailAddress(emailAddress); 
      result = email.Address; 
     } 
     catch (Exception) 
     { 
      result = ""; 
     } 

    } 

    return result; 

}

Các vấn đề liên quan