使用 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.