必须将 mail_mailer 设为 smtp,补全 mail_host、mail_port 等配置,使用 gmail 应用专用密码并确保 mail_from_address 与 mail_username 一致,执行 config:clear 后用 mail::raw() 测试。

必须先确认 MAIL_MAILER 环境变量已设为 smtp,否则 Laravel 8 会默认使用 log 驱动,根本不会发邮件。
检查 .env 中的 MAIL 配置项是否完整
Laravel 8 默认读取 .env 文件中的 MAIL_MAILER、MAIL_HOST、MAIL_PORT、MAIL_USERNAME、MAIL_PASSWORD 和 MAIL_FROM_ADDRESS。漏掉任意一项都可能导致连接失败或认证被拒。
-
MAIL_MAILER=smtp(不能写成MAIL_DRIVER,Laravel 8+ 已弃用该键) -
MAIL_HOST=smtp.gmail.com(Gmail 示例;若用 Mailgun/Postmark/自建 SMTP,请替换对应域名) -
MAIL_PORT=587(Gmail 推荐 TLS 端口;465 仅用于 SSL,需额外配置MAIL_ENCRYPTION=ssl) -
MAIL_USERNAME=your@gmail.com(Gmail 账号,注意:2022 年起 Google 已停用「应用专用密码」以外的密码登录,必须开启两步验证并生成专用密码) -
MAIL_PASSWORD=abcd1234efgh5678(不是邮箱密码,是 Google 账户里生成的 16 位应用专用密码) -
MAIL_FROM_ADDRESS=your@gmail.com(发件人地址,必须与MAIL_USERNAME一致,否则 Gmail 会拒绝)
运行 php artisan config:clear 后再测试
Mac 上改完 .env 后常因缓存未刷新导致配置不生效——尤其是通过 Valet 或 PHP 内置服务器启动时,config:cache 可能残留旧值。
- 执行
php artisan config:clear清除配置缓存 - 不要在开发环境运行
config:cache,它会固化.env值,掩盖配置问题 - 临时加一行调试代码验证驱动是否加载正确:
dd(config('mail.default'));应输出smtp
用 Mail::raw() 快速验证 SMTP 连通性
别急着走完整注册流程,先绕过队列和模板,直连 SMTP 测试最省时间。
use Illuminate\Support\Facades\Mail;
Mail::raw('Test from Laravel 8 on macOS', function ($message) {
$message->to('test@example.com')
->subject('Laravel Mail Test');
});
- 如果报
Connection could not be established with host smtp.gmail.com:检查网络、防火墙、端口是否被公司代理拦截(Mac 上可尝试关闭 Wi-Fi 再连热点复现) - 如果报
Expected response code 250 but got code "535":基本是MAIL_USERNAME/MAIL_PASSWORD不匹配,或未启用应用专用密码 - 如果报
Failed to authenticate on SMTP server:确认 Gmail 账户已开启「允许不够安全的应用访问」(不推荐)或更稳妥地使用专用密码 + 两步验证
最容易被忽略的是:Mac 自带的 sendmail 或 mail 命令路径可能干扰 Laravel 的 SMTP 初始化逻辑——哪怕你没在配置里用它。只要 which sendmail 有输出,就建议在 .env 显式补上 MAIL_MAILER=smtp,避免 Laravel 自动 fallback 到系统 mail 命令。这点在 Valet 环境下尤其隐蔽。











