Nodemailer发送base64数据URI作为附件。怎么样?

Иль*_*нин 4 node.js nodemailer

基本上,我有一个使用Canvas创建的图像,它使用base64编码的数据URI。然后将此数据URI附加到电子邮件。

...,
 attachments:[{
 fileName: "cat.jpg",
 contents: new Buffer(cat, 'base64')
}],
Run Code Online (Sandbox Code Playgroud)

电子邮件已收到,但附件不可见。$ file cat.jpg在linux中运行会返回:

cat.jpg: ASCII text, with very long lines, with no line terminators
Run Code Online (Sandbox Code Playgroud)

为什么使用ASCII?我已经提到过base64。我该如何解决这个问题?谢谢。

小智 11

不需要缓冲区。您可以将字符串从 base64 编码前缀后面开始放入其中:

var cat = "...base64 encoded image...";
var mailOptions = {
  ...
  attachments: [
    {   // encoded string as an attachment
      filename: 'cat.jpg',
      content: cat.split("base64,")[1],
      encoding: 'base64'
    }
  ]
};
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到更多详细信息:https : //github.com/nodemailer/nodemailer#attachments


Rik*_*kus 5

该变量cat可能包含“ data:image / jpeg; base64”部分。您不应该将该位传递给Buffer构造函数。

看来,如果您传递无效数据,new Buffer()就不会抱怨:

var pixel = "data:image/gif;base64,"
    + "R0lGODlhAQABAIABAP///wAAACH5"
    + "BAEKAAEALAAAAAABAAEAAAICTAEAOw==";
var buffer = new Buffer(pixel, "base64"); // does not throw an error.
Run Code Online (Sandbox Code Playgroud)

您甚至可以获取有效的缓冲区。缓冲区是损坏的图像(或者,它不是以图像头开始的)。

您必须自己剥离数据URI的第一部分:

var buffer = new Buffer(pixel.split("base64,")[1], "base64");
Run Code Online (Sandbox Code Playgroud)