You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Mailtrap在任务截止前1天给未完成任务用户发送邮件提醒

实现Laravel任务截止提醒邮件(Mailtrap发送)

以下是针对「给拥有状态为open且距离截止日期还有1天的任务的用户发送提醒邮件」需求的完整实现方案:

1. 配置Mailtrap邮件服务

在项目根目录的.env文件中,配置Mailtrap的SMTP参数:

MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=你的Mailtrap用户名
MAIL_PASSWORD=你的Mailtrap密码
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=reminder@yourapp.com
MAIL_FROM_NAME="${APP_NAME} 任务提醒"

2. 创建邮件类

生成任务提醒专属邮件类:

php artisan make:mail TaskDeadlineReminder

修改app/Mail/TaskDeadlineReminder.php,添加任务数据接收与视图绑定逻辑:

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Collection;

class TaskDeadlineReminder extends Mailable
{
    use Queueable, SerializesModels;

    public $tasks;

    public function __construct(Collection $tasks)
    {
        $this->tasks = $tasks;
    }

    public function build()
    {
        return $this->subject('任务截止提醒:明天有任务到期')
                    ->markdown('emails.task-deadline');
    }
}

3. 编写邮件视图

在resources/views/emails/目录下创建task-deadline.blade.php,构建邮件内容:

@component('mail::message')
# 任务截止提醒

你有 {{ $tasks->count() }} 个任务将在明天到期,请及时处理:

@foreach($tasks as $task)
- **任务标题**: {{ $task->title }}
  - 截止日期: {{ $task->deadline->format('Y-m-d') }}
  - 描述: {{ $task->description }}
@endforeach

谢谢!
{{ config('app.name') }}
@endcomponent

4. 配置定时任务逻辑

在app/Console/Kernel.php的schedule方法中,添加每日执行的任务查询与邮件发送逻辑:

<?php

namespace App\Console;

use App\Mail\TaskDeadlineReminder;
use App\Models\Task;
use Carbon\Carbon;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
use Illuminate\Support\Facades\Mail;

class Kernel extends ConsoleKernel
{
    protected function schedule(Schedule $schedule): void
    {
        $schedule->call(function () {
            // 筛选符合条件的任务并按用户分组
            $tasksByUser = Task::where('status', 'open')
                ->whereDate('deadline', Carbon::tomorrow())
                ->with('user')
                ->get()
                ->groupBy('user_id');

            // 遍历用户发送邮件
            foreach ($tasksByUser as $userId => $tasks) {
                $user = $tasks->first()->user;
                Mail::to($user->email)->send(new TaskDeadlineReminder($tasks));
            }
        })->dailyAt('09:00'); // 每天上午9点执行
    }

    protected function commands(): void
    {
        $this->load(__DIR__.'/Commands');
        require base_path('routes/console.php');
    }
}

5. 确认任务模型关联

在app/Models/Task.php中,确保已定义与用户的关联关系:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Task extends Model
{
    use HasFactory, SoftDeletes;

    protected $fillable = [
        'title', 'description', 'user_id', 'client_id', 'project_id', 'deadline', 'status'
    ];

    // 关联用户模型
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

6. 测试验证

  • 手动触发调度任务测试邮件发送:
php artisan schedule:run
  • 登录Mailtrap控制台,查看发送的邮件是否正常显示。

内容的提问来源于stack exchange,提问作者jeyoley235

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 15:36:18