【问题标题】:How to filter/remove Google Email ALIAS with PHP?如何使用 PHP 过滤/删除 Google 电子邮件别名?
【发布时间】:2014-12-25 13:41:12
【问题描述】:

我可以在 Google 帐户 (Gmail) 中创建无限制的电子邮件别名,参考:http://www.gizmodo.com.au/2014/09/how-to-use-the-infinite-number-of-email-addresses-gmail-gives-you/

但我需要过滤电子邮件地址以避免用户在我的应用程序中使用相同的原始电子邮件进行注册。

我想知道有什么办法可以解决这个问题吗?还是我的独特选择是使用正则表达式过滤?

【问题讨论】:

  • 你不应该这样做。有许多使用 Gmail 的域,但您不知道它们正在使用 Gmail。用户名中可能包含+ 的其他原因。
  • @Brad 我可以检查电子邮件域是否与 Google 帐户相关联吗?通过 DNS,例如
  • @Jonas 不可靠。公司可以使用 Google Apps,但在 Google 面前仍然有一些其他 SMTP 服务器。这并不少见。例如,许多公司会在 Google Apps 和 Exchange 之间拆分他们的邮件用户。这是从某些东西迁移到 Google Apps 期间非常常见的情况。
  • 对这个问题投了赞成票,因为有人在没有解释原因的情况下对它和我的回答投了反对票。我认为这是一个基于其正则表达式优点的有效问题。
  • nice @tristan,谢谢....我认为这个问题也很重要,因为某些 Web 应用程序提供任何基于唯一电子邮件的服务,它必须检查这个问题。

标签: php regex email email-validation google-account


【解决方案1】:

我在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 tests, 4 assertions) =]

注意:如果他们开始允许域中的加号,这将需要一些爱!

【讨论】:

    【解决方案2】:

    我不完全同意评论指出您不应该去掉“过滤器”(例如 user_email+some_filter_to_flag_incoming_messages@example.org)。 “你的用例和我的用例不一样”等等。[0]

    tl;dr:您正在寻找的正则表达式模式是:'(\+.*)(?=\@)'

    解释:

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

    '(\+.*)'
    

    当用空字符串替换这个模式时,这会将tristan+some_filter@example.org 变成tristan。如果您决定拆分 @ 符号,恭喜,将生成的字符串连接到 '@' + domain.TLD 到此,您就完成了。我提到这一点,以防你已经拆分了电子邮件地址,但它仍然存在。

    如果您在@符号上拆分用户电子邮件地址,则需要使用“正向预测”(如果它由 this thing 进行,则匹配此模式我指定)告诉你的比赛什么时候停止(所以我们不会带走太多):

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

    有了这个,我们得到tristan@example.org。万岁,实际上并没有那么粗糙。


    [0]:在我的一个应用程序中,我存储了用户提供给我用于通信的原始包含过滤器的电子邮件地址,但跟踪过滤器的使用情况并认为规范帐户(内部引用)是没有的版本过滤器(例如 user_email@gmail.com)。我这样做是为了让选择加入的用户更容易通过电子邮件地址找到彼此。

    我理解人们为什么使用别名/过滤器:

    • 它们给人一种可以用来跟踪垃圾邮件发送者的错觉(就好像电子邮件收割机在出售列表之前不会删除过滤器一样)
    • 它们可用于路由电子邮件或触发事件(例如,当您收到来自 me+package_delivery@domain.tld 的电子邮件时发送文本)
    • “天哪,我能做到吗?”因素

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

    【讨论】:

    • 编辑:哇,为什么投反对票?这是一个正则表达式问题,现在它有一个有效的答案。
    • 关于您的 [0] 点:确切地说,操作电子邮件列表以删除别名非常容易。
    • 一个新问题:我可以只过滤 Gmail 域的电子邮件,以避免在我的 Web 应用程序上使用相同的电子邮件地址进行新的注册,真正的 AKA 没有别名(重复的电子邮件),你怎么看? .... PS:我这么说,是考虑到 Gmail 的受欢迎程度
    • 新问题意味着 Stackoverflow 上的新问题,但就其价值而言,我只为我的应用程序删除了 gmail 域上的过滤器,因为我知道它们的规则(极不可能,但不同的服务可能会考虑 a+bc @example.org 是与 a@example.org 不同的帐户)。如果我的回答对您有帮助,请将其标记为已接受。
    猜你喜欢
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 2012-03-09
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    相关资源
    最近更新 更多