Cog*_*eel 713
那这个呢?
bool IsValidEmail(string email)
{
try {
var addr = new System.Net.Mail.MailAddress(email);
return addr.Address == email;
}
catch {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
为了澄清,问题是询问特定字符串是否是电子邮件地址的有效表示,而不是电子邮件地址是否是发送消息的有效目的地.为此,唯一真正的方法是发送消息进行确认.
请注意,电子邮件地址比您可能首先假设的更宽容.这些都是完全有效的形式:
对于大多数用例,假的"无效"对于您的用户和将来的校对来说比虚假的"有效"更糟糕.这里有一个曾经是公认的答案的文章对这个问题(这个问题的答案已经被删除).它有更多的细节和一些其他如何解决问题的想法.
提供健全性检查仍然是用户体验的好主意.假设电子邮件地址有效,您可以查找已知的顶级域名,检查域名中的MX记录,检查来自常用域名(gmail.cmo)的拼写错误等.然后向用户显示警告有机会说"是的,我的邮件服务器确实允许作为电子邮件地址."
至于对业务逻辑使用异常处理,我同意这是一个需要避免的事情.但这是方便和清晰度可能超过教条的情况之一.
此外,如果您使用电子邮件地址执行任何其他操作,则可能需要将其转换为MailAddress.即使您不使用此功能,您也可能希望使用相同的模式.您还可以通过捕获不同的异常来检查特定类型的故障:null,empty或invalid format.
Per Stuart的评论,这将最终地址与原始字符串进行比较,而不是始终返回true.MailAddress尝试将带有空格的字符串解析为"显示名称"和"地址"部分,因此原始版本返回误报.
---进一步阅读---
System.Net.Mail.MailAddress的文档
imj*_*osh 220
这是一个古老的问题,但我在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;
}
}
Run Code Online (Sandbox Code Playgroud)
Man*_*ora 51
我使用这种单线程方法为我工作 -
using System.ComponentModel.DataAnnotations;
public bool IsValidEmail(string source)
{
return new EmailAddressAttribute().IsValid(source);
}
Run Code Online (Sandbox Code Playgroud)
根据评论,如果source
(电子邮件地址)为空,这将"失败" .
public static bool IsValidEmailAddress(this string address) => address != null && new EmailAddressAttribute().IsValid(address);
Run Code Online (Sandbox Code Playgroud)
Cha*_*ant 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])))\.?$";
Run Code Online (Sandbox Code Playgroud)
Dav*_*ith 37
我从#1那里得到了Phil的答案并创建了这个课程.像这样称呼它: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;
}
}
Run Code Online (Sandbox Code Playgroud)
Kib*_*bee 29
就个人而言,我会说你应该确保那里有一个@符号,可能还有一个.字符.有许多正则表达式可以使用不同的正确性,但我认为其中大多数都会遗漏有效的电子邮件地址,或者通过无效的电子邮件地址.如果人们想要输入一个虚假的电子邮件地址,他们会放入一个虚假的电子邮件地址.如果您需要验证电子邮件地址是否合法,并且该人员已控制该电子邮件地址,那么您需要向他们发送带有特殊编码链接的电子邮件,以便他们可以验证它确实是真实地址.
小智 16
我认为最好的方法如下:
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;
}
Run Code Online (Sandbox Code Playgroud)
您可以在一般类中使用此静态函数.
Kni*_*ins 13
最优雅的方式是使用.Net的内置方法.
这些方法:
经过试用和测试.这些方法用于我自己的专业项目中.
在内部使用正则表达式,它们可靠且快速.
由Microsoft为C#制作.没有必要重新发明轮子.
返回bool结果.True表示电子邮件有效.
适用于.Net 4.5及更高版本的用户
将此参考添加到您的项目:
System.ComponentModel.DataAnnotations
现在您可以使用以下代码:
(new EmailAddressAttribute().IsValid("youremailhere@test.test"));
Run Code Online (Sandbox Code Playgroud)
使用示例
以下是一些声明方法:
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;
}
Run Code Online (Sandbox Code Playgroud)
......以及在行动中展示它们的代码:
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());
}
Run Code Online (Sandbox Code Playgroud)
另外,这个例子:
;
.替代方案,适用于.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;
}
Run Code Online (Sandbox Code Playgroud)
Jai*_*ath 11
简短准确的代码
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);
}
Run Code Online (Sandbox Code Playgroud)
说实话,在生产代码中,我做的最好的是检查@
符号.
我永远不会在一个完全验证电子邮件的地方.你知道我怎么看它是否真的有效?如果它被发送.如果没有,那就糟糕了,如果确实如此,生活就是好的.这就是我需要知道的全部内容.
我发现这个正则表达式在检查除了@标记之外的东西和接受奇怪的边缘情况之间是一个很好的权衡:
^[^@\s]+@[^@\s]+(\.[^@\s]+)+$
Run Code Online (Sandbox Code Playgroud)
它至少会让你在@标记周围添加一些东西,并至少放一个看起来很正常的域名.
我总结了截至 2021 年我在这门课上为自己写的所有上述答案:
public static class StringExt {
private const string emailPattern = @"^(?!\.)(""([^""\r\\]|\\[""\r\\])*""|"
+ @"([-a-z0-9!#$%&'*+/=?^_`{|}~]|(?<!\.)\.)*)(?<!\.)"
+ @"@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]$";
public static bool IsValidMailAddress(this string pThis)
=> pThis is not null
&& Regex.IsMatch(pThis, emailPattern, RegexOptions.IgnoreCase);
}
Run Code Online (Sandbox Code Playgroud)
这是我的答案 - Phil 的解决方案对于像“someone@q.com”这样的单字母域失败。不管你信不信,这就是 =)(例如,转到 centurylink)。
Phil 的答案也只适用于 PCRE 标准……所以 C# 会接受它,但 javascript 会崩溃。对于 javascript 来说太复杂了。所以你不能使用Phil的解决方案来验证mvc属性。
这是我的正则表达式。它将与 MVC 验证属性很好地配合使用。
- @ 之前的所有内容都被简化,因此至少 javascript 可以工作。只要交换服务器不给我 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]$";
Run Code Online (Sandbox Code Playgroud)
对于建议使用 system.net.mail MailMessage() 的人来说,这太灵活了。当然,C# 会接受电子邮件,但一旦您尝试发送电子邮件,交换服务器就会出现 5.1.3 运行时错误。
我只想指出,最近在 .NET 文档中增加了一个关于电子邮件验证的内容,也使用了 Regex 操作。可以在那里找到对其实施的彻底解释。
为方便起见,以下是他们的测试结果列表:
// Valid: david.jones@proseware.com
// Valid: d.j@server1.proseware.com
// Valid: jones@ms1.proseware.com
// Invalid: j.@server1.proseware.com
// Valid: j@proseware.com9
// Valid: js#internal@proseware.com
// Valid: j_9@[129.126.118.1]
// Invalid: j..s@proseware.com
// Invalid: js*@proseware.com
// Invalid: js@proseware..com
// Valid: js@proseware.com9
// Valid: j.s@server1.proseware.com
// Valid: "j\"s\""@proseware.com
// Valid: js@contoso.??
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
404337 次 |
最近记录: |