使用ejs + emailjs时,base64图像无法在Outlook中显示

时间:2015-10-15 05:24:31

标签: node.js email outlook ejs

我使用ejsemailjs混合在各种事件发生时在我的node.js应用中发送电子邮件。我希望在发送电子邮件时将base64图片(小徽标)嵌入到电子邮件中,但Outlook和Gmail(以及Google的Inbox)都无法呈现图片。

我使用这段代码来查找图像的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中,base64被拆分为' chunk'。每个块都在换行符上,每行以=结束。如果我使用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>

任何提示?

编辑:我尝试在&#34;附件中设置标题&#34;财产,但没有运气

2 个答案:

答案 0 :(得分:2)

Outlook使用Word呈现图像,而Word不支持嵌入的(src="data:image")图像。

您需要将图像作为文件附加,并将Content-ID MIME标头设置为与HTML正文中图像(<img src="cid:xyz">)上的cid属性匹配的值。

答案 1 :(得分:1)

好吧,即使this answer来自2013年,似乎智慧仍然适用,因为base64图片支持在电子邮件客户端中很糟糕。

基本上,唯一仍然支持内联图片的邮件客户端可能是旧版(例如Office 2007)或Apple / Android的默认邮件应用程序。

虽然这有点令人失望,但它不是世界末日,因为电子邮件只会被与我的应用在同一网络上的人看到,所以我可以指向托管的图片在应用程序的Web部分。

但对于其他尝试此操作的人,请将您的图片托管在像Imgur这样的图像共享网站上或您自己的服务器上,然后使用常规版本。 <image>标记以显示它。

对于自包含的电子邮件来说,对吧?