2015-10-15 237 views
0

当各种事件发生时,我使用ejsemailjs的混合发送电子邮件到我的node.js应用程序中。我想在发送邮件时在邮件中嵌入base64图像(小徽标),但Outlook和Gmail(以及Google收件箱)无法呈现图像。当使用ejs + emailjs时,在Outlook中不显示base64图像

我使用这段代码,找到图像的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会将+ s转换为+。当我在Gmail中查看原始内容时,base64被分成'块'。每个块都在换行符上,每行以=结尾。如果我使用Gmail的版本并删除=和换行符,然后将其粘贴到我的浏览器中,则整个图片加载完美,但它拒绝在其他任何地方加载,无论用户是否在我的联系人列表中。

这里是我用来发送电子邮件的代码:

// Host, username, password and SSL (false) all set above here 
server.send({ 
    text: myTemplate, 
    from: "[email protected]", 
    to: "[email protected]", 
    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> 

任何提示?

编辑:我试图在“连接”属性设置标头,但没有运气

回答

1

Outlook使用Word来渲染图像,而Word不支持嵌入式(src="data:image")图像。

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

1

好了,所以即使this answer是从2013年开始,这似乎是智慧依然如此,在BASE64图像支持吸收电子邮件客户端。

基本上,仍然支持内嵌图像的唯一邮件客户端要么是旧的(例如Office 2007),要么是Apple/Android的默认邮件应用程序。

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

但是对于其他人尝试这种方式,请将您的图像置于图像共享网站(如Imgur)上或您自己的服务器上,并使用常规ol标签来显示它。

这么多的自包含电子邮件,对不对?