在 C# 中验证电子邮件地址格式的最佳方法
Best way to validate email address format in C#
您好,我正在研究批量发送电子邮件的功能。下面是我验证电子邮件并将其发送给每个收件人的循环:
foreach (var userID in recipientUserIds)
{
var userInfo = //getting from database using userID.
try
{
to = new MailAddress(userInfo.Email1, userInfo.FirstName + " " + userInfo.LastName);
}
catch (System.FormatException fe)
{
continue;
}
using (MailMessage message = new MailMessage(from, to))
{
//populate message and send email.
}
}
由于 recipientUserIds 总是超过 2000,在这种情况下,使用 try-catch 似乎对每个用户来说都非常昂贵,只是为了验证电子邮件地址格式。我想知道使用正则表达式,但不确定这是否有助于提高性能。
所以我的问题是是否有更好的或性能优化的方法来进行相同的验证。
验证电子邮件地址是一项复杂的任务,编写代码来预先完成所有验证将非常棘手。如果你检查 MailAddress
class documentation 的 Remarks
部分,你会发现有很多字符串是被视为有效的电子邮件地址(包括评论、括号中的域名和嵌入的引号)。
并且由于源代码可用,请查看 ParseAddress
方法 here,您将了解自己必须编写的代码来验证电子邮件地址.遗憾的是没有 public TryParse
方法可以用来避免抛出异常。
因此,最好先进行一些简单的验证 - 确保它包含电子邮件地址的最低要求(字面上看起来是 user@domain
,其中 domain
不必包含一个 '.'
字符),然后让异常处理处理其余部分:
foreach (var userID in recipientUserIds)
{
var userInfo = GetUserInfo(userID);
// Basic validation on length
var email = userInfo?.Email1?.Trim();
if (string.IsNullOrEmpty(email) || email.Length < 3) continue;
// Basic validation on '@' character position
var atIndex = email.IndexOf('@');
if (atIndex < 1 || atIndex == email.Length - 1) continue;
// Let try/catch handle the rest, because email addresses are complicated
MailAddress to;
try
{
to = new MailAddress(email, $"{userInfo.FirstName} {userInfo.LastName}");
}
catch (FormatException)
{
continue;
}
using (MailMessage message = new MailMessage(from, to))
{
// populate message and send email here
}
}
您好,我正在研究批量发送电子邮件的功能。下面是我验证电子邮件并将其发送给每个收件人的循环:
foreach (var userID in recipientUserIds)
{
var userInfo = //getting from database using userID.
try
{
to = new MailAddress(userInfo.Email1, userInfo.FirstName + " " + userInfo.LastName);
}
catch (System.FormatException fe)
{
continue;
}
using (MailMessage message = new MailMessage(from, to))
{
//populate message and send email.
}
}
由于 recipientUserIds 总是超过 2000,在这种情况下,使用 try-catch 似乎对每个用户来说都非常昂贵,只是为了验证电子邮件地址格式。我想知道使用正则表达式,但不确定这是否有助于提高性能。
所以我的问题是是否有更好的或性能优化的方法来进行相同的验证。
验证电子邮件地址是一项复杂的任务,编写代码来预先完成所有验证将非常棘手。如果你检查 MailAddress
class documentation 的 Remarks
部分,你会发现有很多字符串是被视为有效的电子邮件地址(包括评论、括号中的域名和嵌入的引号)。
并且由于源代码可用,请查看 ParseAddress
方法 here,您将了解自己必须编写的代码来验证电子邮件地址.遗憾的是没有 public TryParse
方法可以用来避免抛出异常。
因此,最好先进行一些简单的验证 - 确保它包含电子邮件地址的最低要求(字面上看起来是 user@domain
,其中 domain
不必包含一个 '.'
字符),然后让异常处理处理其余部分:
foreach (var userID in recipientUserIds)
{
var userInfo = GetUserInfo(userID);
// Basic validation on length
var email = userInfo?.Email1?.Trim();
if (string.IsNullOrEmpty(email) || email.Length < 3) continue;
// Basic validation on '@' character position
var atIndex = email.IndexOf('@');
if (atIndex < 1 || atIndex == email.Length - 1) continue;
// Let try/catch handle the rest, because email addresses are complicated
MailAddress to;
try
{
to = new MailAddress(email, $"{userInfo.FirstName} {userInfo.LastName}");
}
catch (FormatException)
{
continue;
}
using (MailMessage message = new MailMessage(from, to))
{
// populate message and send email here
}
}