使用 GAS 和 API 创建自定义 "from" send-as 别名
Creates a custom "from" send-as alias with GAS and APIs
你好我想在 gmail 设置中添加 send as 参数。对于我所有的用户,并将其更改为默认帐户来发送邮件。
我知道使用 GUI 很重要,但我更喜欢使用 GAS。
know 的代码只是针对特定用户的测试。
var JSON = {
"private_key": "-----BEGIN PRIVATE KEY-----\n-----END PRIVATE KEY-----\n",
"client_email": "client..@project-id-XXXXX.gserviceaccount.com",
"client_id": "12345800",
"user_email": "mainaccount@dominio.com"
};
function getOAuthService(user) {
return OAuth2.createService('Service Account')
.setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth')
.setTokenUrl('https://accounts.google.com/o/oauth2/token')
.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/gmail.settings.sharing')
.setScope('https://www.googleapis.com/auth/gmail.settings.basic');
}
function createAlias() {
var userEmail = 'mainaccount@dominio.com';
var alias = {
alias: 'makealiasdefault@dominio.com'
};
alias = AdminDirectory.Users.Aliases.insert(alias, userEmail);
Logger.log('Created alias %s for user %s.', alias.alias, userEmail);
var service = getOAuthService();
service.reset();
if (service.hasAccess()) {
var url = 'https://www.googleapis.com/gmail/v1/users/'+userEmail+'/settings/sendAs'
var headers ={
"Authorization": 'Bearer ' + service.getAccessToken()
};
var options = {
'method':'post',
'headers': headers,
'method': 'GET',
'muteHttpExceptions': true
};
var response = UrlFetchApp.fetch(url, options);
}
Logger.log(response.getContentText());
var resource ={'sendAs':[
{'isDefault':true,
'verificationStatus':'accepted',
'sendAsEmail':alias.alias,
'treatAsAlias':true}]};
Logger.log(resource);
var sendas = Gmail.Users.Settings.SendAs.create(resource,alias.alias);
Logger.log(sendas);
}
function reset() {
var service = getOAuthService();
service.reset();
}
然后我收到一条错误消息:Delegation denied for mainaccount@dominio.com
如果我修改这一行 var sendas = Gmail.Users.Settings.SendAs.create(resource,alias.alias);
为了这
var sendas = Gmail.Users.Settings.SendAs.create(resource,userEmail);
我收到一个不同的错误
访问仅限于已被授予全域权限的服务帐户
全域是按照本指南制作的Domain-wide Delegation
有人知道如何使用此过程创建发送吗?或者如果代码有问题!
下面是一个从您的源代码中清理出来的工作示例。您的原始代码存在一些问题:
- 代码似乎试图进行原始 UrlFetchApp.fetch HTTP 调用并使用 Gmail 库。 Gmail 库不适用于服务帐户,它只会对当前用户起作用,这不是你想要的,因此我删除了 Gmail 库,我只使用 Url Fetch。
- 您只能调用 setScope() 一次,否则您会覆盖原始范围。如果要使用多个范围,请使用范围之间带有空格的字符串。
- 我不太确定您尝试使用 AdminDirectory 做什么,我已将其完全删除。如果您想调用 Admin SDK 目录 API 来为用户创建别名电子邮件地址(接收邮件),您需要添加目录范围。
- 将您的服务帐户值命名为 JSON 是个坏主意,因为它会覆盖 Apps 脚本的 JSON class,我已将该变量重命名为 service_account .明确您的变量名以避免此类错误总是一个好主意。
var service_account = {
"private_key": "-----BEGIN PRIVATE KEY...",
"client_email": "sa-email@example.com",
"client_id": "1234569343",
"user_email": "useraccount@example.com"
};
function getOAuthService(user) {
return OAuth2.createService('Service Account')
.setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth')
.setTokenUrl('https://accounts.google.com/o/oauth2/token')
.setPrivateKey(service_account.private_key)
.setIssuer(service_account.client_email)
.setSubject(service_account.user_email)
.setPropertyStore(PropertiesService.getScriptProperties())
.setScope('https://www.googleapis.com/auth/gmail.settings.sharing https://www.googleapis.com/auth/gmail.settings.basic')
}
function createAlias() {
var userEmail = 'useraccount@example.com';
var alias = 'myalias@example.com';
var alias_name = 'Alias User';
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': alias,
'displayName': alias_name
};
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());
}
}
function reset() {
var service = getOAuthService();
service.reset();
}
'''
你好我想在 gmail 设置中添加 send as 参数。对于我所有的用户,并将其更改为默认帐户来发送邮件。 我知道使用 GUI 很重要,但我更喜欢使用 GAS。 know 的代码只是针对特定用户的测试。
var JSON = {
"private_key": "-----BEGIN PRIVATE KEY-----\n-----END PRIVATE KEY-----\n",
"client_email": "client..@project-id-XXXXX.gserviceaccount.com",
"client_id": "12345800",
"user_email": "mainaccount@dominio.com"
};
function getOAuthService(user) {
return OAuth2.createService('Service Account')
.setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth')
.setTokenUrl('https://accounts.google.com/o/oauth2/token')
.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/gmail.settings.sharing')
.setScope('https://www.googleapis.com/auth/gmail.settings.basic');
}
function createAlias() {
var userEmail = 'mainaccount@dominio.com';
var alias = {
alias: 'makealiasdefault@dominio.com'
};
alias = AdminDirectory.Users.Aliases.insert(alias, userEmail);
Logger.log('Created alias %s for user %s.', alias.alias, userEmail);
var service = getOAuthService();
service.reset();
if (service.hasAccess()) {
var url = 'https://www.googleapis.com/gmail/v1/users/'+userEmail+'/settings/sendAs'
var headers ={
"Authorization": 'Bearer ' + service.getAccessToken()
};
var options = {
'method':'post',
'headers': headers,
'method': 'GET',
'muteHttpExceptions': true
};
var response = UrlFetchApp.fetch(url, options);
}
Logger.log(response.getContentText());
var resource ={'sendAs':[
{'isDefault':true,
'verificationStatus':'accepted',
'sendAsEmail':alias.alias,
'treatAsAlias':true}]};
Logger.log(resource);
var sendas = Gmail.Users.Settings.SendAs.create(resource,alias.alias);
Logger.log(sendas);
}
function reset() {
var service = getOAuthService();
service.reset();
}
然后我收到一条错误消息:Delegation denied for mainaccount@dominio.com
如果我修改这一行 var sendas = Gmail.Users.Settings.SendAs.create(resource,alias.alias); 为了这 var sendas = Gmail.Users.Settings.SendAs.create(resource,userEmail); 我收到一个不同的错误
访问仅限于已被授予全域权限的服务帐户
全域是按照本指南制作的Domain-wide Delegation
有人知道如何使用此过程创建发送吗?或者如果代码有问题!
下面是一个从您的源代码中清理出来的工作示例。您的原始代码存在一些问题:
- 代码似乎试图进行原始 UrlFetchApp.fetch HTTP 调用并使用 Gmail 库。 Gmail 库不适用于服务帐户,它只会对当前用户起作用,这不是你想要的,因此我删除了 Gmail 库,我只使用 Url Fetch。
- 您只能调用 setScope() 一次,否则您会覆盖原始范围。如果要使用多个范围,请使用范围之间带有空格的字符串。
- 我不太确定您尝试使用 AdminDirectory 做什么,我已将其完全删除。如果您想调用 Admin SDK 目录 API 来为用户创建别名电子邮件地址(接收邮件),您需要添加目录范围。
- 将您的服务帐户值命名为 JSON 是个坏主意,因为它会覆盖 Apps 脚本的 JSON class,我已将该变量重命名为 service_account .明确您的变量名以避免此类错误总是一个好主意。
var service_account = {
"private_key": "-----BEGIN PRIVATE KEY...",
"client_email": "sa-email@example.com",
"client_id": "1234569343",
"user_email": "useraccount@example.com"
};
function getOAuthService(user) {
return OAuth2.createService('Service Account')
.setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth')
.setTokenUrl('https://accounts.google.com/o/oauth2/token')
.setPrivateKey(service_account.private_key)
.setIssuer(service_account.client_email)
.setSubject(service_account.user_email)
.setPropertyStore(PropertiesService.getScriptProperties())
.setScope('https://www.googleapis.com/auth/gmail.settings.sharing https://www.googleapis.com/auth/gmail.settings.basic')
}
function createAlias() {
var userEmail = 'useraccount@example.com';
var alias = 'myalias@example.com';
var alias_name = 'Alias User';
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': alias,
'displayName': alias_name
};
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());
}
}
function reset() {
var service = getOAuthService();
service.reset();
}
'''