我正在尝试使用 Google API 客户端和 Google App Engine 之上的 GMail API 修改多个用户的 GMail 消息。
流程大纲:用户向 webApp 发送请求,将消息添加到队列中。在此请求中,检查 Gmail 帐户是否存在给定邮件。然后稍后将通过 cron 作业处理此消息(无需用户发出另一个请求)。
我按照文档中关于如何使用 API 的示例进行操作,有以下两种方法:
private static GoogleClientSecrets getClientCredential() throws IOException {
return GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(Utils.class.getResourceAsStream("/client_secret.json")));
}
public static GoogleAuthorizationCodeFlow newFlow(final String userId) throws IOException {
return new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY,
getClientCredential(), Collections.singleton(GmailScopes.GMAIL_MODIFY))
.setDataStoreFactory(DATA_STORE_FACTORY)
.setAccessType("offline")
.setApprovalPrompt("force")
.addRefreshListener(
new DataStoreCredentialRefreshListener(userId, DATA_STORE_FACTORY))
.build();
}
public static Gmail loadGmailClient(final String userId) throws IOException {
final Credential credential = newFlow(userId).loadCredential(userId);
return new Gmail.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
.setApplicationName(APP_NAME)
.build();
}
这基本上应该让我离线访问用户的邮箱,允许我稍后在 cron 中处理给定的消息。
只要userId
一切"me"
似乎都正常。但是,在 cron 作业阶段应该在没有用户实际向 WebApp 发出请求的情况下进行修改,所以我不能使用"me"
但必须使用用户 ID。因此,我在请求阶段开始使用UserServiceFactory.getUserService().getCurrentUser().getUserId()
asuserId
并将此 ID 与 cron 作业数据一起存储。
这样做时,我不断收到错误,例如
com.google.api.client.googleapis.json.GoogleJsonResponseException: 403
{
"code" : 403,
"errors" : [ {
"domain" : "global",
"message" : "Delegation denied for email@domain.com",
"reason" : "forbidden"
} ],
"message" : "Delegation denied for email@domain.com"
}
我不确定哪一部分不正确,“委托”显然似乎凭证有问题,但委托似乎与 Google Apps 完全相关?有人能指出我正确的方向吗?