如何使用 Google Apps 脚本和 Mailchimp API 发送带有附件的交易电子邮件

How to send a transactional email with attachment with Google Apps Script and Mailchimp API

我正在尝试了解如何使用 Mailchimp 在交易电子邮件中发送附件。根据 documentationattachments 数组必须包含具有 typenamecontent 属性的对象。我想不通的是content。令人惊讶的是,我可以在 SO 上找到相关问题。

文档说它的值必须是:

the content of the attachment as a base64-encoded string

所以我有这个发送电子邮件的功能,但附件内容已损坏(名称和类型看起来不错):

const sendEmail = emailObj => {
  console.log('sendEmail()');
  const URL = 'https://mandrillapp.com/api/1.0/messages/send';

  const { html, subject, toEmail, attachmentId } = emailObj;

  const file = DriveApp.getFileById(attachmentId);
  const type = file.getMimeType();
  const name = file.getName();
  const content = Utilities.base64Encode(file.getBlob().getDataAsString());

  const options = {
    header: {
      'Content-Type': 'application/json',
    },
    payload: JSON.stringify({
      key: 'key',
      message: {
        from_email: 'email@domain.com',
        subject,
        html,
        to: [
          {
            email: toEmail,
            type: 'to',
          },
        ],
        attachments: [
          {
            type,
            name,
            content,
          },
        ],
      },
    }),
  };


  const response = UrlFetchApp.fetch(URL, options);
  console.log(response.getContentText());
  return emailObj;
};

附件以损坏的 PDF 文件形式出现,但名称正确。

我也尝试过将内容设置为:

希望之前有人这样做过:)

由于我目前的限制,我无法完全测试 API,所以我尝试在线转换驱动器中文件的 Base64,此方法有效。

content = Utilities.base64Encode(file.getBlob().getBytes())

base64Encode 按照 documentation 的建议处理字节数组。如果它有特殊字符,您可以向它添加特定的字符集(例如Utilities.Charset.UTF_8)。

如果仍然无效,请尝试变体 base64EncodeWebSafe。只是总是使用它的字节数组作为它的参数。

最好的测试方法是,当您尝试将其转换为文件时,检查您获得的 base64 是否正常工作。您可以尝试将 base64 转换为文件或从中创建驱动器文件的在线站点,并检查它是否是正确的 base64。 getDataAsString return 上的 Base64 会像我测试的那样出错。需要原始字节,所以 getBytes 在我的测试中成功了。