如何使用PHP过滤/删除Google电子邮件别名?

6

2
你不应该这样做。有许多使用 Gmail 的域名,你不知道正在使用 Gmail。还有其他原因,某些人的用户名中可能会有“+”符号。 - Brad
@Brad 我能否通过DNS检查电子邮件域名是否与Google账户相关联? - Jonas WebDev
@Jonas 不是很可靠。一家公司可以使用Google Apps,但仍然在Google之前使用其他SMTP服务器。这并不是很常见的情况。许多公司将其邮件用户分为Google Apps和Exchange等。例如,在从某个系统迁移到Google Apps期间,这是一个非常常见的情况。 - Brad
3
因为有人给这个问题和我的回答点了踩,但没有解释原因,所以我给你点了赞。我认为这是一个基于正则表达式优点的有效问题。 - user559633
很好,@tristan,谢谢。我也认为这个问题很重要,因为一些Web应用程序提供基于唯一电子邮件的任何服务,必须检查此问题。 - Jonas WebDev
2个回答

14

我不同意那个评论直接说你不应该剥离“过滤器”(例如,user_email+some_filter_to_flag_incoming_messages@example.org)。"你的用例和我的用例不一样"等等。[0]

简而言之:你要找的正则表达式模式是:'(\+.*)(?=\@)'

解释:

首先,编写一个正则表达式,匹配文字“+”和任何单个字符任意次数

'(\+.*)'

当用空字符串替换此模式时,将会把 tristan+some_filter@example.org 转换为 tristan。如果您决定在 @ 符号上拆分,那么恭喜您,将结果字符串连接到 '@' + domain.TLD 就完成了。我提到这一点是因为您可能已经拆分了电子邮件地址,但它仍然存在。

如果您在 @ 符号上拆分用户电子邮件地址,则需要使用“正向先行断言”(如果它前面跟着我指定的内容,则匹配此模式)来告诉您的匹配何时停止(以便我们不会取走太多):

'(\+.*)(?=\@)'

有了这个,我们得到了 tristan@example.org。太好了,实际上并不那么困难。

[0]: 在我的一个应用程序中,我存储用户提供的包含筛选器的原始电子邮件地址以进行通信,但跟踪筛选器使用情况,并将经过引用内部参考的规范帐户(例如user_email@gmail.com)视为没有筛选器的版本。我这样做是为了让选择通过电子邮件地址相互查找的用户更容易。

我理解人们为什么使用别名/筛选器:

  • 它们给人一种错觉,认为它们可以用于跟踪垃圾邮件发送者(好像电子邮件收割机不会在出售列表之前删除筛选器)
  • 它们在路由电子邮件或触发事件方面非常有用(例如,当您从me+package_delivery@domain.tld收到电子邮件时发送短信)
  • “哦,我可以这样做?”因素

这就是说,“我明白了,人们喜欢筛选器”,但作为应用程序作者或公司,记录它们是有合理理由的。


4
编辑:哇,为什么会有踩?这是一个正则表达式问题,现在已经有一个有效的答案了。 - user559633
1
关于您的[0]点:确切地说,很容易操作电子邮件列表以删除别名。 - Jonas WebDev
一个新的问题:我可以过滤掉Gmail域名的电子邮件,以避免在我的Web应用程序中使用相同的电子邮件地址进行新注册(真实的AKA,没有别名)吗?你觉得呢?PS:考虑到Gmail的流行程度,我这么说。 - Jonas WebDev
1
新问题意味着在Stackoverflow上有新的问题,但就其价值而言,我只为我的应用程序删除gmail域上的过滤器,因为我知道它们的规则(极不可能,但是不同的服务可能认为a+bc@example.orga@example.org是不同的帐户)。如果我的答案对您有帮助,请标记为已接受。 - user559633

6
我写了一个在php中的函数,用来完成这个操作:
function unalias_gmail($email) {
    return preg_replace('/(\+[^\@]+)/', '', $email);
}

如果有别名,此代码将返回电子邮件地址中的电子邮件地址,否则将返回给定的电子邮件地址。我有一个phpunit的dataProvider,你可以看到我的测试:

<?php

require_once __DIR__ . '/path/to/helper.php';
use PHPUnit\Framework\TestCase;

class HelperTest extends TestCase
{
    public function data_test_unalias_gmail(): array
    {
        return array(
            // Provided email vs the expected result
            array('foo@gmail.com', 'foo@gmail.com'),
            array('foo_bar@gmail.com', 'foo_bar@gmail.com'),
            array('foo-bar@gmail.com', 'foo-bar@gmail.com'),
            array('foo+bar@gmail.com', 'foo@gmail.com'),
        );
    }

    /**
     * @dataProvider data_test_unalias_gmail
     */
    public function test_unalias_gmail($email, $expected): void
    {
        $actual = unalias_gmail($email);
        $this->assertEquals($expected, $actual);
    }
}

给我一个快乐的结果 OK (4个测试, 4个断言) =]

注意: 如果他们开始允许在域名中使用加号,这将需要一些修改!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接