首页 > 解决方案 > SES.sendRawEmail 仅使用 Gmail 中的第一个附件(Nodejs)

问题描述

我正在尝试使用 AWS SES 和 nodejs 发送包含多个附件的电子邮件。

我的 js 脚本像这样调用 ses.sendRawEmail:

const params = {
    RawMessage: {
      Data: rawMailBody
    },
    Destinations: [],
    Source: 'testemail@gmail.com'
  };

  ses.sendRawEmail(params, function (err, data) {
    if (err) console.log("Error: " + err);
    else {

      // console.log("Success call: ", JSON.stringify(data));
      console.log("Success.");

      return data
    }

  });

这就是我创建“rawMailBody”对象的方式:

const BUCKET = 'my-bucket';
var rawMailBody = "From: testemail@gmail.com\n";
  rawMailBody = rawMailBody + "To: testemail@gmail.com\n";
  rawMailBody = rawMailBody + "Subject: Test Subject\n";
  rawMailBody = rawMailBody + ``
  rawMailBody = rawMailBody + "MIME-Version: 1.0\n";
  rawMailBody = rawMailBody + "Content-Type: multipart/mixed; boundary=\"NextPart\"\n\n";
  rawMailBody = rawMailBody + "--NextPart\n";

  rawMailBody = rawMailBody + "Content-Type: text/html; charset=iso-8859-1\n";
  rawMailBody = rawMailBody + "\n";

  rawMailBody = rawMailBody + htmlData;

  rawMailBody = rawMailBody + "--NextPart\n";

  console.log('attaching attachments')

  const attachmentFilename = 'Evaluates2-Old-Logo.pdf';
  const attachmentFilename2 = '2019-W-4.pdf';

  console.log('adding attachment', attachmentFilename)
  rawMailBody = rawMailBody + "Content-Type: application/octet-stream\n";
  rawMailBody = rawMailBody + "Content-ID: random1565323918273545letters\n";
  rawMailBody = rawMailBody + 'Content-Disposition: attachment; name="Evaluates2-Old-Logo.pdf"; filename="Evaluates2-Old-Logo.pdf";\n';
  rawMailBody = rawMailBody + "Content-Transfer-Encoding: base64\n";
  rawMailBody = rawMailBody + await getImgDataBuffer('Evaluates2-Old-Logo.pdf', BUCKET); + "\n\n";
  rawMailBody = rawMailBody + "--NextPart\n";

  console.log('adding attachment', attachmentFilename2)
  rawMailBody = rawMailBody + "Content-Type: application/octet-stream\n";
  rawMailBody = rawMailBody + "Content-ID: random1565323443423794letters\n";
  rawMailBody = rawMailBody + "Content-Transfer-Encoding: base64\n";
  rawMailBody = rawMailBody + 'Content-Disposition: attachment; name="2019-W-4.pdf"; filename="2019-W-4.pdf";\n';
  // rawMailBody = rawMailBody + "Content-ID random3965323447923784letters\n";
  rawMailBody = rawMailBody + await getImgDataBuffer('2019-W-4.pdf', BUCKET); + "\n\n";
  rawMailBody = rawMailBody + "--NextPart\n";

  rawMailBody = rawMailBody + "--NextPart--\n";

我得到这样的图像数据库base64缓冲区:

const getImgDataBuffer = (imageFilename, bucket) => {

  return new Promise((resolve, reject) => {

    var params = { Bucket: bucket, Key: imageFilename };

    s3.getObject(params, function (err, data) {

      if (err) {

        console.log(err, err.stack); // an error occurred

        reject(err)
      }
      else {
        console.log(data.ContentLength);
        console.log(data.ContentType);
        console.log(data.Body);

        console.log('got ', imageFilename)
        resolve(data.Body.toString('base64'))
      }
    })

  })

}

我在 gmail 中遇到了非常奇怪的行为——它只需要我发送的第一个 pdf。第一个pdf完美通过,但第二个根本没有通过。当我交换将附件添加到 rawMailBody 对象的顺序时,它仍然只呈现第一个。

当我在 gmail 中选择“显示原始”时,我可以看到第二个附件的整个 MIME 块完全丢失了......

这是 gmail 在第一个附件之后删除后续附件的预期行为吗?我只是做错了吗?

谢谢!

标签: emailhtml-emailmime-typesemail-attachmentsamazon-ses

解决方案


推荐阅读