Laravel 11动态设置SMTP发件人(Gmail环境异常解决)
动态设置Laravel 11邮件发件人及Gmail环境问题解决
一、实现动态发件人设置
要让邮件使用当前登录用户的邮箱作为发件人,需修改Mailable类,让它接收并应用发件人信息:
1. 更新TicketIssueEmail Mailable类
添加发件人邮箱和名称的私有属性,在构造函数中接收参数,并在envelope()方法里指定发件人:
namespace App\Mail; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Mailable; use Illuminate\Mail\Mailables\Content; use Illuminate\Mail\Mailables\Envelope; use Illuminate\Queue\SerializesModels; use Illuminate\Mail\Mailables\Address; // 引入Address类 class TicketIssueEmail extends Mailable { use Queueable, SerializesModels; public $msg; public $sub; private $fromEmail; private $fromName; // 构造函数新增发件人参数 public function __construct($msg, $subject, $fromEmail, $fromName) { $this->msg = $msg; $this->sub = $subject; $this->fromEmail = $fromEmail; $this->fromName = $fromName; } public function envelope(): Envelope { return new Envelope( subject: $this->sub, // 设置动态发件人 from: new Address($this->fromEmail, $this->fromName) ); } public function content(): Content { return new Content(view: 'backend.customer.pages.email'); } public function attachments(): array { return []; } }
2. 修改控制器中的邮件发送逻辑
创建TicketIssueEmail实例时,传入已获取的当前用户邮箱和名称:
// 替换原有的Mail发送代码 Mail::to($to)->send(new TicketIssueEmail($msg, $subject, $from, $sender_name));
二、解决Gmail环境下发件人显示异常问题
问题原因
Gmail SMTP服务器对发件人地址有严格限制:
- 若使用普通Gmail账户(非Workspace),未验证的发件人地址会被强制替换为SMTP登录账户的邮箱(即
.env里MAIL_USERNAME对应的邮箱),这就是清空MAIL_FROM_ADDRESS后仍显示旧邮箱的原因。 - Mailtrap无此类限制,所以能正常显示动态发件人。
解决步骤
验证发件人邮箱
- 登录你SMTP配置中
MAIL_USERNAME对应的Gmail账户 - 进入「设置」→「账户和导入」→「发送邮件作为」
- 点击「添加另一个电子邮件地址」,输入当前用户的邮箱和名称
- 按照提示完成邮箱验证(接收验证邮件并点击确认链接)
- 验证完成后,该邮箱就能作为合法发件人使用。
- 登录你SMTP配置中
确保SMTP配置正确
- 若你的Gmail账户开启了两步验证(2FA),必须使用应用专用密码作为
MAIL_PASSWORD,不能用普通登录密码。 - 若未开启2FA,需在Gmail账户设置中开启「允许不太安全的应用访问」(推荐优先开启2FA并使用应用密码,安全性更高)。
- 若你的Gmail账户开启了两步验证(2FA),必须使用应用专用密码作为
内容的提问来源于stack exchange,提问作者Shabnam Sabah
相关产品推荐
相关产品推荐

