【发布时间】:2023-04-05 05:29:01
【问题描述】:
我想以 G Suite 管理员身份通过 Google Apps 脚本更新域用户的签名。
我按照 Mike 的示例 here 使用对 Gmail API 的 HTTP 请求,并且能够正常工作。
这是我所做的总结:
在 Advance Google 服务和 Google API 控制台中启用了 Gmail API
在我的项目中添加了 OAuth2 for Apps Script 库(因为 Apps 脚本不提供对 OAuth2 协议的内置支持)
为我的项目创建了一个服务帐户
向服务帐户委派域范围的权限
添加了“https://www.googleapis.com/auth/gmail.settings.sharing”作用域
以下代码效果很好(参见原始版本here)
function setSignatureWithHTTPRequest(email, signature) {
var signatureSetSuccessfully = false;
var authorizationScope = ['https://www.googleapis.com/auth/gmail.settings.sharing'];
var service = getDomainWideDelegationService("Gmail: ", authorizationScope, email);
if (!service.hasAccess()) {
Logger.log("failed to authenticate as user " + email);
Logger.log(service.getLastError());
signatureSetSuccessfully = service.getLastError();
return signatureSetSuccessfully;
} else {
Logger.log("successfully authenticated as user " + email);
}
var username = email.split("@")[0];
var resource = { signature: signature };
var requestBody = {};
requestBody.headers = {"Authorization": "Bearer " + service.getAccessToken()};
requestBody.contentType = "application/json";
requestBody.method = "PUT";
requestBody.payload = JSON.stringify(resource);
requestBody.muteHttpExceptions = false;
var emailForUrl = encodeURIComponent(email);
var url = "https://www.googleapis.com/gmail/v1/users/me/settings/sendAs/" + emailForUrl;
try {
var setSignatureResponse = UrlFetchApp.fetch(url, requestBody);
signatureSetSuccessfully = true;
Logger.log("setSignatureResponse on successful attempt:" + setSignatureResponse);
} catch (e) {
Logger.log("Set signature with HTTP request failed: " + e);
}
return signatureSetSuccessfully;
}
但是,当我修改代码以使用 Gmail API 中的 patch 方法而不是带有 UrlFetchApp 的 HTTP 请求时,我收到 GoogleJsonResponseException: Not Found 错误。
function setSignatureWithMethod(email, signature) {
var signatureSetSuccessfully = false;
var authorizationScope = ['https://www.googleapis.com/auth/gmail.settings.sharing'];
var service = getDomainWideDelegationService("Gmail: ", authorizationScope, email);
if (!service.hasAccess()) {
Logger.log("failed to authenticate as user " + email);
Logger.log(service.getLastError());
signatureSetSuccessfully = service.getLastError();
return signatureSetSuccessfully;
} else {
Logger.log("successfully authenticated as user " + email);
}
var resource = { signature: signature };
try {
var setSignatureResponse = Gmail.Users.Settings.SendAs.patch(resource, "me", email);
Logger.log("setSignatureResponse on successful attempt:" + setSignatureResponse);
signatureSetSuccessfully = true;
} catch (e) {
Logger.log("Set signature with method failed: " + e);
}
return signatureSetSuccessfully;
}
我的问题是双重的。
为什么
function setSignatureWithMethod()会产生错误?另一位发帖者提到 here 说“...您将需要使用使用 UrlFetchApp 服务的 Gmail REST 接口而不是 Gmail 服务来进行调用...因为脚本不能作为服务帐户运行,只有一个用户帐户。”这是准确的吗? Gmail API 提供的方法(列表、补丁、更新等)是否仅用于设置您自己的电子邮件签名(或自己的 Gmail 设置),而不用于域中的其他用户?
【问题讨论】:
标签: google-apps-script gmail-api google-oauth google-admin-sdk