在一个Web应用程序中访问多个GMail用户的电子邮件

时间:2014-11-18 22:55:38

标签: java google-app-engine gmail-api google-client

我正在尝试使用带有GMail API的Google API客户端在Google App Engine上修改多个用户的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()作为userId,并将此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完全相关?有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:2)

所以正确的方法是使用userId加载凭据,例如

final Gmail gmail = loadGmailClient('someuserIdFromAGMailUser');

但是在查询使用"me"时,GMail API会使用来自给定用户的凭据,但只能查询/修改他/她自己的数据:

final Message message = gmail.users().messages().get("me", mailId).execute();

似乎用户没有委托他/她自己的帐户,因此在这两种情况下使用userId都会出现委托被拒绝错误。