每一个你不满意的现在,都有一个你不努力的曾经。

[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

Card image cap

每一个你不满意的现在,都有一个你不努力的曾经。