
“又来了一批垃圾注册!” 这句话是不是听起来很耳熟?作为开发者,我们辛辛苦苦搭建起一个网站、一个应用,希望吸引真实的用户。然而,总有一些“不速之客”——使用一次性邮箱(Disposable Email Address,简称DEA)的用户,来扰乱我们的社区。他们可能只是为了领取一个免费试用、绕过注册限制,或者更糟糕,是为了进行恶意活动,比如发送垃圾邮件。
这些一次性邮箱带来的问题可不少:
起初,我们可能会尝试手动维护一个黑名单,但很快就会发现,一次性邮箱提供商层出不穷,黑名单更新速度永远跟不上变化,这简直是一场“猫鼠游戏”。那么,有没有一种更智能、更自动化的方式来解决这个问题呢?
elliotjreed/disposable-emails-filter 登场答案是肯定的!今天,我要向大家介绍一个强大的 PHP Composer 包:elliotjreed/disposable-emails-filter。这个库专门用于检测一个邮箱地址是否来自一次性或临时邮箱提供商。它基于一个持续更新的、由社区维护的域名列表(由 github.com/disposable-email-domains/disposable-email-domains 提供),让你能够轻松地将这些“不速之客”拒之门外。
该项目及其维护者并不反对使用一次性/临时邮箱,只是提供一种检测它们的方法,以便开发者根据自己的业务需求进行处理。
使用 Composer 安装 elliotjreed/disposable-emails-filter 非常简单,只需一条命令:
<code class="bash">composer require elliotjreed/disposable-emails-filter</code>
请注意,如果你使用的是 PHP 8.2 或更高版本,可以直接使用最新版本。对于旧版本的 PHP (如 7.4-8.1),该库也提供了对应的版本兼容性(版本3或4),确保你的项目能够顺利集成。
elliotjreed/disposable-emails-filter
安装完成后,你就可以在代码中使用了。
1. 检查邮箱是否为一次性邮箱:
这个库提供了静态和非静态两种使用方式,你可以根据个人喜好选择。
<pre class="brush:php;toolbar:false;"><?php
require 'vendor/autoload.php';
use ElliotJReed\DisposableEmail\Email;
use ElliotJReed\DisposableEmail\DisposableEmail; // 用于静态方法
$emailToCheck = 'test@mailinator.com'; // 一个常见的一次性邮箱域名
$legitEmail = 'user@example.com';
// 非静态方法示例
if ((new Email())->isDisposable($emailToCheck)) {
echo $emailToCheck . ' 是一个一次性邮箱!' . PHP_EOL; // 输出:test@mailinator.com 是一个一次性邮箱!
} else {
echo $emailToCheck . ' 是一个普通邮箱。' . PHP_EOL;
}
if ((new Email())->isDisposable($legitEmail)) {
echo $legitEmail . ' 是一个一次性邮箱!' . PHP_EOL;
} else {
echo $legitEmail . ' 是一个普通邮箱。' . PHP_EOL; // 输出:user@example.com 是一个普通邮箱。
}
// 静态方法示例
if (DisposableEmail::isDisposable($emailToCheck)) {
echo $emailToCheck . ' (静态方法) 同样是一个一次性邮箱!' . PHP_EOL;
}2. 获取所有一次性邮箱域名列表:
如果你需要查看当前库中包含的所有一次性邮箱域名,也可以轻松获取:
<pre class="brush:php;toolbar:false;"><?php
require 'vendor/autoload.php';
use ElliotJReed\DisposableEmail\Email;
use ElliotJReed\DisposableEmail\DisposableEmail; // 用于静态方法
echo "部分一次性邮箱域名列表:" . PHP_EOL;
$count = 0;
foreach ((new Email())->getDomainList() as $domain) { // 使用非静态方法
echo $domain . PHP_EOL;
$count++;
if ($count >= 5) { // 只显示前5个作为示例
break;
}
}
// 也可以使用静态方法:
// foreach (DisposableEmail::getDomainList() as $domain) { /* ... */ }3. 处理无效邮箱地址:
在使用 isDisposable() 方法之前,强烈建议你先验证邮箱地址的格式。如果传入的邮箱地址格式不正确,elliotjreed/disposable-emails-filter 会抛出 InvalidEmailException 异常。
<pre class="brush:php;toolbar:false;"><?php
require 'vendor/autoload.php';
use ElliotJReed\DisposableEmail\Email;
use ElliotJReed\DisposableEmail\Exception\InvalidEmailException; // 引入异常类
$invalidEmail = 'not-a-real-email-address#example.net';
$validDisposableEmail = 'test@tempmail.com';
if (filter_var($invalidEmail, FILTER_VALIDATE_EMAIL)) {
try {
if ((new Email())->isDisposable($invalidEmail)) {
echo $invalidEmail . ' 是一个一次性邮箱。' . PHP_EOL;
} else {
echo $invalidEmail . ' 是一个普通邮箱。' . PHP_EOL;
}
} catch (InvalidEmailException $e) {
echo '邮箱格式错误:' . $e->getMessage() . PHP_EOL; // 如果filter_var判断不严谨,这里可能会捕获到
}
} else {
echo $invalidEmail . ' 不是一个有效的邮箱地址格式。' . PHP_EOL; // 输出:not-a-real-email-address#example.net 不是一个有效的邮箱地址格式。
}
if (filter_var($validDisposableEmail, FILTER_VALIDATE_EMAIL)) {
try {
if ((new Email())->isDisposable($validDisposableEmail)) {
echo $validDisposableEmail . ' 是一个一次性邮箱。' . PHP_EOL; // 输出:test@tempmail.com 是一个一次性邮箱。
} else {
echo $validDisposableEmail . ' 是一个普通邮箱。' . PHP_EOL;
}
} catch (InvalidEmailException $e) {
echo '邮箱格式错误:' . $e->getMessage() . PHP_EOL;
}
}4. 使用自定义域名列表:
如果你有自己的一次性邮箱域名黑名单,或者需要补充库中没有的域名,你可以创建一个纯文本文件,每行一个域名,然后将其路径传递给 Email 类的构造函数:
<pre class="brush:php;toolbar:false;"><?php
require 'vendor/autoload.php';
use ElliotJReed\DisposableEmail\Email;
use ElliotJReed\DisposableEmail\Exception\InvalidDomainListException;
// 假设你的自定义列表文件在 /path/to/custom/list.txt
// 文件内容可能如下:
// mytempdomain.com
// anotherdisposable.net
$customListPath = __DIR__ . '/custom_disposable_domains.txt'; // 假设文件在当前目录下
// 为了演示,我们先创建一个虚拟文件
file_put_contents($customListPath, "mytempdomain.com\nanotherdisposable.net\n");
try {
$emailChecker = new Email($customListPath);
// 现在 $emailChecker 会使用你的自定义列表来判断
if ($emailChecker->isDisposable('user@mytempdomain.com')) {
echo 'user@mytempdomain.com 在自定义列表中被识别为一次性邮箱。' . PHP_EOL; // 输出:user@mytempdomain.com 在自定义列表中被识别为一次性邮箱。
} else {
echo 'user@mytempdomain.com 不在自定义列表中。' . PHP_EOL;
}
} catch (InvalidDomainListException $e) {
echo '自定义域名列表文件无效:' . $e->getMessage() . PHP_EOL;
} finally {
// 清理创建的虚拟文件
if (file_exists($customListPath)) {
unlink($customListPath);
}
}elliotjreed/disposable-emails-filter?通过集成 elliotjreed/disposable-emails-filter,你的应用将获得以下显著优势:
告别一次性邮箱带来的烦恼,让你的应用拥有一个更健康、更真实的用户生态。elliotjreed/disposable-emails-filter 提供了一个优雅而高效的解决方案,帮助你轻松应对这一挑战。如果你也曾被垃圾注册困扰,那么现在就是时候将这个强大的 Composer 包引入你的项目了!
以上就是如何识别并阻止一次性邮箱注册?elliotjreed/disposable-emails-filter助你轻松过滤垃圾用户的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号