Nodemailer send base64 data URI as attachment. How?

半腔热情 提交于 2020-05-27 00:22:12

问题


Basically I have an image created using Canvas and it's in base64 encoded data URI. This data URI is then attached to email.

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

The email is received but the attachment is not viewable. Running $ file cat.jpg in linux returns:

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

Why is this ASCII? I had already mentioned base64. How may I fix this problem? Thank you.


回答1:


The variable cat probably includes the 'data:image/jpeg;base64,' part. You shouldn't pass that bit to the Buffer constructor.

It seems that if you pass in invalid data, new Buffer() doesn't complain:

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

You even get back a valid Buffer. The buffer is a corrupt image (or rather, it doesn't begin with an image header).

You have to strip the first part of the data URI yourself:

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



回答2:


A buffer is not needed. You can just put the string starting from behind the base64 encoding prefix into it:

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

More Details you find here: https://github.com/nodemailer/nodemailer#attachments




回答3:


You can simply use the package nodemailer-base64-to-s3.

Install the package:

npm install -s nodemailer-base64-to-s3

Configure it with 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




回答4:


You can just use path for that without any additional manipulations:

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

Here the link to the related documentation



来源:https://stackoverflow.com/questions/24165410/nodemailer-send-base64-data-uri-as-attachment-how

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!