首页 > 解决方案 > 使用媒体上传方法在 appscript 中发送带有附件的电子邮件

问题描述

我使用以下代码使用“媒体上传”方法创建了一个草稿消息

var draftUploadUrl = "https://www.googleapis.com/upload/gmail/v1/users/me/drafts?uploadType=media";

var response = UrlFetchApp.fetch(draftUploadUrl, {
  method: "POST",
  headers: {
    //authorizing request through service account
    "Authorization": "Bearer " + service.getAccessToken(),
    "Content-Type": "message/rfc822",
  },

  muteHttpExceptions: true,

  //payload_data is mime content with base64 encode of email body an 
  //attachment 
  payload: payload_data
});


draftID = /: "(.*)"/.exec(response.getContentText())[1];

console.log("draftID: " + draftID);

我得到消息的草稿 ID,如何在参数中设置草稿 ID以发送带有附件的电子邮件?

代码片段

var resp1 = UrlFetchApp.fetch("https://www.googleapis.com/upload/gmail/v1/users/me/drafts/send?uploadType=media", {
  method: "POST",
  headers: {
    "Authorization": "Bearer " + service.getAccessToken(),
    "Content-Type": "message/rfc822"
  },
  muteHttpExceptions: true,
  payload: JSON.stringify({
    "id": draftID
  })
});

它抛出错误“无效草稿”。您能否指导如何为上述 url 调用传递 ID 参数或上述代码中出了什么问题?

提前致谢。

标签: google-apps-scriptgmail-apigoogle-app-makergoogle-apis-explorer

解决方案


  • 您已经能够正确创建草稿电子邮件。
  • 您想通过使用 Google Apps 脚本直接向 Gmail API 的端点请求发送创建的草稿邮件。

如果我的理解是正确的,那么这个修改呢?

修改点:

  • 用作https://www.googleapis.com/gmail/v1/users/me/drafts/send端点。
  • application/json用作Content-Type. _

修改后的脚本:

var resp1 = UrlFetchApp.fetch("https://www.googleapis.com/gmail/v1/users/me/drafts/send", {
  method: "POST",
  headers: {
    "Authorization": "Bearer " + service.getAccessToken(),
    "Content-Type": "application/json"
  },
  muteHttpExceptions: true,
  payload: JSON.stringify({
    "id": draftID
  })
});

笔记:

  • 此修改假设您已经能够使用访问令牌使用 Gmail API。
  • 如果草稿邮件的格式不完整,那么在发送草稿邮件时,就会出现错误的情况。

参考:

如果我误解了你的问题,我很抱歉。

编辑:

当您想创建包含附件文件的草稿电子邮件时,这个示例脚本怎么样?这是来自https://stackoverflow.com/a/45992149/7108653

示例脚本:

此示例脚本使用 Gmail API 创建草稿电子邮件。

function createDraft() {
  var fileId = "### file id ###"; // Please set this.
  var file = DriveApp.getFileById(fileId);
  var forScope = GmailApp.getInboxUnreadCount();
  var htmlBody = 'sample HTML body'; // Please set this.
  var raw = 
      'Subject: sample subject\r\n' + // Please set this.
      'To: aa@bb.cc\r\n' + // Please set this.
      'Content-Type: multipart/mixed; boundary=##########\r\n\r\n' +
      '--##########\r\n' +
      'Content-Type: text/html; charset=UTF-8\r\n\r\n' + htmlBody + '\r\n' +
      '--##########\r\n' +
      'Content-Type: ' + file.getMimeType() + '; charset=UTF-8; name="' + file.getName() + '"\r\n' +
      'Content-Disposition: attachment; filename="' + file.getName() + '"\r\n' +
      'Content-Transfer-Encoding: base64\r\n\r\n' + Utilities.base64Encode(file.getBlob().getBytes()) +
      '\r\n--##########\r\n';
  var draftBody = Utilities.base64EncodeWebSafe(raw, Utilities.Charset.UTF_8);
  var params = {
    method:"post",
    contentType: "application/json",
    headers: {"Authorization": "Bearer " + service.getAccessToken()},
    muteHttpExceptions: true,
    payload: JSON.stringify({"message": {"raw": draftBody}})
  };
  var resp = UrlFetchApp.fetch("https://www.googleapis.com/gmail/v1/users/me/drafts", params);
  Logger.log(resp)
}

推荐阅读