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})
额外检查项
- 确认邮件模板的外部ID
crm_extended.create_crm_lead_mail_template拼写正确 - 查看Odoo邮件队列(设置 → 技术 → 邮件 → 邮件队列),检查是否有卡住的邮件
- 确认模板里的收件人字段设置正确(比如关联了客户的邮箱地址)
内容的提问来源于stack exchange,提问作者user12923398
相关产品推荐
相关产品推荐

