Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Nodemailer send base64 data URI as attachment. How?

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.

like image 588
Ильич Ленин Avatar asked Jun 11 '14 14:06

Ильич Ленин


People also ask

How do I send an email from Nodemailer?

In short, what you need to do to send messages, would be the following: Create a Nodemailer transporter using either SMTP or some other transport mechanism. Set up message options (who sends what to whom) Deliver the message object using the sendMail() method of your previously created transporter.

Is node Mailer free?

Its an opensource library with MIT license. There is no paid version for this library - but you can donate.


2 Answers

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

like image 90
lohsie Avatar answered Nov 12 '22 16:11

lohsie


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

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

var pixel = "data:image/gif;base64,"
    + "R0lGODlhAQABAIABAP///wAAACH5"
    + "BAEKAAEALAAAAAABAAEAAAICTAEAOw==";
var buffer = Buffer.from(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 = Buffer.from(pixel.split("base64,")[1], "base64");

Edit (may 2021): Changed new Buffer to Buffer.from, as the former is deprecated.

like image 26
RickN Avatar answered Nov 12 '22 17:11

RickN