第二十章 邮件系统

篇别:第三篇 数据库与数据管理

本章学习目标

  • 能集成 mail.threadmail.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_idsmessage_follower_ids 等;tracking=True 字段变更产生跟踪消息。
  • message_postbody(HTML/纯文本依参数)、subtype_xmlidmail.mt_note 内部备注 vs mail.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 Chatter 消息流

20.1.4 本节练习

  1. 实操state 改为 donemessage_post 一条说明(可在 write 重写或状态方法中)。
  2. 简答subtype_xmlid 不传时默认行为?
  3. 判断message_post 会绕过 ACL 向任意 partner 泄露 body。( )

参考答案提示:3. 依实现与关注者范围,需谨慎。


20.2 mail.activity.mixin

20.2.1 知识要点

  • 活动类型:待办、会议、电话等(mail.activity.type)。
  • activity_schedule类型 xml iduser_iddate_deadlinenote
  • 完成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 计划活动

20.2.4 本节练习

  1. 简答:activity 与 普通 message 在日历与提醒上的差异?
  2. 实操:创建 自定义活动类型「催还书」并用于借阅单。

20.3 消息通知

20.3.1 知识要点

  • 渠道:站内 Discuss邮件、移动端推送(视配置)。
  • 邮件网关入站(别名解析创建消息)、出站(SMTP)。
  • 失败重试:队列与 日志mail.mail);生产需监控 退信率

20.3.3 截图占位

图 20-3 外发邮件服务器与 Discuss

20.3.4 本节练习

  1. 实操:测试库配置 SMTP,发送 测试邮件(勿用生产密码入库)。
  2. 简答入站别名安全(伪造发件人)注意点?

20.4 邮件模板

20.4.1 知识要点

mail.template主题、正文(QWeb 或 Jinja 类语法依版本)、模型自动发送条件

占位符常见:object 当前记录、userctx

20.4.2 案例

主题:借阅到期提醒:{{ object.name }}
正文:您好 {{ object.partner_id.name }},图书《{{ object.book_id.name }}》将于 {{ object.due_date }} 到期。

实际语法以模板编辑器引擎为准。

20.4.3 截图占位

图 20-4 mail.template

20.4.4 本节练习

  1. 实操Cron 每日查找 明天到期 借阅,template.send_mail 或等效 API 发信。
  2. 简答:模板 多语言 如何实现?

参考答案提示:2. 模板翻译或 lang in context。


20.5 关注者机制(新增)

20.5.1 知识要点

  • message_subscribe / message_unsubscribepartner 列表。
  • 子类型:关注者可订阅 讨论 / 备注 / 特定业务事件;控制 收件箱噪声
  • 自动关注:创建人、销售员等规则可在代码或 自动化 中配置。

20.5.3 截图占位

图 20-5 关注者与子类型

20.5.4 本节练习

  1. 简答:何时用 mail.mt_note 而非 mail.mt_comment
  2. 实操:关闭某单据对 「所有讨论」 的邮件通知,仅保留 @提及(若界面支持)。

20.6 合规与运维简表

主题 建议
PII 邮件正文最小化;日志脱敏
保留期 与法务约定 mail.message 归档策略
退订 营销邮件合规 unsubscribe(若适用)

20.6.1 本节练习

  1. 简答@提及 的通知路径(站内 → 邮件)用文字描述。

本章综合练习

  1. 设计:借阅单 提交 → 经理审批 → 完成 的消息与活动时间线(谁收到什么)。
  2. 合规:邮件日志 保留 7 年 时数据库增长应对?
  3. 故障:外发全失败——5 步排查(SMTP、端口、TLS、防火墙、Odoo 日志)。
  4. 拓展:阅读 Discussbus 长连接关系(一句话)。

本章对应白皮书目录:第二十章 邮件系统。