每一个你不满意的现在,都有一个你不努力的曾经。
[Laravel]检测已发送电子邮件的打开状态
实现读取检测功能,以检查是否已读取Laravel发送的邮件。
很重要的一点
假设接收方的邮件应用程序可以接收HTML邮件。相反,如果您无法接收HTML或将其自动转换为文本邮件,则无法执行打开检测。
另外,此方法无法准确检测包装是否已打开。有一些模式可以确定即使实际上尚未打开该程序包也已被打开,并且即使打开了该程序包也无法检测到这些模式。
规范
通过"在HTML电子邮件中嵌入1x1透明图像"来执行打开检测。 准备用于1x1图像的路由,并在访问URL时将其记录在DB中。
在本地运行所有内容
实作 修改.env文件 邮件驱动配置。
.env
MAIL_MAILER=smtp
MAIL_HOST=smtp.qq.com
MAIL_PORT=25
MAIL_USERNAME=发件人账号
MAIL_PASSWORD=授权码
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=发件人地址,邮箱账号
MAIL_FROM_NAME=发件人名称
日志存储建模
$ php artisan make:model Log -m
Model created successfully.
Created Migration: xxxx_xx_xx_xxxxxx_create_logs_table
class CreateLogsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('logs', function (Blueprint $table) {
$table->id();
$table->string('user_agent');
$table->string('ip_address');
$table->timestamps();
});
}
~~省略~~
用于日志存储的模型"日志"具有用户代理和IP地址作为列。
<?php namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Log extends Model
{
use HasFactory;
protected $guarded = ['id'];
}
定义读取检测的路由
Route::get('/email/images', "EmailController@openMail")->name('open_mail');
EmailController.php
<?php namespace App\Http\Controllers;
use App\Models\Log;
use Illuminate\Http\Request;
class EmailController extends Controller
{
public function openMail(Request $request)
{
Log::create([
'user_agent' => $request->userAgent(),
'ip_address' => $request->ip(),
]);
// 将透明的1×1 png图像返回给客户端
return response(base64_decode("iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVQI12NgYAAAAAMAASDVlMcAAAAASUVORK5CYII="))
->header('Content-type', 'image/png');
}
}
添加了发送电子邮件的路由
Route::get('send', function () {
Mail::send('mails.hello', function ($message) {
$message->to('john@johndoe.com', 'John Doe');
$message->subject('Subject');
});
return "发送成功";
});
创建电子邮件模板
<img src="%7B%7B%20route('open_mail')%7D%7D" alt="">
在img标签的src属性中设置读取检测的路由。打开时获取日志,然后返回1x1透明png
每一个你不满意的现在,都有一个你不努力的曾经。