如何将Odoo接收的邮件附件中XML数据同步写入对应业务记录

Odoo邮件附件XML数据提取与业务同步实现方案
前置准备
- 确保Odoo邮件服务已经完成配置,对应业务场景的收件别名绑定到需要同步的业务模型(如采购单、销售单模型),允许接收带附件的邮件。
核心实现步骤
1. 自定义邮件接收钩子
Odoo所有关联消息线程的业务模型都继承自mail.thread,我们可以通过重写模型的邮件接收方法触发XML解析逻辑:
- 如果是新邮件生成新业务记录的场景,重写
message_new方法 - 如果是已有业务记录的邮件回复带附件同步的场景,额外重写
message_update方法
示例代码如下(以采购单purchase.order模型为例):
from lxml import etree from odoo import models, api import base64 class PurchaseOrder(models.Model): _inherit = 'purchase.order' @api.model def message_new(self, msg_dict, custom_values=None): # 调用父方法完成默认的记录创建逻辑 order = super().message_new(msg_dict, custom_values=custom_values) # 执行XML附件解析逻辑 self._parse_xml_attachment(msg_dict, order) return order def message_update(self, msg_dict, update_vals=None): # 调用父方法完成默认的消息更新逻辑 res = super().message_update(msg_dict, update_vals=update_vals) # 执行XML附件解析逻辑 self._parse_xml_attachment(msg_dict, self) return res def _parse_xml_attachment(self, msg_dict, target_order): """通用XML附件解析与更新方法""" for attachment in msg_dict.get('attachments', []): filename, file_content = attachment # 过滤非XML后缀附件 if not filename.lower().endswith('.xml'): continue try: # 解码base64格式的附件内容 xml_raw = base64.b64decode(file_content) # 解析XML结构 xml_root = etree.fromstring(xml_raw) # 按自定义XML结构提取业务字段,以下为示例 order_sn = xml_root.findtext('./header/order_sn') total_amount = float(xml_root.findtext('./header/total_amount') or 0) vendor_code = xml_root.findtext('./header/vendor_code') # 匹配业务规则更新记录 if target_order.name == order_sn and target_order.partner_id.ref == vendor_code: target_order.write({ 'amount_total': total_amount, # 其他需要同步的字段 'xml_sync_status': 'success' }) except Exception as e: # 异常处理:记录日志、推送通知 target_order.message_post(body=f"XML附件同步失败:{str(e)}") target_order.write({'xml_sync_status': 'fail'})
2. 补充校验与规则配置
- 可提前配置XML格式校验规则,过滤格式异常、必填字段缺失的文件,避免脏数据写入系统
- 业务匹配规则可根据需求调整,例如优先用XML内的唯一标识匹配系统已有记录,匹配不到时可选择新建记录或者忽略
3. 日志与回溯配置
- 新增自定义字段
xml_sync_status标注同步状态,可选值:未同步/同步成功/同步失败 - 所有同步操作都要留操作日志,记录XML文件名、解析内容、更新字段、操作人/时间,方便后续排查问题
注意:Odoo默认已内置XML解析所需的
lxml依赖,无需额外安装第三方库。
内容的提问来源于stack exchange,提问作者Kai Ning
相关产品推荐
相关产品推荐

