在电子邮件正文中嵌入图像 nodemailer nodejs

Embed image in email body nodemailer nodejs

提问人:Thabo 提问时间:1/26/2018 最后编辑:Thabo 更新时间:9/20/2021 访问量:53686

问:

我正在遵循 nodemailer 社区站点中使用的方法,但我似乎无法让它工作,因为我收到错误

   Failed to send email { Error: ENOENT: no such file or directory, open 
'./rello-logo-full-svg.svg'
 errno: -2,
  code: 'ESTREAM',
  syscall: 'open',
  path: './rello-logo-full-svg.svg',
  command: 'API' }

nodemailer 选项如下

    let mailOptions = {
        from: '<from_email>', 
        to: to_email_address.toString(),
        subject: 'Subject',
        text: 'Hello world', // plain text body
        attachments: [{
          filename: 'rello-logo-full-svg.svg',
          path: './rello-logo-full-svg.svg',
          cid: 'unique@cid'
      }],
        html: emailBody
    };

emailBody变量中,我有一个模板字符串,其中包含图像标记行,如下所示

<img style="width:250px;" cid:unique@cid>

我是否需要为express设置静态资产还是什么,图像文件与具有上述代码的文件位于同一文件夹中,任何帮助将不胜感激

JavaScript .js Express 节点邮件

评论

1赞 Fals 1/26/2018
错误很清楚,找不到图像的路径。查看图像的完整路径。
0赞 Thabo 1/26/2018
@Fals 当然,但是引用图像文件的文件在同一个目录中,我是否缺少其他东西,例如使用 express 或其他方式设置它?

答:

14赞 Thabo 1/26/2018 #1

所以我通过使用 ...

 path: __dirname + '/rello-logo-full-svg.svg',

....

但有趣的是,这不是我想要实现的,因为我希望图像出现在电子邮件正文中,但希望这对其他人有所帮助。

嘿,我刚刚将文件名从 .svg 更改为 .png,我犯的另一个错误是模板中的图像,我已将其更改为

 <img style="width:250px;" src="cid:unique@cid">
45赞 Tori Henri 4/20/2018 #2

如果其他人遇到这种情况,请在此处回复!以上内容确实很有帮助,但这是我实际查看电子邮件中嵌入的图像的代码__dirname

我的img标签:

<img src="cid:logo">

我的附件片段:

attachments: [{
     filename: 'Logo.png',
     path: __dirname +'/folder/Logo.png',
     cid: 'logo' //my mistake was putting "cid:logo@cid" here! 
}]

评论

1赞 DefenestrationDay 3/15/2022
关键是路径必须包含文件名!文档没有显示这一点。
0赞 Daniel 6/5/2023
路径也可以是一个数据 URL,这很酷
12赞 dǝɥɔS ʇoıןןƎ 5/7/2019 #3

我在 https://community.nodemailer.com/using-embedded-images/ 找到了一个很好的例子。这是帖子

使用嵌入图像

附件可用作 HTML 正文。要使用此功能,您需要将 附件 – CID(文件的唯一标识符),它是 对附件文件的引用。必须将相同的 cid 值用作 HTML 中的图像 URL(使用 cid: 作为 URL 协议,请参阅示例 下文)。

铌!CID 值应尽可能唯一!

var mailOptions = {
    ...
    html: 'Embedded image: <img src="cid:[email protected]"/>',
    attachments: [{
        filename: 'image.png',
        path: '/path/to/file',
        cid: 'uni[email protected]' //same cid value as in the html img src
    }]
}

评论

1赞 Chris 6/27/2019
在展望中,它也作为依恋。以便任何人都可以下载图像。有什么办法可以阻止它
1赞 dǝɥɔS ʇoıןןƎ 6/27/2019
可以肯定的是,这与Outlook客户端有关,而不是实际的电子邮件。检查这些: msoutlook.info/question/72 msoutlook.info/question/500
1赞 dǝɥɔS ʇoıןןƎ 6/27/2019
其实,我之前不明白你的意思。是的,所以如果你想嵌入它,你可以将图像转换为 base64 并包含该 stackoverflow.com/questions/9110091/......虽然我认为一些电子邮件客户端仍然会自动提取任何图像。从发件人的角度来看,您对此无能为力
0赞 Milan jotva 10/17/2023
但是,为什么依恋在依恋中表现出来,而不是只在身体上表现出来呢?如何将其从电子邮件正文的附件部分隐藏起来,只显示在邮件部分?
3赞 Palash Toshniwal 9/20/2021 #4

NodeMailer 的 HTML 图像附件

对于 Nodemailer 中的 HTML 模板图像,有几件事 要考虑或密切关注的是:

attachments: [{
 filename: 'img.png',
 path: __dirname +'/folder/img.png', // path contains the filename, do not just give path of folder where images are reciding.
 cid: 'img' // give any unique name to the image and make sure, you do not repeat the same string in given attachment array of object.
}]

<img src="cid:img" />

在图像标记中,src 应包含相关图像的名称,该名称 我们输入了附件对象的 CID 属性名称。

重要

如果您看到,很少有图像被视为电子邮件线程的附件,并且您不希望这些图像作为“附件”发送,

答:然后确保,您在 attachment: [{ ...}] object 数组中提供详细信息的图像都用于 HTML 的 img src。

例如:

   attachment: [{
         filename: 'logo1.png',
         path: '/path/logo1.png',
         cid: 'logo1'
     },
     {
         filename: 'logo2.png',
         path: '/path/logo2.png',
         cid: 'logo2'
    }]



<img src="cid:logo2" />

在这种情况下,logo2 将绑定到 HTML 模板,logo1.png 将附加到电子邮件的线程。