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

Odoo 12订阅到期前90天自动发邮件功能失效求助

问题排查与修复方案

我帮你梳理下代码里的几个关键问题,这些应该就是你收不到邮件的核心原因:

1. 搜索条件的语法错误

你写的搜索语句里多了不必要的括号,Odoo的ORM搜索不识别这种格式:

exp_90days = self.env['(crm.lead.extended)'].search([('(license_renewal_date)','=',before_90_days)])

正确写法应该去掉多余括号:

exp_90days = self.env['crm.lead.extended'].search([('license_renewal_date', '=', before_90_days)])

2. 日期逻辑完全搞反了

你现在计算的是90天前的日期,找的是已经过期90天的记录,但你要的是到期前90天的提醒!

正确的逻辑应该是:找到「到期日期 = 当前日期 + 90天」的记录,也就是距离现在还有90天就要到期的客户:

from datetime import datetime, timedelta

# 计算90天后的日期,这才是到期前90天的提醒节点
remind_date = datetime.now().date() + timedelta(days=90)
exp_90days = self.env['crm.lead.extended'].search([('license_renewal_date', '=', remind_date)])

3. 发送邮件的对象错误

你现在用template.send_mail(self.id, ...),这里的self是调用函数的当前记录,但你应该给所有符合条件的记录发送邮件,所以需要遍历搜索结果:

template = self.env.ref('crm_extended.create_crm_lead_mail_template')
for record in exp_90days:
    template.send_mail(record.id, force_send=True)

4. 函数的触发方式缺失

你写的exp_date1函数如果没有定时触发,它不会自动运行!要实现每天自动检查,得在Odoo里创建定时任务(Ir.Cron):

  • 进入「设置 → 技术 → 自动化 → 定时动作」
  • 新建定时任务:
    • 模型选择crm.lead.extended
    • 方法选择exp_date1
    • 执行频率设为每天一次(比如凌晨2点)

修复后的完整代码示例

from datetime import datetime, timedelta
from odoo import fields, models

class CrmLeadExtended(models.Model):
    _name = 'crm.lead.extended'  # 或继承已有模型,根据你的实际情况调整
    _description = 'Extended CRM Lead'

    license_renewal_date = fields.Date("Renewal Date", track_visibility='onchange')
    is_reminder_sent = fields.Boolean("Reminder Sent", default=False)  # 新增字段避免重复发送

    def exp_date1(self):
        # 计算提醒节点:90天后的日期
        remind_date = datetime.now().date() + timedelta(days=90)
        # 搜索符合条件且未发送过提醒的记录
        expiring_records = self.env['crm.lead.extended'].search([
            ('license_renewal_date', '=', remind_date),
            ('is_reminder_sent', '=', False)
        ])
        if not expiring_records:
            return
        
        template = self.env.ref('crm_extended.create_crm_lead_mail_template')
        for record in expiring_records:
            template.send_mail(record.id, force_send=True)
            # 标记已发送提醒,避免重复触发
            record.write({'is_reminder_sent': True})

额外检查项

  • 确认邮件模板的外部IDcrm_extended.create_crm_lead_mail_template拼写正确
  • 查看Odoo邮件队列(设置 → 技术 → 邮件 → 邮件队列),检查是否有卡住的邮件
  • 确认模板里的收件人字段设置正确(比如关联了客户的邮箱地址)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 22:03:17