upload .jpg image attachment in mail using AWS SES from node.js

匿名 (未验证) 提交于 2019-12-03 01:20:02

问题:

Below is the code from https://github.com/andrewpuch/aws-ses-node-js-examples where there is an example to send and email with attachment,

I have modified the code to fetch a image file from aws s3 and and send it with mail as attachment, when i did it for an text file it work perfectly, but when I have sent an image, in the mail I was not able to see the image since it is corrupted.

when I tried opening with apple photo app it has shown that meta data is missing, also I have added Content-Transfer-Encoding: base64 in the header of the mail, when I tried with utf8, utf-8 and UTF-8 in Content-Transfer-Encodingin the header I got the below response from aws

{   "message": "Unknown encoding: utf8",   "code": "InvalidParameterValue",   "time": "2017-03-14T08:42:43.571Z",   "requestId": "2e220c33-0892-11e7-8a5a-1114bbc28c3e",   "statusCode": 400,   "retryable": false,   "retryDelay": 29.798455792479217 } 

My modified code to send an image attachment with mail, I even tried encoding the buffer to utf-8, base-64,wasted enough time on this, no clue why it is corrupted, if some one have done this before, help me

// Require objects. var express = require('express'); var app = express(); var aws = require('aws-sdk');  // Edit this with YOUR email address. var email = "*******@gmail.com";  // Load your AWS credentials and try to instantiate the object. aws.config.loadFromPath(__dirname + '/config.json');  // Instantiate SES. var ses = new aws.SES(); var s3 = new aws.S3();  // Verify email addresses. app.get('/verify', function (req, res) {     var params = {         EmailAddress: email     };      ses.verifyEmailAddress(params, function (err, data) {         if (err) {             res.send(err);         }         else {             res.send(data);         }     }); });  // Listing the verified email addresses. app.get('/list', function (req, res) {     ses.listVerifiedEmailAddresses(function (err, data) {         if (err) {             res.send(err);         }         else {             res.send(data);         }     }); });  // Deleting verified email addresses. app.get('/delete', function (req, res) {     var params = {         EmailAddress: email     };      ses.deleteVerifiedEmailAddress(params, function (err, data) {         if (err) {             res.send(err);         }         else {             res.send(data);         }     }); });  // Sending RAW email including an attachment. app.get('/send', function (req, res) {     var params = { Bucket: 's3mailattachments', Key: 'aadhar.jpg' };     var attachmentData;     s3.getObject(params, function (err, data) {         if (err)             console.log(err, err.stack); // an error occurred         else {             console.log(data.ContentLength);             console.log(data.ContentType);             console.log(data.Body);             var ses_mail = "From: 'AWS Tutorial Series' <" + email + ">\n";             ses_mail = ses_mail + "To: " + email + "\n";             ses_mail = ses_mail + "Subject: AWS SES Attachment Example\n";             ses_mail = ses_mail + "MIME-Version: 1.0\n";             ses_mail = ses_mail + "Content-Type: multipart/mixed; boundary=\"NextPart\"\n\n";             ses_mail = ses_mail + "--NextPart\n";             ses_mail = ses_mail + "Content-Type: text/html; charset=us-ascii\n\n";             ses_mail = ses_mail + "This is the body of the email.\n\n";             ses_mail = ses_mail + "--NextPart\n";             ses_mail = ses_mail + "Content-Type: image/jpeg; \n";             ses_mail = ses_mail + "Content-Disposition: attachment; filename=\"aadhar.jpg\"\n";             ses_mail = ses_mail + "Content-Transfer-Encoding: base64\n\n"             ses_mail = ses_mail + data.Body;             ses_mail = ses_mail + "--NextPart";               var params = {                 RawMessage: { Data: new Buffer(ses_mail) },                 Destinations: [email],                 Source: "'AWS Tutorial Series' <" + email + ">'"             };              ses.sendRawEmail(params, function (err, data) {                 if (err) {                     res.send(err);                 }                 else {                     res.send(data);                 }             });          }     }); });  // Start server. var server = app.listen(3003, function () {     var host = server.address().address;     var port = server.address().port;      console.log('AWS SES example app listening at http://%s:%s', host, port); }); 

回答1:

First, your MIME message is not well formatted. The last line should be --NextPart-- instead of just --NextPart.

You should also convert the data.Body array into its base64 string representation using new Buffer(data.Body).toString('base64') as shown below:

var ses_mail = "From: 'AWS Tutorial Series' <" + email + ">\n"; ses_mail += "To: " + email + "\n"; ses_mail += "Subject: AWS SES Attachment Example\n"; ses_mail += "MIME-Version: 1.0\n"; ses_mail += "Content-Type: multipart/mixed; boundary=\"NextPart\"\n\n"; ses_mail += "--NextPart\n"; ses_mail += "Content-Type: text/html; charset=us-ascii\n\n"; ses_mail += "This is the body of the email.\n\n"; ses_mail += "--NextPart\n"; ses_mail += "Content-Type: image/jpeg; \n"; ses_mail += "Content-Disposition: attachment; filename=\"aadhar.jpg\"\n"; ses_mail += "Content-Transfer-Encoding: base64\n\n" ses_mail += new Buffer(data.Body).toString('base64'); ses_mail += "--NextPart--"; 

Then, you can pass the ses_mail string as raw message data as RawMessage: { Data: ses_mail } instead of RawMessage: { Data: new Buffer(ses_mail) }.



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