第二十章 邮件系统
篇别:第三篇 数据库与数据管理
本章学习目标
- 能集成
mail.thread与mail.activity.mixin并理解各自职责。 - 会使用
message_post、子类型(subtype) 控制消息可见范围。 - 能配置 外发邮件服务器 与 邮件模板(动态字段、多语言)。
- 理解 关注者、子类型、通知偏好 对「邮件噪声」的影响。
导读:Discuss 是协作中枢
Odoo 将 消息、关注者、活动、邮件网关 统一在 mail 模块生态中。业务单据继承 mail.thread 即可获得 chatter;需要 待办截止日期 再混 mail.activity.mixin。
20.1 mail.thread
20.1.1 知识要点
_inherit = 'mail.thread':message_ids、message_follower_ids等;tracking=True字段变更产生跟踪消息。message_post:body(HTML/纯文本依参数)、subtype_xmlid(mail.mt_note内部备注 vsmail.mt_comment讨论等)、partner_ids(@提及)。- 附件:
attachment_ids;注意 病毒扫描与大小限制。
20.1.2 案例
self.message_post(
body=_('借阅已确认。'),
subtype_xmlid='mail.mt_note',
)
带跟踪字段
name = fields.Char(tracking=True)
20.1.3 截图占位

20.1.4 本节练习
- 实操:
state改为done时message_post一条说明(可在write重写或状态方法中)。 - 简答:
subtype_xmlid不传时默认行为? - 判断:
message_post会绕过 ACL 向任意 partner 泄露 body。( )
参考答案提示:3. 依实现与关注者范围,需谨慎。
20.2 mail.activity.mixin
20.2.1 知识要点
- 活动类型:待办、会议、电话等(
mail.activity.type)。 activity_schedule:类型 xml id、user_id、date_deadline、note。- 完成:
activity_done/ 界面勾选完成;可与 状态机 同步。
20.2.2 案例
self.activity_schedule(
'mail.mail_activity_data_todo',
user_id=self.env.user.id,
date_deadline=fields.Date.context_today(self) + timedelta(days=3),
note=_('请处理超期借阅'),
)
20.2.3 截图占位

20.2.4 本节练习
- 简答:activity 与 普通 message 在日历与提醒上的差异?
- 实操:创建 自定义活动类型「催还书」并用于借阅单。
20.3 消息通知
20.3.1 知识要点
- 渠道:站内 Discuss、邮件、移动端推送(视配置)。
- 邮件网关:入站(别名解析创建消息)、出站(SMTP)。
- 失败重试:队列与 日志(
mail.mail);生产需监控 退信率。
20.3.3 截图占位

20.3.4 本节练习
- 实操:测试库配置 SMTP,发送 测试邮件(勿用生产密码入库)。
- 简答:入站别名 与 安全(伪造发件人)注意点?
20.4 邮件模板
20.4.1 知识要点
mail.template:主题、正文(QWeb 或 Jinja 类语法依版本)、模型、自动发送条件。
占位符常见:object 当前记录、user、ctx。
20.4.2 案例
主题:借阅到期提醒:{{ object.name }}
正文:您好 {{ object.partner_id.name }},图书《{{ object.book_id.name }}》将于 {{ object.due_date }} 到期。
实际语法以模板编辑器引擎为准。
20.4.3 截图占位

20.4.4 本节练习
- 实操:Cron 每日查找 明天到期 借阅,
template.send_mail或等效 API 发信。 - 简答:模板 多语言 如何实现?
参考答案提示:2. 模板翻译或 lang in context。
20.5 关注者机制(新增)
20.5.1 知识要点
message_subscribe/message_unsubscribe:partner 列表。- 子类型:关注者可订阅 讨论 / 备注 / 特定业务事件;控制 收件箱噪声。
- 自动关注:创建人、销售员等规则可在代码或 自动化 中配置。
20.5.3 截图占位

20.5.4 本节练习
- 简答:何时用
mail.mt_note而非mail.mt_comment? - 实操:关闭某单据对 「所有讨论」 的邮件通知,仅保留 @提及(若界面支持)。
20.6 合规与运维简表
| 主题 | 建议 |
|---|---|
| PII | 邮件正文最小化;日志脱敏 |
| 保留期 | 与法务约定 mail.message 归档策略 |
| 退订 | 营销邮件合规 unsubscribe(若适用) |
20.6.1 本节练习
- 简答:@提及 的通知路径(站内 → 邮件)用文字描述。
本章综合练习
- 设计:借阅单 提交 → 经理审批 → 完成 的消息与活动时间线(谁收到什么)。
- 合规:邮件日志 保留 7 年 时数据库增长应对?
- 故障:外发全失败——5 步排查(SMTP、端口、TLS、防火墙、Odoo 日志)。
- 拓展:阅读 Discuss 与 bus 长连接关系(一句话)。
本章对应白皮书目录:第二十章 邮件系统。