从 Google Apps 脚本发送到 SendGrid 时为空白 PDF

Blank PDF when sending from Google Apps Script to SendGrid

我有一个从 Google 幻灯片创建 PDF 的应用程序脚本。如果我使用 Google 的 MailApp 发送 PDF,我可以正确接收 PDF。

 var pdf_file =   DriveApp.getFileById(certificate.getId()).getAs('application/pdf');
  GmailApp.sendEmail(email, subject, body,{attachments: pdf_file,name: subject});

现在我不想使用 GMail,而是使用 SendGrid,我只更改了上面的一行,不再调用 GMailApp.sendEmail,现在使用这个新的 sendGridEmail 函数:

sendGridEmail(toEmail,subject,body,fromEmail,pdf_file,subject +".pdf"); 

这是我的 SendGrid Mail 函数:

function sendGridEmail(toEmail,subject,body_details,fromEmail,myPDFfile,certificateName) {
  var SENDGRID_KEY ='xxxxxxxxxxxxxxxxxxxxxxxxxxx';

  var headers = {
    "Authorization" : "Bearer "+ SENDGRID_KEY, 
    "Content-Type": "application/json" 
  }

  var cert = Utilities.base64Encode(myPDFfile);

  var body =
  {
  "personalizations": [
    {
      "to": [
        {
          "email": toEmail
        }
      ],
      "subject": subject
    }
  ],
  "from": {
    "email": fromEmail
  },
   "template_id":"d-xxxxxxxxxxxxxxxxxxxxxxxxxxx",
   "attachments": [
    {
      content: cert,
      filename: certificateName,
      type: "application/pdf",
    }
  ]
}

  var options = {

    'method':'post',
    'headers':headers,
    'payload':JSON.stringify(body)
  }

 var response = UrlFetchApp.fetch("https://api.sendgrid.com/v3/mail/send",options);
 Logger.log(response);  

}

我收到了邮件。除 PDF 外的所有作品均为空白。我可以看到,当我将 PDF 发送到我的 sendGridEmail 函数(它在调试器中显示为 PDF)并且执行 base64Encode 后,我看到它是一大堆数字,但是当我收到电子邮件时,我只看到一个空白的 pdf 页面。有什么想法吗?这是我第一次使用 base64 编码。我可能没做对。

这个修改怎么样?

修改点:

  • 从您的脚本中,var pdf_file = DriveApp.getFileById(certificate.getId()).getAs('application/pdf');pdf_file 被发送到 sendGridEmail(toEmail,subject,body,fromEmail,pdf_file,subject +".pdf");。即,pdf_file 是 blob,它在 sendGridEmail 中用作 myPDFfile
  • 在这种情况下,Utilities.base64Encode(data)data 需要 Byte[]

当以上几点反映到您的脚本中时,请进行如下修改。

修改后的脚本:

从:
var cert = Utilities.base64Encode(myPDFfile);
到:
var cert = Utilities.base64Encode(myPDFfile.getBytes());

注:

如果这不是您问题的直接解决方案,通过将 header 添加到 base64 数据来测试脚本怎么样?

参考文献: