如何在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
相关产品推荐
相关产品推荐

