【问题标题】:Blank PDF when sending from Google Apps Script to SendGrid从 Google Apps 脚本发送到 SendGrid 时出现空白 PDF
【发布时间】:2020-05-16 01:13:33
【问题描述】:

我有一个应用脚本正在从 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 邮件功能:

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 编码。我可能做得不对。

【问题讨论】:

    标签: pdf google-apps-script base64 sendgrid


    【解决方案1】:

    这个修改怎么样?

    修改点:

    • 从您的脚本中,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());
    

    注意:

    如果这不是您问题的直接解决方案,是否可以通过将标头添加到 base64 数据来测试脚本?

    参考资料:

    【讨论】:

    • @queenstacy 感谢您的回复。很高兴您的问题得到解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多