Laravel 9升级后Gmail/Yahoo邮件链接失效问题求助(多租户场景)
解决Laravel 9升级后多租户邮件链接失效问题
问题原因
Laravel 9默认启用了邮件链接跟踪功能,会自动替换邮件内的链接为带跟踪参数的短链接。但在archtechx/tenancy多租户环境下,跟踪链接的生成未适配当前租户域名,导致生成了错误的全局跟踪域名(如https://email.mail.mydomain.io/c/...),进而在Gmail/Yahoo等邮箱中无法正常跳转。
解决方案
1. 全局关闭邮件链接跟踪
如果不需要邮件链接跟踪功能,直接修改config/mail.php配置文件,禁用该功能:
'link_tracking' => false,
2. 仅针对特定邮件关闭跟踪
若需要保留全局跟踪,仅关闭特定邮件的链接跟踪,可在对应邮件类的build方法中添加withoutLinkTracking()调用:
class NotificationMail extends Mailable { public function build() { return $this->view('emails.notification') ->withoutLinkTracking(); // 关闭此邮件的链接跟踪 } }
3. 适配多租户环境的链接跟踪(保留跟踪功能)
如果需要继续使用链接跟踪,需确保跟踪域名使用当前租户的域名,可通过监听邮件发送事件修改跟踪链接:
- 首先在
app/Providers/EventServiceProvider.php中注册事件监听:
protected $listen = [ \Illuminate\Mail\Events\MessageSending::class => [ \App\Listeners\FixTenantMailLinkTracking::class, ], ];
- 然后创建监听类
app/Listeners/FixTenantMailLinkTracking.php:
namespace App\Listeners; use Illuminate\Mail\Events\MessageSending; class FixTenantMailLinkTracking { public function handle(MessageSending $event) { // 确保当前处于租户上下文 if (!tenant()) { return; } $message = $event->message; $body = $message->getBody(); // 将默认跟踪域名替换为当前租户域名 $body = str_replace('https://email.mail.mydomain.io/c/', tenant()->domain . '/c/', $body); $message->setBody($body); } }
内容的提问来源于stack exchange,提问作者Farzan Badakhshan
相关产品推荐
相关产品推荐

