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

Laravel:如何在邮件模板中获取收件人邮箱以生成退订链接?

在Laravel邮件视图中获取收件人邮箱的正确姿势

嘿,这个问题我刚好踩过坑!首先要明确:绝对不要直接修改vendor目录里的邮件视图——因为composer更新框架的时候,这些文件会被完全覆盖,你的修改就白费了。下面给你几个稳妥的方案,让所有邮件都能拿到收件人邮箱生成退订链接:

1. 先把默认邮件视图发布到本地目录

Laravel允许你把框架自带的邮件视图复制到自己的resources/views/vendor/mail目录,这样修改就不会被框架更新影响。执行这个命令:

php artisan vendor:publish --tag=laravel-mail

执行完后,你就能在resources/views/vendor/mail下找到layout.blade.php、message.blade.php这些文件,以后就改这里的文件就行。

2. 给所有邮件统一传递收件人邮箱

要让所有邮件视图都能拿到收件人邮箱,最省心的方式是创建一个基础Mailable类,让所有业务邮件都继承它:

步骤一:创建BaseMailable类

在app/Mail目录下新建BaseMailable.php:

namespace App\Mail;

use Illuminate\Mail\Mailable;

class BaseMailable extends Mailable
{
    public function build()
    {
        // 从$this->to集合中取出第一个收件人的邮箱(支持多个收件人,这里取第一个)
        $recipientEmail = $this->to->first()?->email;
        
        // 把收件人邮箱共享给所有视图(包括布局文件)
        $this->with(['recipientEmail' => $recipientEmail]);

        return parent::build();
    }
}

步骤二:让所有业务邮件继承这个基类

比如你的欢迎邮件WelcomeEmail.php:

namespace App\Mail;

class WelcomeEmail extends BaseMailable
{
    // 你的邮件逻辑,比如接收用户模型
    public function __construct(public $user) {}

    public function build()
    {
        return $this->view('emails.welcome')
                    ->subject('欢迎加入我们!');
    }
}

这样不管你发什么邮件,只要继承了BaseMailable,视图里就自动有$recipientEmail变量了。

3. 在视图中生成退订链接

现在去修改你发布到本地的邮件布局(比如resources/views/vendor/mail/layout.blade.php),直接用$recipientEmail生成退订链接:

<!-- 比如在邮件底部添加退订链接 -->
<div style="margin-top: 20px; color: #999;">
    <p>不想收到此类邮件?<a href="{{ route('unsubscribe', ['email' => $recipientEmail]) }}" style="color: #666;">点击退订</a></p>
</div>

4. 单个邮件的临时处理(如果不想用基类)

如果只是某几封邮件需要这个功能,也可以直接在对应的Mailable类里传递:

public function build()
{
    $recipientEmail = $this->to->first()->email;

    return $this->view('emails.your-view')
                ->with([
                    'recipientEmail' => $recipientEmail,
                ]);
}

为什么之前调用$message等变量没生效?

你之前在视图里调用的$message其实是Swift_Message实例,但默认情况下Laravel并没有把它共享到视图里(除非你手动传递)。而且直接操作$message不如通过Mailable类的$this->to更符合Laravel的设计规范。

总结一下:核心思路是不要碰vendor文件,通过发布视图+基类共享变量的方式实现,既安全又能覆盖所有邮件场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:12:01