Можно ли вообще использовать текущий токен доступа к сообщениям (или эквивалент) для надстроек Gmail с API Gmail?
Задний план:
Надстройки Google Workspace для Gmail позволяют получить доступ к открытой в данный момент электронной почте в API на contextualTrigger с областью действия:
https://www.googleapis.com/auth/gmail.addons.current.message.readonly
Токен доступа должен быть передан с использованием чтобы предоставить доступ к этому открытому в данный момент электронному письму:
var accessToken = e.gmail.accessToken;
var messageId = e.gmail.messageId;
// The following function enables short-lived access to the current
// message in Gmail. Access to other Gmail messages or data isn't
// permitted.
GmailApp.setCurrentMessageAccessToken(accessToken);
var mailMessage = GmailApp.getMessageById(messageId);
Из приведенной выше документации:
setCurrentMessageAccessToken(accessToken)
Устанавливает к токен доступатекущему сообщению, который позволяет скрипту получить доступ к текущему
GmailMessage
характеристики.Этот метод требуется только проектов длянадстроек Gmail, использующих текущие области сообщений Gmail .
К сожалению, ссылка на страницы с токенами доступа и текущими областями сообщений в настоящее время не работает и приводит к 404 страницам, поэтому я не могу найти здесь дополнительную информацию.
Вопрос:
Как достичь той же функциональности, используя Gmail API напрямую вместо
GmailApp
?
В документации для Gmail:users.messages.get указано, что
https://www.googleapis.com/auth/gmail.addons.current.message.readonly
является допустимой областью для вызова этого метода, однако, похоже, нет эквивалента
GmailApp.setCurrentMessageAccessToken(accessToken)
для Gmail API.
Что не работает:
- Использование - в соответствии с этой документацией: «Токен доступа, который включает области Gmail, не совпадает с токеном доступа, возвращаемым
ScriptApp.getOAuthToken()
. Вы должны использовать токен, предоставленный в объекте события действия ". - Предоставление токена доступа из объекта события в качестве токена в
Authorization: Bearer
заголовок также вызывает ошибку 403.
Обнаруженная функциональность будет сродни:
var accessToken = e.gmail.accessToken
var messageId = e.gmail.messageId
Gmail.setCurrentMessageAccessToken(accessToken) // made up method
var mailMessage = Gmail.Users.Messages.get("me", messageId)
2 ответа
Я думаю, что в этом случае, чтобы включить токен доступа, как насчет прямого запроса к конечной точке API Gmail с помощью UrlFetchApp? Когда ваш скрипт конвертируется, он становится следующим. В этом случае область действия может быть выбрана из области действия .
Пример сценария:
var accessToken = "###";
var messageId = "###";
var userId = "me";
var url = `https://gmail.googleapis.com/gmail/v1/users/${userId}/messages/${messageId}`;
var res = UrlFetchApp.fetch(url, {headers: {authorization: `Bearer ${accessToken}`}});
console.log(res.getContentText())
Примечание:
- В этом случае будьте осторожны с прицелами.
Рекомендации:
Добавлен:
Ваша цель следующая.
Вы хотите использовать метод "users.messages.get" Gmail API, используя область видимости.
Из наших обсуждений в комментарии я резюмировал текущую ситуацию следующим образом.
Когда я проверил включенные области из токена доступа, полученного
ScriptApp.getOAuthToken()
для проекта GAS, который установил файл манифеста, я мог подтвердить, что объем иscript.external_request
.Когда я увидел авторизацииофициальный документСсылка , чтобы использовать метод "users.messages.get", он отображается как
Requires one of the following OAuth scopes:
.Но когда объем
gmail.addons.current.message.readonly
используется для метода "users.messages.get", такая ошибка, какMissing access token for authorization.
имеет место.Когда объем
gmail.readonly
включен, ошибка может быть устранена.
Из приведенной выше ситуации, как насчет того, чтобы сообщить об этом в систему отслеживания проблем Google? Ссылка
Отвечать:
На данный момент это сделать невозможно.
Краткое изложение проблемы:
-
GmailApp
не имеет метода или класса, позволяющего управлять метками отдельных сообщений, только потоки. - В
accessToken
предоставленный в контекстном триггере, кажется, отличается от токена OAuth и поэтому не может использоваться для аутентификации вызова для чтения текущего сообщения. - Невозможно передать токен через API Gmail, чтобы можно было использовать текущее сообщение.
- Единственный способ получить сообщение - это если такая область видимости, как
gmail.readonly
используется. - Пока
https://www.googleapis.com/auth/gmail.addons.current.message.readonly
указан как допустимый объем дляmessages.get
, похоже, нет никакого способа фактически использовать область при подключении к Gmail API.
Дальнейшие шаги:
- Я отправил сюда запрос функции, чтобы добавить возможность управления ярлыками сообщений из класса GmailApp в скрипте приложений. Пометьте эту проблему, чтобы повысить ее приоритет.
- В этой заметке уже был запрос функции для этой же функции на этой странице , но, поскольку ему больше двух лет, без ответа от Google я подал другой.
- Я отправил отзыв о документации для messages.get с помощью кнопки Отправить отзыв, чтобы получить область действия
gmail.addons.current.message.readonly
уточнены или удалены со страницы.