先说结论
在 Odoo 里,邮件模板问题很多时候不是“文案写错了”这么简单。
更常见的链路其实是:
- 用哪一个
mail.template - 模板渲染时当前对象是谁
- 模板变量在什么上下文下展开
- 最后通过什么入口发送出去
所以模板异常很多时候不是模板单点问题,而是整条渲染发送链有一层没对齐。
为什么邮件模板问题常让人觉得玄学
因为你看到的表面通常是:
- 占位变量怎么没出来
- 收件人怎么不对
- 文案怎么带了旧值
- 模板在这里能发,在那里又怪怪的
这会让人误以为:
- Odoo 模板系统不稳定
但更常见的现实是:
模板本身只是壳,真正决定输出内容的是“它拿到了谁、拿到了什么上下文、从哪条入口发出去”。
mail.template 真正适合做什么
它更像:
一份可复用的消息结构定义。
里面通常包括:
- 主题
- 正文
- 目标对象相关变量
- 有时还有收件人或发送配置线索
所以它不是纯静态文案,而是“带变量的消息蓝图”。
为什么“当前对象是谁”这么关键
因为模板变量并不是凭空展开的。
它通常是围绕某个业务对象来渲染:
- 销售单
- 发票
- 采购单
- 联系人
如果当前对象上下文不对,模板里那些看起来理所当然的变量就会:
- 取不到值
- 取到空值
- 或取到你没预期的对象数据
所以模板问题很多时候不是写错变量,而是“喂给模板的对象不对”。
为什么发送入口也会影响结果
因为模板不是凭空自己发出去的。
不同发送入口可能会带来:
- 不同的上下文
- 不同的默认收件人
- 不同的调用时机
- 不同的批量发送行为
这也是为什么“同一个模板从 A 入口正常,从 B 入口怪异”这种情况很常见。
问题不一定在模板,而可能在入口给它的环境不同。
为什么模板渲染问题不能只看 HTML
因为邮件模板除了正文结构,还涉及:
- 变量展开
- 语言上下文
- 收件人对象
- 消息发送时机
所以很多问题不是“HTML 排版坏了”,而是上游变量和调用方式就已经偏了。
实战里最容易踩的 5 个坑
1. 只改模板文案,不检查当前对象上下文
会一直以为变量系统有问题。
2. 以为模板本身决定一切
忽略发送入口差异。
3. 用错对象模型去渲染模板
最容易出现空值和错值。
4. 只测一个发送入口
上线后换入口就暴露问题。
5. 把模板当静态邮件正文理解
会低估它对上下文的依赖。
一句话记忆法
把它记成一句话:
mail.template是带变量的消息蓝图,真正输出什么内容,取决于它拿到的业务对象、上下文环境和具体发送入口。
理解这一句,Odoo 邮件模板问题就不会再那么像玄学。
DISCUSSION
评论区