我想知道人们应该花多长时间验证电子邮件地址。我的领域主要是网络开发,但这适用于任何地方。
我已经看到了几种方法:
仅检查是否有“ @”目前,这简直是简单,但当然不是那么可靠。
用于标准电子邮件格式的更复杂的正则表达式测试
针对RFC 2822的完整正则表达式-问题通常是电子邮件地址可能有效,但这可能不是用户的意思。
DNS验证
SMTP验证
许多人可能知道(但很多人不知道),电子邮件地址可能会有大多数人通常不考虑的许多奇怪变化(请参阅RFC 2822 3.4.1),但是您必须考虑验证的目标:您是否只是在尝试确保可以发送到某个地址,或者这可能是用户可能要输入的地址(在很多其他“有效”地址的晦涩情况下,这种情况不太可能发生)。
我已经选择了被认为只是发出更多的警告eric地址,但仍然允许请求通过,但这确实增加了表单的复杂性,并且大多数用户很可能会感到困惑。
DNS验证/ SMTP验证似乎很容易,预见到DNS服务器/ SMTP服务器暂时关闭且用户无法在某处注册,或者用户的SMTP服务器不支持所需功能的问题。
这里的一些有经验的开发人员如何处理这个?除了我列出的方法以外,还有其他方法吗?
编辑:我完全忘记了最显而易见的一切,发送确认电子邮件!感谢答复者指出这一点。是的,这是万无一失的,但是涉及的每个人都确实需要额外的麻烦。用户必须提取一些电子邮件,开发人员需要在甚至确认用户数据有效之前记住用户数据。
#1 楼
像大多数论坛一样,除了向用户发送电子邮件并等待响应外,没有100%可靠的方法来确认有效的电子邮件地址。我会遵循简单的“ @”验证规则,然后向用户发送电子邮件以确认其电子邮件地址。
尽管这是我个人的看法...我正在等待其他建议。
评论
完全同意。您是否真的在乎那个地址,或者您不在乎。我看不到半心半意的理由。
– Benjol
2011年5月23日在8:10
迄今为止最好的答案。验证@,然后验证地址(带有电子邮件)-那里有细微的差别。
–billy.bob
2011年7月14日在9:08
...这就是多数论坛这样做的原因。
–丹·雷(Dan Ray)
2011年7月14日在12:37
我同意@Billy Bob的观点,认为简单的验证以及随后的验证电子邮件是证明电子邮件准确无误的最有效方法。
– SDsolar
17年1月14日在14:20
“有效”电子邮件地址也可能发送给错误的人,因此,确认电子邮件确实是唯一可以确定的方法。每年,当有人为我自己输入自己的电子邮件地址错误时,我都会得到其中的一些信息。
–axl
18年11月20日在4:31
#2 楼
一个建议:不要拒绝地址中带有+的地址。拒绝它们是很烦人的事,但这是一个有效的字符,Gmail用户可以使用address+label@gmail.com来更轻松地标记和分类传入的邮件。评论
+1 !!!似乎不可能过滤来自所有站点的Facebook电子邮件!
–我们都是莫妮卡
09-09-22在2:04
可以不进行过滤-仅使用发件人信息
– Casebash
09年11月16日在6:04
GMail从其他邮件服务器上将其提取。我相信qmail和postfix普及了它。
–user1249
2011年7月14日在9:36
尽管我同意这种观点,但这甚至还没有开始回答这个问题。
–布莱恩·奥克利(Bryan Oakley)
2012年11月11日在16:04
#3 楼
在您的帖子中,似乎当您说“ SMTP验证”时,是指连接到服务器并尝试RCPT TO以查看它是否被接受。由于您将其与实际发送确认电子邮件区分开来,因此我假设您要按照用户操作内联地进行操作。除了网络问题,DNS故障等问题之外,此方法还会对灰色列表造成严重破坏。方法各不相同,但从本质上讲,灰色列表始终会阻止按连接IP向收件人发送邮件的首次尝试。就像我说的那样,这可能会有所不同,有些主机可能会在初次尝试时拒绝无效地址,而只会推迟有效地址,但是没有可靠的方法可以通过编程方式来选择不同的实现。确保地址真正有效并由其所有者提交的唯一方法是发送验证电子邮件,该所有者确实确实希望将其用于您的应用程序。好吧,只要它不被垃圾邮件过滤掉,我想=)。
#4 楼
使用正则表达式进行电子邮件验证的另一个缺点是,几乎不可能捕获所有有效的顶级域,而拒绝所有无效的域。例如,Jeff Atwood的回复中的基本电子邮件正则表达式:
\ b [A-Z0-9 ._%+-] + @ [A-Z0-9 .-] +。[A-Z] {2,4} \ b
可以接受任何2到4个字符的TLD。因此,例如,将接受.spam,但将拒绝.museum和.travel(均为有效TLD)。
还有一个原因,那就是最好查找@,然后发送确认电子邮件。
#5 楼
有了国际域名,几乎一切皆有可能: .test。مثال.آزمایشی如果要进行任何测试,应先将其转换为punycode。
如果没有punycode,您要做的就是在此进行测试:
至少有一个@
本地部分至少有一个字符
至少有一个域部分中的一个点
至少有四个域中的字符(假设没有人在tld上有地址,并且tld至少为2个字符)
function isEmail(address) {
var pos = address.lastIndexOf("@");
return pos > 0 && (address.lastIndexOf(".") > pos) && (address.length - pos > 4);
}
评论
如果要使用javascript转换为punycode,可以在以下答案中使用该代码:stackoverflow.com/questions/183485/…
–一些
2011年2月1日7:10
足够真实-然后确保@符号可能是确保其“看起来”像电子邮件地址的唯一方法。
– SDsolar
17年1月14日在14:22
#6 楼
最好只检查诸如@和的简单内容。使用JavaScript,然后将验证发送给他们的电子邮件。如果他们验证了他们的帐户,则您将拥有一个有效的电子邮件地址。这样,您就可以确定自己有一个工作地址,而不必过于专横。评论
这是一个很好的解决方案。这是一个正则表达式,用于查找@后跟一个点:/.+@.+\..+/
–埃文·莫兰(Evan Moran)
13年7月30日在20:53
#7 楼
使用不会给出假阴性的开源验证器。为您的零努力和对应用程序的强大验证。 />我对所有可以找到的验证器进行了所有这些测试。比较如下:http://www.dominicsayers.com/isemail
随着人们增强其验证器,我将尝试使此页面保持最新。感谢Cal,Dave和Phil在汇编这些测试以及对我自己的验证程序的建设性批评方面所提供的帮助和合作。
人们应该特别注意针对RFC 3696的勘误表。实际上,其中三个规范示例是无效地址。地址的最大长度为254或256个字符,而不是320。
评论
比较链接已关闭:(
–Zero3
17年1月14日在13:41
#8 楼
考虑到答案(因为我完全忘记了确认电子邮件),在我看来,低摩擦解决方案的合适折衷办法是:使用正则表达式检查电子邮件地址是否有效,如果电子邮件地址比较晦涩,则发出警告,但要避免直接拒绝。
使用SMTP验证来确保电子邮件地址有效。
如果SMTP验证失败,则(仅在此之后)使用确认电子邮件作为最后的手段。确认电子邮件似乎需要在您的应用程序之外进行过多的交互,才能将其视为低摩擦,但它们是一个完美的后备。
评论
您如何在不发送确认的情况下检查用户是否拥有电子邮件地址?例如,假设他们输入了您的电子邮件地址。您是否会因为开发人员决定不提供确认电子邮件而感到恼火,因此允许知道您地址的任何人在您的网站上进行签名?
– Rupert Madden-Abbott
2010-4-19的1:28
SMTP验证?询问服务器地址是否存在?垃圾邮件摆脱了很久以前。
–user1249
2011年7月14日在9:37
#9 楼
RegexBuddy从其库中提供以下与电子邮件相关的正则表达式:电子邮件地址(基本)
\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b
电子邮件地址(RFC 2822,简化)
[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
但我倾向于同意Peter和SuperJoe的回答;唯一真正的“测试”实际上是发送验证电子邮件。
评论
您的基本电子邮件检查无法通过bob@mydivision.mycompany.com之类的方式进行。您还应该说不区分大小写的匹配是必需的,因为您仅使用大写ASCII码。
– unpythonic
2011年7月14日在12:10
为什么拒绝大写字符(使用第二个正则表达式)?在接受MTA之前不应该对本地部分进行验证吗?除空格和引号外。
– DirkJäckel
2012年9月26日上午7:10
@dirk如标记所示,运行此正则表达式时,请将“不区分大小写”标志应用于此正则表达式。
–杰夫·阿特伍德
2012年9月26日在21:06
基本级别不好,因为有几个TLD> 4个字符。我要使其最小为2,最大不为{2,}
– EkriirkE
2014年5月22日20:26
#10 楼
我曾在4家不同的公司工作过,那里的服务台有人叫O'Malley或O'Brien或其他带有撇号的电子邮件地址大喊大叫。如前所述,并非所有的正则表达式都能抓住一切,但可以为自己节省一些麻烦并接受撇号,而不会产生警告。-
bmb
评论
但愿如此。顺便说一句,哈希符号(#)也是如此。
– Tomalak
08/09/29在13:25
人们的名字不包含井号,并不表示他们在电子邮件地址中无效。
–戴夫·谢罗曼(Dave Sherohman)
09年2月22日在17:06
#11 楼
@Mike-我认为发送确认电子邮件的部分原因不仅在于确保电子邮件地址有效,还在于提交电子邮件的用户可以访问该电子邮件地址。一个人可以轻松地在电子邮件地址中输入一个字母的拼写错误,这将导致一个不同的有效电子邮件地址,但这仍然是一个错误,因为它是错误的地址。#12 楼
在我工作过的地方开发的一些网站上,我们一直使用确认电子邮件。但是,用户以无法正常工作的方式错误地输入电子邮件地址,然后继续等待确认电子邮件,这是令人惊讶的普遍现象。在这种情况下,添加临时代码(或者,对于域名部分,是DNS验证)来警告用户可能是个好主意。 br />删除域名中间的字母或其他几个简单的拼写变体。域)。
在电子邮件地址的本地部分的开头添加一个
.br
(我没有做这个;我看到了几个形式为.com
的电子邮件地址)。有更奇怪的情况;例如完整域名作为本地部分,带有两个
.br
的地址(类似.com.br
),依此类推。可以让MTA处理它们。但是,警告用户输入的电子邮件地址很可能是虚假的,这可能会有所帮助,特别是如果您的目标受众不是很懂计算机的人。评论
听起来这些网站的问题是用户被迫输入他们真正不理解的信息。并非所有站点都需要与其用户进行电子邮件联系,即使这会使站点变得更容易。
– bzlm
09年3月21日在14:54
#13 楼
您可以进一步进行电子邮件验证,以实际测试邮箱是否存在。此技术有其缺点(开发时间长,还有可能因滥用而被列入黑名单)。 http://www.webdigi.co.uk/blog/2009/how-to-check-if-an-email-address-exists-without-sending-an-email/#14 楼
如果要验证电子邮件(即确保用户拥有该电子邮件地址),则确认电子邮件是唯一可以做的事情。然后,许多人再次拥有专用的垃圾邮件地址或使用诸如OneWayMail之类的服务,如果他们不想给您实际的电子邮件地址,则不会。因此,基本上,您是在造成用户的阻碍。但是,至少对于HTML表单(这是迄今为止最常用的收集电子邮件地址的方式),它几乎不是正确的工具。在电子邮件地址的实际“单词”中。您无法仅根据格式来确定back2dso@example.com
是错误的。但更重要的是,从用户的角度来看,您可能只希望一个(或完整的)电子邮件地址输入。并且您可能已经输入了它。
因此,与其尝试验证地址,不如着重于确保所有浏览器都能识别电子邮件字段,从而消除了首先输入电子邮件地址的麻烦。 。当然,如果您要建立的网站以前从未在浏览器中输入过电子邮件地址的用户访问过,那么这将不适用。但我想我们当中至少有一个这样的位置。
#15 楼
我认为这取决于您使用电子邮件的上下文。更严重的项目需要更严格的验证,但我认为对于大多数情况,使用构型链接将电子邮件发送到提供的地址将确保电子邮件地址有效。#16 楼
我在电子邮件验证中遇到的最完整,最准确的正则表达式是此处记录的内容。这不是为了胆小的人;它非常复杂,因此将其分解成多个部分,以使人类更容易解析(示例代码在Java中)。但是,如果需要进行验证的所有方法,我认为它不会变得更好。您认为重要的案例。这样一来,当您仔细研究它时,就可以确定自己没有破坏过以前可以解决的问题。#17 楼
无论您选择什么,我都认为您应该误以为用户有99%的时间实际上知道他们的电子邮件地址是什么。作为来自澳大利亚的某人,我仍然偶尔会发现一个非常聪明的电子邮件验证,它告诉我我不可能拥有.com.au域。这些天发送确认电子邮件对于用户来说是可以接受的,并且在选择加入和验证方面也很有用。他们提供的地址。
#18 楼
世界上所有的正则表达式验证都不会阻止某人输入不正确或伪造的电子邮件地址。真的很烦人。评论
您是否尝试过DeBounce电子邮件验证工具?我建议看一下这项服务。
–伊曼(Iman Hejazi)
19 Mar 4 '19 at 16:51
#19 楼
取决于目标。如果您是ISP,并且需要验证用户是否正在创建有效的电子邮件地址,请使用可对所有可能的内容进行验证的Regex。如果您只想捕获用户错误,请遵循以下模式:[所有字符,没有空格] @ [字母和数字](。[字母和数字])
最后一组至少出现一次。
正则表达式如下所示:可以。
评论
有一个拼写错误(除非您只想允许“ w”作为TLD),并且它不会将带连字符(-)的域匹配。这样效果更好:[\ S] + @ [\ w-] +(。[\ w-] +)+
–一些
08年11月18日在3:05
#20 楼
@Yaakov(可以在此处回复某种“回复”)我认为发送确认电子邮件的部分原因不仅在于确保电子邮件地址有效,但提交者可以访问它。一个人可以轻松地在电子邮件地址中输入一个字母的拼写错误,这会导致一个不同的有效电子邮件地址,但这仍然是一个错误,因为它是错误的地址。 br />我同意,但是我不确定是否值得。我们也有用于此目的的确认字段(再次重复您的电子邮件地址)。网站类型可能需要采用不同方法的另一种情况。
此外,发送确认电子邮件本身也无法向原始用户表明他们输入的地址错误。在未收到确认电子邮件后,他们可能会认为您的应用程序/网站有问题;至少允许用户立即开始使用其帐户,他们可以更正其电子邮件地址,尤其是如果该电子邮件地址显示在适当的明显位置。
#21 楼
用于课程的马匹。所有这些马匹本身都是有效的,完整的电子邮件验证系统,对于给定的网站,一个比另一个更合适(或保证保证)。在许多情况下,验证的几个步骤可能会有用。
如果要为银行开发网站,则除了所有这些之外,还希望蜗牛邮件或电话验证。 >
如果您要开发一个竞赛网站,则可能不需要任何一个-验证电子邮件是否在后期处理中,如果失败了,对于进入该网站的人来说太糟糕了-您可能会因为在确保每个人都被正确地在线验证后,人们(例如电视比赛)大为迷恋。
一个人应该接受电子邮件验证到多远?
在必要和保证的范围内。
再也没有(KISS)
#22 楼
我见过一些站点还可以防止使用临时丢弃的垃圾桶站点(例如Mailinator或MyTrashMail)的人,这些站点避开了确认电子邮件。我并不是说您应该过滤掉这些,而是说。评论
它以什么方式“绕开”电子邮件确认? Mailinator和MyTrashMail都将接受后续发送到相同地址的邮件。如果用户不愿意检查它们,那就是另一回事了。
– bzlm
09年3月21日在14:52
#23 楼
您想在电子邮件验证中抓住什么?电子邮件地址的正则表达式验证最多只能验证该地址在语法上正确且相对合理。如果正则表达式不太正确,它也有可能拒绝实际的,可交付的地址(多次提到)的危险。由灰名单或配置为尽可能少提供有关其用户的服务器的服务器强加。您无法知道MTA是否只是声称接受虚假地址的邮件,然后将其作为反垃圾邮件策略的一部分放到地板上。
发送确认消息,是验证地址是否属于输入用户的唯一方法。如果我要填写您的表格,我可以很容易地告诉您我的电子邮件地址是
president@whitehouse.gov
。正则表达式会告诉您它在语法上是有效的,SMTP RCPT TO会告诉您这是一个可交付的地址,但是可以肯定的是,这不是我的地址。#24 楼
随着HTML5的到来,至少增加了一种新方法:使用类型为'email'的输入,该输入允许在客户端进行验证。当前版本的Firefox,Chrome,Safari和Opera确实支持此功能(其他浏览器只是将其视为type = text,因此可以毫无问题地使用它,当然您也无需进行验证。) />它永远无法(如几次指出的那样)保证地址可用,但是在您只需要捕获可能的用户错误的地方,它可能会非常有益(最终取代服务器端检查)。评论
HTMLElement的Firefox实现:dxr.mozilla.org/mozilla-central/source/dom/html/…
–蒂芬
15年11月13日在8:56
#25 楼
电子邮件验证的三个主要级别:1)正则表达式检查格式正确的电子邮件地址email@email.com
2)电子邮件域检查MX记录以查看如果域名具有电子邮件服务
3)发送带有确认链接或代码的确认电子邮件
级别1:
在Visual Studio中,您可以使用“正则表达式验证器”。在“ ValidationExpression”属性中,您可以单击“ ...”按钮,该按钮具有一个向导,可以为电子邮件地址添加正则表达式格式。
级别2:
这是我下面的C#代码,用于使用nslookup验证电子邮件域是否具有有效的MX记录。在Win 2008 R2和Win 7上可以快速运行。
using System.Net.Mail;
using System.Diagnostics;
public static bool checkMXRecords(string email)
{
MailAddress addr = new MailAddress(email);
string domain = addr.Host;
string command = "nslookup -querytype=mx " + domain;
ProcessStartInfo procStartInfo = new ProcessStartInfo("cmd", "/c " + command);
procStartInfo.RedirectStandardOutput = true;
procStartInfo.UseShellExecute = false;
procStartInfo.CreateNoWindow = true;
Process proc = new Process();
proc.StartInfo = procStartInfo;
proc.Start();
string result = proc.StandardOutput.ReadToEnd();
if (result.ToLower().Contains("mail exchanger"))
{
return true;
}
else return false;
} // checkMXRecords
另一个选择是使用Arsofttools nuget程序包,但据我所知,它在Windows Server 2008 R2上可能运行缓慢,但在Win 7上运行速度很快。
级别3:
用于电子邮件确认,您可以生成特定于电子邮件的十六进制网址(使用加密功能)等http://domain.com/validateEmail?code=abcd1234以在用户单击该电子邮件地址时对其进行验证。无需将该网址存储在内存中。
评论
我个人将使用双重正则表达式“警告和拒绝”策略,然后再发送一封电子邮件以确认地址的所有权。最大的问题是询问您要求的地址是什么目的。例如,如果您要向用户发送验证电子邮件,则只需进行一个非常简单的检查就可以了,因为大概是出于激励用户提供有效地址的目的。