使用 ejs + emailjs 时 base64 图像不显示在 Outlook 中
base64 images not displaying in Outlook when using ejs + emailjs
当各种事件发生时,我在 node.js 应用程序中混合使用 ejs and emailjs 来发送电子邮件。我想在发送电子邮件时将 base64 图像(一个小徽标)嵌入到电子邮件中,但 Outlook 和 Gmail(加上 Google 的收件箱)都无法呈现图像。
我正在使用这段代码查找图像的 MIME 类型并将 base64 字符串放在一起:
MyApp.prototype.ImageToBase64 = function(image) {
var mime = require("mime")
file = fs.readFileSync(__dirname + "/images/" + image, { encoding: 'base64'})
return 'data:' + mime.lookup(image) + ';base64,' + file;
}
效果很好,因为我可以将生成的字符串复制并粘贴到我的浏览器中并查看图像。但是当我通过 emailjs 发送电子邮件时,Outlook 将 +
转换为 +
。当我在 Gmail 中 "View Original" 时,base64 被拆分成 'chunks'。每个块都在换行符上,每行以 =
结尾。如果我使用 Gmail 的版本并删除 =
和换行符,然后将其粘贴到我的浏览器中,整个图片加载完美,但它只是拒绝加载其他任何地方,无论用户是否在我的联系人列表中。
这是我用来发送电子邮件的代码:
// Host, username, password and SSL (false) all set above here
server.send({
text: myTemplate,
from: "me@example.com",
to: "someone@example.com",
subject: "Testing",
attachment: [
{data:myTemplate, alternative:true}
]
})
模板看起来像这样(被截断了,因为其他位不重要):
<body>
<p><img src="<%- ImageToBase64("logo.png") %>"></p>
<h1><%= Name %> has been triggered</h1>
<p><%= Name %> has been triggered. It was triggered on <%= TheDate %></p>
有什么提示吗?
编辑:我尝试在 "attachment" 属性 中设置 headers,但没有成功
好吧,尽管 this answer 是 2013 年的,但似乎智慧仍然成立,因为 base64 图像支持在电子邮件客户端中很糟糕。
基本上仍然支持内联图像的唯一邮件客户端要么是较旧的(例如 Office 2007),要么是 Apple / Android 的默认邮件应用程序。
虽然这有点令人失望,但这并不是世界末日,因为电子邮件只会被与我的应用程序处于同一网络的人看到,所以我可以指向托管在 web 部分的图像应用程序。
但对于尝试此操作的任何其他人,请将您的图片托管在图像共享网站(如 Imgur)或您自己的服务器上,并使用常规的 ol' <image>
标签来显示它。
独立电子邮件就这么多,对吧?
Outlook 使用 Word 渲染图片,Word 不支持嵌入 (src="data:image"
) 图片。
您需要将图像作为文件附加,并将 Content-ID MIME header 设置为与 HTML 中图像 (<img src="cid:xyz">)
的 cid 属性匹配的值body.
当各种事件发生时,我在 node.js 应用程序中混合使用 ejs and emailjs 来发送电子邮件。我想在发送电子邮件时将 base64 图像(一个小徽标)嵌入到电子邮件中,但 Outlook 和 Gmail(加上 Google 的收件箱)都无法呈现图像。
我正在使用这段代码查找图像的 MIME 类型并将 base64 字符串放在一起:
MyApp.prototype.ImageToBase64 = function(image) {
var mime = require("mime")
file = fs.readFileSync(__dirname + "/images/" + image, { encoding: 'base64'})
return 'data:' + mime.lookup(image) + ';base64,' + file;
}
效果很好,因为我可以将生成的字符串复制并粘贴到我的浏览器中并查看图像。但是当我通过 emailjs 发送电子邮件时,Outlook 将 +
转换为 +
。当我在 Gmail 中 "View Original" 时,base64 被拆分成 'chunks'。每个块都在换行符上,每行以 =
结尾。如果我使用 Gmail 的版本并删除 =
和换行符,然后将其粘贴到我的浏览器中,整个图片加载完美,但它只是拒绝加载其他任何地方,无论用户是否在我的联系人列表中。
这是我用来发送电子邮件的代码:
// Host, username, password and SSL (false) all set above here
server.send({
text: myTemplate,
from: "me@example.com",
to: "someone@example.com",
subject: "Testing",
attachment: [
{data:myTemplate, alternative:true}
]
})
模板看起来像这样(被截断了,因为其他位不重要):
<body>
<p><img src="<%- ImageToBase64("logo.png") %>"></p>
<h1><%= Name %> has been triggered</h1>
<p><%= Name %> has been triggered. It was triggered on <%= TheDate %></p>
有什么提示吗?
编辑:我尝试在 "attachment" 属性 中设置 headers,但没有成功
好吧,尽管 this answer 是 2013 年的,但似乎智慧仍然成立,因为 base64 图像支持在电子邮件客户端中很糟糕。
基本上仍然支持内联图像的唯一邮件客户端要么是较旧的(例如 Office 2007),要么是 Apple / Android 的默认邮件应用程序。
虽然这有点令人失望,但这并不是世界末日,因为电子邮件只会被与我的应用程序处于同一网络的人看到,所以我可以指向托管在 web 部分的图像应用程序。
但对于尝试此操作的任何其他人,请将您的图片托管在图像共享网站(如 Imgur)或您自己的服务器上,并使用常规的 ol' <image>
标签来显示它。
独立电子邮件就这么多,对吧?
Outlook 使用 Word 渲染图片,Word 不支持嵌入 (src="data:image"
) 图片。
您需要将图像作为文件附加,并将 Content-ID MIME header 设置为与 HTML 中图像 (<img src="cid:xyz">)
的 cid 属性匹配的值body.