【发布时间】:2012-11-10 12:30:38
【问题描述】:
我必须在 OpenERP 中使用电子邮件模板发送图像,但我必须插入它,就像我们在 gmail、yahoo 和 stackoverflow.com 中都有插入图像的功能一样。
我必须发送这样的图像是因为我希望它应该在打开邮件的同时显示,以及文本。
如果我使用附件发送它,它会包含在附件中,我们可以在下载图像后立即看到。我不需要这个下载选项,我需要的是打开图像。
提前致谢!
【问题讨论】:
标签: openerp
我必须在 OpenERP 中使用电子邮件模板发送图像,但我必须插入它,就像我们在 gmail、yahoo 和 stackoverflow.com 中都有插入图像的功能一样。
我必须发送这样的图像是因为我希望它应该在打开邮件的同时显示,以及文本。
如果我使用附件发送它,它会包含在附件中,我们可以在下载图像后立即看到。我不需要这个下载选项,我需要的是打开图像。
提前致谢!
【问题讨论】:
标签: openerp
以下是我使用 Odoo 11 在我的销售订单电子邮件模板中添加公司徽标的方法:
<p>
% set company = object.company_id or ctx.get('company')
% if company.logo:
% set field_value = '%s' % company.logo
% set company_logo_base64 = 'data:image/*;base64,%s' % field_value[2:-1]
% endif
<img t-if="company_logo_base64" src="${company_logo_base64}">
</p>
【讨论】:
在电子邮件中嵌入图像的常用方法有 3 种(按复杂度递增的顺序):使用公共 URL、使用数据 URI 将图像数据内联到 src 属性中,以及使用电子邮件附加的图像。
在所有 3 种情况下,您都可以使用常规 HTML 技术将它们包含在 OpenERP 电子邮件模板的 HTML/Rich-Text 正文中:例如使用 <img src="..."/> 标签或 CSS background-image 属性。
只有前两种技术可以在 OpenERP 的电子邮件模板中开箱即用。
图片 URL 可以只是您网站上的公共 URL 或 Internet 上的任何图片托管服务:<img src="http://www.example.com/myimage.png">。这与在 stackoverflow 上嵌入图像时发生的情况非常相似,因为图像首先会自动上传到 imgur.com,而img src 属性指的是 imgur.com 上上传图像的 URL。
这可行,但现在大多数电子邮件客户端(thunderbird、gmail、outlook 等)都会阻止远程图像,因为它们通常被滥用来检测给定电子邮件已被收件人打开的事实(如果图像已下载) ,表示邮件已打开)。通常,收件人必须单击横幅或警告才能显示这些远程图像。
这是与 OpenERP 的电子邮件模板开箱即用的唯一技术。
img 标记的src 属性可以使用Data URI (RFC 2397) 方案来内联包含图像二进制源。图片标签如下所示:
<img src="data:mime-type;encoding,<encoded_image_data>"/>
对于 PNG 图像,这可能看起来像这样
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA..."/>
您可以将此技术用于 OpenERP 电子邮件模板,并且它没有被电子邮件客户端阻止的缺点。但是,您需要手动将图像转换为 base64[A]。这也将大大增加您的模板和外发电子邮件的大小,并且有一些限制(例如,如果您想要最大的兼容性,最大 32KB)。
[A]:如果您想要一种简单的转换方式,请使用 Google“online base64 file encoder”
RFC 2111 指定消息正文部分使用cid: URL 引用其他正文部分的方式。例如,电子邮件中的img src 属性可以引用其中一个附件。从技术上讲,img 标签可能如下所示:
<img src="cid:some_unique_content_id/>
其中some_unique_content_id 是包含图像的消息部分的内容ID。这是最终(原始)电子邮件中的样子:
------=_NextPart_WHATEVER_ID
Content-Type: image/jpeg;
name="image.jpg"
Content-Transfer-Encoding: base64
Content-ID: <some_unique_content_id>
Content-Disposition: inline;
filename="image.jpg"
/9j/4AAQ...continuation_of_the_base64_encoded_image
此技术也没有被电子邮件客户端阻止的缺点,但实施起来更复杂,因为您需要为每个附件专门分配一个Content-ID,并且通过网络发送的最终电子邮件是更大,因为它必须包含实际图像。
OpenERP 中目前不提供此功能,但实施起来不会很困难。一种简单的方法是在最终邮件为crafted by the email layer 时自动为所有附件(例如attachment_1、attachment_2)分配连续的Content-ID 标识符,并且可能在电子邮件模板Value Builder 助手中添加一个选项以生成@附件的基于 987654347@ 的 URL。
【讨论】:
CRM Lead 上创建一个测试模板并使用“预览”按钮对其进行预览(选择要呈现的示例线索)。然后继续 Lead 记录,并在 Communication&History 选项卡中使用“Send New Email”按钮打开合成向导。将有一个使用模板的选项:只需选择您创建的测试模板并向自己发送一封测试邮件。你是这个意思吗?
这可能有用embedding image in html email
虽然我不认为这是一个与 openerp 相关的问题...
【讨论】: