8

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

...,
 attachments:[{
 filename: "cat.jpg",
 contents: new Buffer(cat, 'base64')
}],

已收到电子邮件,但无法查看附件。$ file cat.jpg在 linux 中运行返回:

cat.jpg: ASCII text, with very long lines, with no line terminators

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

4

4 回答 4

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'
    }
  ]
};

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

于 2016-02-03T13:41:31.880 回答
8

该变量cat可能包括'data:image/jpeg;base64,'部分。你不应该把那一点传递给Buffer.from.

似乎如果您传入无效数据,Buffer.from()则不会抱怨:

var pixel = "data:image/gif;base64,"
    + "R0lGODlhAQABAIABAP///wAAACH5"
    + "BAEKAAEALAAAAAABAAEAAAICTAEAOw==";
var buffer = Buffer.from(pixel, "base64"); // does not throw an error.

你甚至可以取回一个有效的缓冲区。缓冲区是损坏的图像(或者更确切地说,它不是以图像标题开头)。

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

var buffer = Buffer.from(pixel.split("base64,")[1], "base64");

编辑(2021 年 5 月):更改new BufferBuffer.from,因为前者已被弃用。

于 2014-06-11T15:47:56.817 回答
2

您可以只使用path它而无需任何额外的操作:

    let attachments = [
        {
            filename: "image.gif",
            path: "data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="
        }
    ]

这里是相关文档的链接

于 2020-01-14T21:40:16.133 回答
2

您可以简单地使用该包nodemailer-base64-to-s3

安装包:

npm install -s nodemailer-base64-to-s3

使用 nodemailer 配置它:

var base64ToS3 = require('nodemailer-base64-to-s3');
var nodemailer = require('nodemailer');

var transport = nodemailer.createTransport({});
transport.use('compile', base64ToS3(opts));

https://github.com/ladjs/nodemailer-base64-to-s3

于 2017-09-20T10:53:25.487 回答