如何使用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
相关产品推荐
相关产品推荐

