【问题标题】:Can I check if e-mail address is valid?我可以检查电子邮件地址是否有效吗?
【发布时间】:2010-05-12 15:52:46
【问题描述】:

如何实现以下逻辑?

  • 用户使用电子邮件地址注册

  • 如果提供的电子邮件地址是有效的 电子邮件地址然后用户帐户获取 激活

  • 或者如果它是假电子邮件,那么用户 帐号未激活

我怀疑我能否收到 - “交付失败回复消息”,对吧? 无论如何,您建议如何实现上述逻辑?

PS。无论如何,我都必须找到一种方法,客户想要它 =)

【问题讨论】:

  • 如果您在网站上搜索“验证电子邮件地址”,您会发现该主题已经被很好地涵盖了。
  • 您已经得到了一些很好的答案(向用户发送一个难以猜测的令牌或可点击的链接,在采取某些措施证明用户收到电子邮件之前不要激活)。我只是想提一下,这种方法通常称为“确认选择加入”或“闭环确认”,以防您想使用一些好的搜索词。
  • @Eric J - 虽然链接很有帮助

标签: php


【解决方案1】:

您可能不仅要确保电子邮件地址有效,还要确保它属于该特定用户。执行此操作的常用方法是发送带有链接的电子邮件。用户必须点击链接才能激活帐户。

例如,链接可能如下所示:

http://example.com/activate?token=bc59fb46c9a0a25346889e5ab336f11c

token 是您生成并存储在数据库中的随机字符串,链接到该帐户。然后activate 页面后面的服务器端代码将激活该帐户。如果您在一周内没有收到此token 的点击,您可以清理帐户和激活令牌。


补充回复您的评论...

另一种方法是启动 SMTP 连接,并尝试开始发送电子邮件。这类似于邮件服务器中的callback verification。例如(< 是邮件服务器所说的,> 是您的脚本可能发送的):

< 220 example.com ESMTP Postfix
> EHLO foobar.com
< 250 OK
> MAIL FROM: noreply@foobar.com
< 250 OK
> RCPT TO: johndoe@example.com
< 550 Recipient address rejected: User unknown in local recipient table
> QUIT
< 221 Bye

这种方法有几个严重的问题,这就是为什么它没有在实践中使用。其中大部分会导致错误接受的消息,有些会导致检查完全失败:

  • 如果您的站点位于禁止端口 25 (SMTP) 和 445 (SSMTP) 上的传出连接的防火墙后面,您甚至无法连接到远程服务器。
  • 此技术不会告诉您地址是否输入错误,但会生成另一个有效地址。例如,hotmail.com,几乎所有您能想象到的地址都会被占用。
  • 如果邮件服务器关闭或无法访问,则帐户创建将失败。
  • 如果邮件服务器配置为接受无效地址的邮件,则任何地址都将被接受。
  • 如果邮件服务器不是最终收件人,而只是一个中继主机,则任何地址都将被接受。
  • 如果您过于频繁地探测邮件服务器,它可能会将您列入黑名单。
  • 您的网站可能会被恶意人员或机器人滥用来攻击邮件服务器。 (当您发送完整的验证电子邮件时也是如此。在这两种情况下都使用验证码。)

另见the Postfix manuala disputed section on Wikipedia。我希望这份清单足够长,足以让您的客户相信他的问题没有好的解决方案,并且他应该停止向您询问不可能的事情。

【讨论】:

  • 你需要这样做,否则用户可能会提交一个真实的电子邮件地址......它属于其他人。
  • 我在你输入的时候澄清了:)
  • 是的,你是对的,事实上我的客户已经有这种激活,但他想消除点击链接的麻烦。我能说什么是客户的意志不能做任何事。
【解决方案2】:

为什么不实施验证系统。他们创建一个帐户。向他们发送一封带有验证码的电子邮件。他们单击电子邮件中的链接,然后运行该数据库并激活该特定验证 ID。

许多网站都使用这种技术,它有助于保持某种控制。

希望对你有帮助

【讨论】:

  • 好吧,我的客户已经按照您的描述进行了验证,但他想让用户更轻松。
【解决方案3】:

您也可以使用 PHP 函数 checkdnsrr($hostname)。例如:

if (checkdnsrr("comcast.net")) 
{ 
echo 'Email valid!'
return true;
}
else
{
echo 'Email invalid!';
return false;
}

这将返回 true 并回显“电子邮件有效!”因为 comcast.net 是一个有效的 ISP。此功能至少会阻止您的用户输入“johndoe@foobar.com”。

【讨论】:

  • 谢谢我实际上是在绊倒这个,我想真的想检查“johndoe”部分。但老实说,我真的怀疑用 PHP =(
【解决方案4】:

这是一项将验证电子邮件地址的服务,不确定这是否是您感兴趣的预期路线。 Service

【讨论】:

    【解决方案5】:

    查看 Regular Expressions,这是一种验证电子邮件格式以确保它是有效的电子邮件结构(即包含“@”、具有顶级域、域等)

    这只会确保电子邮件有效,但像 fakeMan@FakeLand.com 这样的虚假电子邮件仍然可以通过。为确保电子邮件是真实的,您需要通过邮件服务器发送电子邮件,并检查是否有退回邮件。该过程可能需要一段时间,因为您必须等待电子邮件服务器回复回复,这很难预测需要多长时间。如果您希望您的用户等待几天,那很好。

    标准是使用正则表达式验证电子邮件以确保其格式正确。然后你要做的就是向用户的电子邮件发送一个验证密钥。他们需要一个有效的电子邮件,然后才能获得密钥,以完成注册过程。

    当然,仍然有用户使用临时电子邮件注册网站。这是一封存在 24 小时左右的电子邮件,足以让他们获得验证密钥......除了将所有这样做的服务列入黑名单之外,没有真正的方法可以绕过这样做的用户(而且有很多。)

    【讨论】:

    【解决方案6】:

    这是真正的电子邮件语法正则表达式:http://ex-parrot.com/~pdw/Mail-RFC822-Address.html

    你看,这不是一件小事。

    【讨论】:

      猜你喜欢
      • 2011-10-25
      • 2023-03-20
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 2016-04-06
      • 2011-10-07
      • 1970-01-01
      相关资源
      最近更新 更多