验证忽略 gmail 或其他服务别名的唯一电子邮件
Validating unique email ignoring gmail or other services aliases
场景是我只想接受一个忽略 gmail 别名的人的唯一电子邮件地址(如果任何其他服务做类似的事情)
这样做的原因是我们赠送了数量有限的折扣码,公平地说,我们不希望有人只用一个电子邮件地址就索取大量折扣码。
据我了解:
- 如果
gmail.com
或 googlemail.com
则删除 +
和后面的任何内容,因为那是别名。
- 如果是
gmail
则删除 username
中的任何点,因为它们会被忽略。 john.smith@
等同于 johnsmith@
- 不要只是使
+
符号无效,因为它对电子邮件地址有效。
是否有任何其他我需要注意的服务允许将他们的电子邮件地址别名化为多种形式以及我的场景的任何其他注意事项。
更新 我有一个数据库来存储提交的电子邮件地址和已申请的代码。
我也明白很难完全阻止人们申请多个代码。不允许别名只是为了可能减少它。
干杯。
编写代码以忽略单个服务(如 Gmail)中的少数已知别名格式并不是什么大问题。然而,试图阻止一个人仅根据电子邮件地址申请多个折扣是一项不可能完成的任务。
创建新电子邮件地址和别名的方法有很多种。例如,有一些服务可以让您创建一次性电子邮件,通过这些服务您可以根据需要拥有任意多个不同的地址。此外,只需几美元,您就可以拥有自己的电子邮件主机和您自己的域,您可以在其中注册一堆地址 and/or 一个捕获所有地址。
要阻止任何人下定决心索取您的大量折扣,将需要大量资源。不是没有其他识别方法,除了电子邮件地址。
我会考虑添加其他验证方法。根据您在做什么,这可能是链接到 Facebook,甚至要求提供信用卡详细信息以进行验证。
在这种情况下,您可以使用正则表达式。使用此代码,您可以将电子邮件数组转换为别名数组(您可以为每个邮件服务自定义符号模式):
代码:
$mails = ['johnsmith@gmail.com', 'johnsmith@yahoo.com', 'jo.hn.sm.ith@gmail.com'];
$valid_mails = [];
$pattern = "/^(?P<name>[A-Za-z0-9._+\-\']+)@(?P<mail>[A-Za-z0-9.\-]+)\.[A-Za-z]{2,}$/";
$symbol_pattern = ['gmail'=>'/(\.|\+|-)/','yahoo'=>'/(\.)/'];
foreach ($mails as $key=>$mail) {
$valid_mails[$key] = preg_replace_callback($pattern, function($match){
global $symbol_pattern;
return preg_replace($symbol_pattern[$match['mail']], '', $match['name']);
}, $mail);
}
var_dump($valid_mails);
输出:
array(3) { [0]=> string(9) "johnsmith" [1]=> string(9) "johnsmith" [2]=> string(9) "johnsmith" }
场景是我只想接受一个忽略 gmail 别名的人的唯一电子邮件地址(如果任何其他服务做类似的事情)
这样做的原因是我们赠送了数量有限的折扣码,公平地说,我们不希望有人只用一个电子邮件地址就索取大量折扣码。
据我了解:
- 如果
gmail.com
或googlemail.com
则删除+
和后面的任何内容,因为那是别名。 - 如果是
gmail
则删除username
中的任何点,因为它们会被忽略。john.smith@
等同于johnsmith@
- 不要只是使
+
符号无效,因为它对电子邮件地址有效。
是否有任何其他我需要注意的服务允许将他们的电子邮件地址别名化为多种形式以及我的场景的任何其他注意事项。
更新 我有一个数据库来存储提交的电子邮件地址和已申请的代码。
我也明白很难完全阻止人们申请多个代码。不允许别名只是为了可能减少它。
干杯。
编写代码以忽略单个服务(如 Gmail)中的少数已知别名格式并不是什么大问题。然而,试图阻止一个人仅根据电子邮件地址申请多个折扣是一项不可能完成的任务。
创建新电子邮件地址和别名的方法有很多种。例如,有一些服务可以让您创建一次性电子邮件,通过这些服务您可以根据需要拥有任意多个不同的地址。此外,只需几美元,您就可以拥有自己的电子邮件主机和您自己的域,您可以在其中注册一堆地址 and/or 一个捕获所有地址。
要阻止任何人下定决心索取您的大量折扣,将需要大量资源。不是没有其他识别方法,除了电子邮件地址。
我会考虑添加其他验证方法。根据您在做什么,这可能是链接到 Facebook,甚至要求提供信用卡详细信息以进行验证。
在这种情况下,您可以使用正则表达式。使用此代码,您可以将电子邮件数组转换为别名数组(您可以为每个邮件服务自定义符号模式):
代码:
$mails = ['johnsmith@gmail.com', 'johnsmith@yahoo.com', 'jo.hn.sm.ith@gmail.com'];
$valid_mails = [];
$pattern = "/^(?P<name>[A-Za-z0-9._+\-\']+)@(?P<mail>[A-Za-z0-9.\-]+)\.[A-Za-z]{2,}$/";
$symbol_pattern = ['gmail'=>'/(\.|\+|-)/','yahoo'=>'/(\.)/'];
foreach ($mails as $key=>$mail) {
$valid_mails[$key] = preg_replace_callback($pattern, function($match){
global $symbol_pattern;
return preg_replace($symbol_pattern[$match['mail']], '', $match['name']);
}, $mail);
}
var_dump($valid_mails);
输出:
array(3) { [0]=> string(9) "johnsmith" [1]=> string(9) "johnsmith" [2]=> string(9) "johnsmith" }