You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Odoo11中实现阶段变更后自定义延迟发送邮件的问题咨询

实现单邮件自定义延迟发送的解决方案

问题根因

你之前的方案只是把邮件放入待发队列,Odoo原生邮件队列管理器默认会发送所有符合待发状态的邮件,不会按单邮件的生成时间单独计算延迟。

核心实现逻辑

Odoo的mail.mail模型原生支持scheduled_date(调度发送时间)字段,邮件队列管理器运行时,只会处理状态为outgoing、且scheduled_date为空或小于当前时间的邮件,我们只要给每封生成的邮件单独设置对应的延迟后调度时间即可。

代码实现示例

from datetime import timedelta
from odoo import fields

# 可配置延迟时长,支持从系统参数/业务单据配置中读取,默认10分钟
delay_minutes = int(self.env['ir.config_parameter'].sudo().get_param('custom.bill_stage_delay_minutes', 10))

# 调用模板生成邮件,不强制立即发送,获取生成的邮件ID
generated_mail_id = self.env['mail.template'].browse(template.id).send_mail(self.id, force_send=False)

# 计算当前时间+延迟时长的调度时间,写入邮件记录
if generated_mail_id:
    scheduled_send_time = fields.Datetime.now() + timedelta(minutes=delay_minutes)
    self.env['mail.mail'].browse(generated_mail_id).write({
        'scheduled_date': scheduled_send_time,
        'state': 'outgoing'
    })

配套配置调整

  • 无需大幅修改原有「Mail: Email Queue Manager」的运行间隔,可根据你能接受的最大发送误差调整:比如要误差控制在1分钟内,就将计划动作运行间隔设为1分钟,队列每次运行时只会发送调度时间已到的邮件,不会提前发送。
  • 延迟时长可通过Odoo后台「设置-技术-参数-系统参数」新增对应配置项即可动态调整,无需修改代码。

可选优化

如果业务单据在延迟时段内阶段再次变更,需要取消上一封未发送的邮件,可在业务单据上新增一个关联mail.mail的字段,存储待发送邮件ID,阶段变更时先判断是否存在未发送的关联邮件,将其状态改为cancel后再生成新的延迟邮件,避免重复发送。

内容的提问来源于stack exchange,提问作者Gautam Bothra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 23:24:03