Laravel-mix-mjml转换邮件链接时POST表单参数无法传递如何修复
问题根因
- MJML默认的mjt.lu链接追踪逻辑仅针对带
href属性的<a>标签做替换,不会识别<form>标签的action属性,且追踪跳转本身基于GET请求的302重定向实现,天生不支持POST请求体透传,就算强行把表单action替换为追踪链接,提交的隐藏参数也会在跳转过程中被丢弃。 - Laravel-mix-mjml插件的默认链接扫描规则只匹配
href属性,没有覆盖form[action]选择器,所以浏览器预览环境下表单的action地址不会进入替换流程,自然不会生成追踪链接。 - 包括Gmail、Outlook、Apple Mail在内的绝大多数主流邮件客户端,默认会拦截邮件内的POST表单提交行为,直接在邮件内嵌表单本身兼容性极差,即使修复追踪问题也会出现大面积用户无法正常提交的情况。
修复方案
推荐方案(兼容性100%)
直接废弃邮件内的POST表单,改用带参数的GET跳转链接,完全适配MJML追踪逻辑和所有邮件客户端规则,修改后的模板代码如下:
<mj-text> <a href="https://www.carsale.com/login?customerId={{ urlencode($inquiry->customer->customer_id ?? '') }}&authToken={{ urlencode($inquiry->customer->auth_token ?? '') }}">Lets go</a> </mj-text>
参数拼接时记得用urlencode处理,避免特殊字符导致链接解析异常。
兼容方案(必须保留POST提交时使用)
如果业务侧登录接口不支持GET请求,按以下两步调整:
- 修改Laravel-mix-mjml配置,将
https://www.carsale.com加入追踪排除域名列表(配置项通常为excludeTrackDomains),避免表单action被错误替换为mjt.lu追踪链接,保证POST参数可以正常提交。 - 若需要保留链接追踪能力,不要直接使用原表单或原直链,改为指向自有服务的带签名GET链接:用户点击链接跳转到自有服务的中转页后,由中转页校验签名、携带对应参数自动发起POST请求到目标登录接口即可,该方案同时兼容邮件客户端限制、MJML追踪逻辑和POST提交需求。
注意:不要通过修改插件源码的方式强行替换form的action为mjt.lu追踪链接,mjt.lu官方追踪服务仅支持GET跳转,不支持POST请求体转发,强行替换会导致所有表单提交完全失效。
内容的提问来源于stack exchange,提问作者Anton Bergen
相关产品推荐
相关产品推荐

