AWS SES, вложение электронной почты отправляет строку base64 вместо преобразования в формат DOCX

Требование

Что я пытаюсь сделать, так это сначала загрузить документ из корзины S3, а затем отправить этот документ через SES методом sendRawEmail в виде вложения с файлом, загруженным с S3.

Что я делал до сих пор

Я скачал файл с S3, могу отправить письмо с вложением. Он достигает пункта назначения, как и ожидалось (form.docx)

Ошибка

Когда я отправляю вложение, я должен добавить строку base64 (которая является вложением) в данные формы. Я прикрепляю шнур. Но когда я загружаю вложение. Там я вижу внутри form.docx преобразованную строку base64 внутри вложения. Это не так, как ожидалось. Я должен увидеть таблицы и заполнить пробелы. Но здесь это очень большая строка base64

Код

const AWS = require('aws-sdk');
const S3= new AWS.S3();
let ses = new AWS.SES();
exports.hello = async (event, context) => {
  try {
    const valueFromBucket = await S3.getObject({Bucket: '*******', Key: 'form.docx'}).promise();
    var buffer = valueFromBucket.Body.toString('base64');
    var message = '<html><body ><div> This is a test Message</div></body></html>';
    var fromEmail = '******@gmail.com';
    var toEmail = '*******@gmail.com';
    var ses_mail = "From: 'Email' <" + fromEmail + ">\n";
    ses_mail = ses_mail + "To: " + toEmail + "\n";
    ses_mail = ses_mail + "Subject: Subject Email\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=iso-8859-1\n\n";
    ses_mail = ses_mail + message+"\n";
    ses_mail = ses_mail + "--NextPart\n";
    ses_mail = ses_mail + "Content-Type: application/msword\n";
    ses_mail = ses_mail + "Content-Disposition: attachment; filename=\"form.docx\"\n\n";
    ses_mail = ses_mail + "Content-Transfer-Encoding: base64\n\n"
    ses_mail = ses_mail + buffer + "\n";
    ses_mail = ses_mail + "--NextPart--";

    var params = {
        RawMessage: { Data: new Buffer(ses_mail)},
        Destinations: [ "*******@gmail.com" ],
        Source: "'AWS Tutorial Series' <" + fromEmail + ">'"
    };
    const sendPromise = await new AWS.SES({ apiVersion: "2010-12-01" })
    .sendRawEmail(params)
    .promise();
    return{
      statusCode: 200,
      body: JSON.stringify(sendPromise)
    }
  }
  catch (err) {
    return {
      statusCode: err.statusCode || 400,
      body: err.message || JSON.stringify(err.message)
    }
  }
}

Любая помощь или предложения высоко ценятся

Заранее спасибо


comment
1) Не используйте простые строки для вашего boundary. 2) Две новые строки (убрать одну) "Content-Disposition: attachment; filename=\"form.docx\"\n\n";   -  person John Hanley    schedule 17.01.2019
comment
@JohnHanley О, чувак, большое спасибо, это сработало.   -  person Krishna    schedule 18.01.2019
comment
пожалуйста, опубликуйте это как ответ   -  person Krishna    schedule 18.01.2019
comment
@JohnHanley Не могли бы вы также изучить этот вопрос stackoverflow.com/questions/54635500/ , это похоже, но я не мог понять. Любая помощь очень ценится   -  person Krishna    schedule 11.02.2019
comment
Небольшое улучшение — new Buffer(string) теперь устарел, поэтому код, в котором он используется, можно заменить на Buffer.from(string).   -  person Sunil Kumar    schedule 04.12.2020


Ответы (1)


Проблема в том, что ваш код имеет две новые строки для одного из ваших заголовков частей раздела.

Измените эту строку кода:

ses_mail = ses_mail + "Content-Type: multipart/mixed; boundary=\"NextPart\"\n\n";

к этому:

ses_mail = ses_mail + "Content-Type: multipart/mixed; boundary=\"NextPart\"\n";
person John Hanley    schedule 18.01.2019