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.
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.
Its an opensource library with MIT license. There is no paid version for this library - but you can donate.
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
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With