无法使用 sendgrid 发送包含超过 2 张照片的 pdf 附件

Unable to send pdf attachment with more than 2 photos using sendgrid


我有一个奇怪的问题。我创建了 API,它允许您:将照片上传到服务器,然后将数据保存到数据库,使用这些数据和照片生成 pdf,然后发送带有该 pdf 附件的电子邮件。它对我来说效果很好,而我 uploading/sending 只有两张照片。我能够使用 finder 打开生成的 pdf 文件,我也能够从收到的电子邮件中打开它。
然后我上传了更多文件,在发送 API 请求后,我收到了包含该 pdf 文件的电子邮件,但我无法打开它。它显示 finder 无法打开该文件的错误。当我在服务器文件夹中手动检查时,它运行良好。

所以发送那封邮件时一定有问题。 0 到 2 张照片效果很好,超过 2 张照片就不行了。但是当我在服务器上打开那个 pdf 文件时,即使有 8 张照片也能正常工作。

正在发送该 pdf 附件的图片。

这是我用来生成带有图片的 pdf 的代码:

const photosToPdf = [];
let positionX = 30;
let positionY = 240;

 for(let j=0;j<uploadsPath.length;j++){
    photosToPdf.push(uploadsFileNames[j]);
 }
    
 photosToPdf.forEach(img => {
    if(positionX == 570){
       positionX = 30
       positionY = positionY + 160 
    }
    doc.image(`uploads/${img}`, positionX, positionY, {width: 80});
    positionX = positionX + 90
});

这里是生成电子邮件的代码:

function highPriorityEmail(){
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      let filePath = path.join(__dirname, `../../${problemName}_${creationDate}.pdf`);
      let attachment = fs.readFileSync(filePath).toString("base64");
      let fileName = `${problemName}_${creationDate}.pdf`

      if (problemPriority == "vysoká") {
        global.msg = {
          //to: ['marekzacik23@gmail.com', 'zacik.mareek@gmail.com'], // Change to your recipient
          //to: "miroslav.hanzen@skolboz.sk", // Change to your recipient
          to: "zacik.mareek@gmail.com", // Change to your recipient
          from: "marekzacik23@gmail.com", // Change to your verified sender
          subject: "Vytvorenie nového nedostatku: " + problemName,
          html: `
                        Dobrý deň, <br>
                        <br>
                        dňa ${creationDate} bol vykonaný dozor koordinátora ${koordinatorName}. <br> 
                        Boli zistené nedostatky s vysokou prioritou, ktoré sú priložené v prílohe tohoto emailu.
                        <br>
                    `,
          attachments: [
              {
                  content: attachment,
                  filename: fileName,
                  contentType:'application/pdf'
              },
          ],
        };
        

        // sgMail.sendMultiple(msg) to prevent seeing
        sgMail
          .send(msg)
          .then(() => {
            console.log("Email sent");
          })
          .catch((error) => {
            console.error(error);
          });

        Case.update(
          { wasSended: 1 },
          { returning: true, where: { caseName: problemName } }
        );
      }
      resolve();
    }, 1000)
  });
};

我正在使用:
pdfkit-table
和 sendgrid/mail

感谢帮助

好的,我想我们在这里找到了答案。

问题在行

        global.msg = {

将函数的局部变量设置为全局变量使得其他代码可以在使用该数据时更改该数据。将其更改为 const 即可避免该问题:

        const msg = {

还有一点需要指出,附件对象内容类型 属性 应该是 type 而不是 contentType (尽管在我的测试中这并没有改变任何东西)。

          attachments: [
              {
                  content: attachment,
                  filename: fileName,
                  type:'application/pdf'
              },
          ],