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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 08:36:03