用于向Gmail

时间:2018-04-07 22:59:22

标签: google-apps-script gmail-api

我有一个Google Apps脚本,它给了我错误"代表团拒绝了jasonjurotich@school.edu.mx",并且无法为其中的帐户添加别名(另一封电子邮件)一个域名。可能是因为Token标题或遗漏的某些URL授权了某些内容,但我找不到足够的文档来说明如何添加它。

这不应与在Google管理控制台中为同一封电子邮件创建别名相混淆。相反,这是为第一个帐户添加另一个单独的帐户,以便代表第二个帐户发送电子邮件。

已激活所有必要的权限(OAuth2,具有域范围委派的Google服务帐户,必要的API已激活等)

我的脚本如下:

var JSON = {
  "private_key": "key",
  "client_email": "email",
  "client_id": "ID",
  "user_email": "teststudent@school.edu.mx"
};

function getOAuthService(user) {
  return OAuth2.createService('Service Account')
    .setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth')
    .setTokenUrl('https://accounts.google.com/o/oauth2/token')
    .setClientId('ID')
    .setPrivateKey(JSON.private_key)
    .setIssuer(JSON.client_email)
    .setSubject(JSON.user_email)
    .setPropertyStore(PropertiesService.getScriptProperties())
    .setParam('access_type', 'offline')
    .setParam('approval_prompt', 'force')
    .setScope('https://www.googleapis.com/auth/script.external_request https://www.googleapis.com/auth/gmail.settings.sharing');
}

function changeEmail() {
  var service = getOAuthService();
  service.reset();
  if (service.hasAccess()) {
    var userEmail = 'teststudent@school.edu.mx';   

    var alias = {
      sendAsEmail: 'aliastest1@school.edu.mx',
      displayName: 'TS',
      replyToAddress : 'aliastest1@school.edu.mx',
      treatAsAlias: true
    };

    Gmail.Users.Settings.SendAs.create(alias, userEmail);      
  }
}

2 个答案:

答案 0 :(得分:0)

您似乎正在使用旧版本的 OAuth2 库来使用Google Apps脚本。请检查源代码并确保它不会调用 ScriptApp.getProjectKey()。例如,下面的版本使用 ScriptApp.getScriptId()而不是弃用的方法:

https://github.com/gsuitedevs/apps-script-oauth2/blob/master/dist/OAuth2.gs

尝试将新版本作为库连接到GAS项目,或者手动将文件添加到脚本中,看看是否能解决问题。

<强>更新

我相信会发生的事情是您使用更严格的授权范围覆盖允许的授权范围。查看&#39; setScope()&#39;的源代码。方法,看起来你可以连续调用它。

Service_.prototype.setScope = function(scope, optSeparator) {
  var separator = optSeparator || ' ';
  this.params_.scope = Array.isArray(scope) ? scope.join(separator) : scope;
  return this;
};

相反,您必须提供范围列表和可选分隔符(默认值为空格)。因此,您的脚本最终使用的唯一授权范围是https://www.googleapis.com/auth/gmail.settings.basic。 底线:致电&#39; setScope()&#39;一次,传递空格分隔的所需范围列表。 不要进行2次单独调用,请尝试以下方法:

setScope('https://www.googleapis.com/auth/gmail.settings.basic https://www.googleapis.com/auth/gmail.settings.sharing');

答案 1 :(得分:0)

我的一位同事在这里发布了类似这个问题的内容:Creates a custom "from" send-as alias with GAS and APIs。以下修改过的代码最终会考虑到这里放置的内容以及放在那里的内容。

var service_account = {
"private_key": "-----BEGIN PRIVATE KEY-----",
"client_email": "changealiastest4@project-id-[].iam.gserviceaccount.com",
"client_id": "ID",
"user_email": "teststudent@school.edu.mx"
};

function getOAuthService(user) {
  return OAuth2.createService('Service Account')
    .setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth')
    .setTokenUrl('https://accounts.google.com/o/oauth2/token')
    .setClientId('ID')
    .setPrivateKey(service_account.private_key)
    .setIssuer(service_account.client_email)
    .setSubject(service_account.user_email)
    .setPropertyStore(PropertiesService.getScriptProperties())
    .setParam('access_type', 'offline')
    .setParam('approval_prompt', 'force')
    .setScope('https://www.googleapis.com/auth/script.external_request https://www.googleapis.com/auth/gmail.settings.sharing https://www.googleapis.com/auth/gmail.settings.basic');
}

function changeEmail() {
  var userEmail = 'teststudent@school.edu.mx'; 
  var aliasEmail = 'aliastest1@school.edu.mx';
  var aliasName = 'TS';

  var service = getOAuthService();
    service.reset();
    if (service.hasAccess()) {

  var url = 'https://www.googleapis.com/gmail/v1/users/me/settings/sendAs'
    var headers ={
      "Authorization": 'Bearer ' + service.getAccessToken(),
      "Accept":"application/json", 
      "Content-Type":"application/json",
      };

  var resource ={
     sendAsEmail: aliasEmail,
     displayName: aliasName,
     replyToAddress : aliasEmail,
     treatAsAlias: true,
     verificationStatus: 'accepted'
   };  

  var options = {
  'headers': headers,
  'method': 'POST',
  'payload': JSON.stringify(resource),
  'muteHttpExceptions': true
  };

Logger.log(options);
var response = UrlFetchApp.fetch(url, options);
Logger.log(response.getContentText()); 

  }
}