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

如何在Odoo 16中禁用Base64图片转URL的转换功能?

Odoo 16 禁用邮件模板Base64图片转内部URL的解决方法

问题原因

Odoo邮件发送流程中,默认会自动解析HTML内容里的data:image格式Base64图片,将其上传为系统附件,并替换成内部可访问的/web/image链接。对于私有网络部署的Odoo,外部收件人无法访问这类内部URL,导致图片无法显示。

解决方案

通过重写Odoo邮件渲染逻辑中的图片转换方法,跳过对Base64图片的处理,保留原始的data:image格式。

步骤1:继承并修改邮件渲染Mixin

在自定义模块的Python文件中,继承mail.render.mixin并改写_replace_local_images方法,临时替换Base64图片为占位符,处理完其他本地图片后再恢复原始内容:

from odoo import models
import re

class MailRenderMixin(models.AbstractModel):
    _inherit = 'mail.render.mixin'

    def _replace_local_images(self, html, res_ids):
        # 先将所有data:image格式的图片替换为临时占位符
        data_image_matches = []
        def placeholder_replacer(match):
            data_image_matches.append(match.group(0))
            return f'src="DATA_IMG_PLACEHOLDER_{len(data_image_matches)-1}"'
        
        html_with_placeholders = re.sub(r'src="data:image[^"]+"', placeholder_replacer, html)
        
        # 调用原方法处理非Base64的本地图片
        processed_html = super()._replace_local_images(html_with_placeholders, res_ids)
        
        # 将占位符恢复为原始Base64图片
        for idx, data_img in enumerate(data_image_matches):
            processed_html = processed_html.replace(f'src="DATA_IMG_PLACEHOLDER_{idx}"', data_img)
        
        return processed_html

步骤2:可选优化 - 按上下文控制转换

如果需要仅针对特定邮件模板禁用转换,可以添加上下文判断,让转换逻辑可开关:

from odoo import models
import re

class MailRenderMixin(models.AbstractModel):
    _inherit = 'mail.render.mixin'

    def _replace_local_images(self, html, res_ids):
        # 若上下文携带skip_image_conversion标志,直接返回原HTML
        if self.env.context.get('skip_image_conversion'):
            return html
        
        # 否则执行正常的占位符替换逻辑
        data_image_matches = []
        def placeholder_replacer(match):
            data_image_matches.append(match.group(0))
            return f'src="DATA_IMG_PLACEHOLDER_{len(data_image_matches)-1}"'
        
        html_with_placeholders = re.sub(r'src="data:image[^"]+"', placeholder_replacer, html)
        processed_html = super()._replace_local_images(html_with_placeholders, res_ids)
        
        for idx, data_img in enumerate(data_image_matches):
            processed_html = processed_html.replace(f'src="DATA_IMG_PLACEHOLDER_{idx}"', data_img)
        
        return processed_html

使用时,在发送邮件时传入上下文:

# 假设template是你的邮件模板对象,record是要发送的记录
template.with_context(skip_image_conversion=True).send_mail(record.id, force_send=True)

额外提示

  • 确保自定义模块依赖mail模块,在__manifest__.py中添加'depends': ['mail']。
  • 若模板中使用t-out输出HTML,可改为t-raw避免模板渲染时的转义(但核心解决仍需依赖上述Python代码修改):
    <t t-raw="object.logo_html"/>
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 06:05:39