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

Laravel通过AWS SES发送自定义模板验证邮件报错排查

错误根因

Illuminate\Auth\Notifications\VerifyEmail::toMailUsing 注册的回调存在严格返回值约束:必须返回Illuminate\Notifications\Messages\MailMessage实例或自定义Mailable对象,供框架后续完成通知调度。
当前代码的问题在于回调内调用自定义send_email方法完成发信后,没有返回任何值,框架拿到null继续执行默认邮件发送逻辑时,会触发类型错误。这也是邮件能正常送达但程序抛错的核心原因:自定义发信逻辑已经独立完成了AWS SES发信动作,但框架未收到预期的返回值,后续流程执行失败。
另外代码中直接实例化控制器类调用发信方法不符合Laravel分层规范,控制器只负责处理HTTP请求,通用发信逻辑应当抽离到独立服务或Mailable类中,避免出现依赖注入失效、请求上下文缺失的问题。


修复方案

二选一即可:

方案1:保留现有自定义发信逻辑,终止框架后续流程

如果要完全复用已封装的send_email方法,在回调执行完发信逻辑后,返回一个空的MailMessage实例终止框架后续的默认发信动作即可,不会产生重复发信问题。
注意:请先将SendEmailController中的send_email逻辑抽离到独立服务类(例如app/Services/MailService.php),不要直接实例化控制器。

// AuthServiceProvider.php boot方法内
use Illuminate\Auth\Notifications\VerifyEmail;
use Illuminate\Notifications\Messages\MailMessage;
use App\Services\MailService;

public function boot()
{
    // ...其他boot逻辑
    VerifyEmail::toMailUsing(function ($notifiable, $url) {
        $params = [
            'first_name' => $notifiable->first_name,
            'verify_url' => $url
        ];

        app(MailService::class)->send_email('verify', $notifiable->email, $params);
        // 返回空实例终止框架后续处理
        return new MailMessage();
    });
}

方案2:遵循框架原生约定,返回自定义Mailable走默认发信流程

如果不需要完全自定义发信链路,可以直接在回调中返回绑定了自定义Blade模板的Mailable实例,框架会自动使用配置好的AWS SES驱动完成发信,不需要手动调用发信方法,可维护性更高。

  • 第一步:生成验证邮件Mailable类,执行Artisan命令:php artisan make:mail VerifyEmail
  • 第二步:配置Mailable类绑定模板与参数:
// app/Mail/VerifyEmail.php
namespace App\Mail;

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

class VerifyEmail extends Mailable
{
    use Queueable, SerializesModels;

    public string $firstName;
    public string $verifyUrl;

    public function __construct(string $firstName, string $verifyUrl)
    {
        $this->firstName = $firstName;
        $this->verifyUrl = $verifyUrl;
    }

    public function build()
    {
        return $this->subject('邮箱验证提醒')
                    ->view('emails.verify'); // 对应resources/views/emails/verify.blade.php模板
    }
}
  • 第三步:修改toMailUsing回调返回Mailable实例:
VerifyEmail::toMailUsing(function ($notifiable, $url) {
    return new \App\Mail\VerifyEmail($notifiable->first_name, $url);
});

模板中可直接通过{{ $firstName }}、{{ $verifyUrl }}输出传入的参数,不需要手动做变量注入。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:01:59