Gmail API代表用户设置服务帐户和阅读/发送邮件

时间:2016-02-04 17:00:13

标签: java webserver gmail-api google-api-java-client

我有一个SSL安全码头网络服务器,其任务是代表用户阅读/发送电子邮件。对于阅读pub / sub是首选,而不是拉。从developers.google.com

开始执行这些步骤
  1. 在控制台中创建了一个项目,启用了Gmail api,创建了服务帐户,谷歌应用程序域范围内的委托下载了json和p12私钥
  2. 通过选择Web应用程序创建OAuth cliend-id为其命名,并将授权重定向URI添加到其中一个Web服务器api端点
  3. 使用console api
  4. 授予对该主题的发布权限
  5. 在pub-sub中创建主题并使用HTTPs端点订阅。使用控制台API手动检查以发布消息并成功收到
  6. 现在剩下要做的就是使用java客户端库来利用服务帐户凭据并代表用户与gmail api交谈(已经从用户那里收集了主题的auth&刷新令牌)

    尝试了一些步骤。

    1. 使用下载的私钥(p12)尝试创建凭据并检索邮件标签的样本

      HttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
      JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();    
      String serviceAccount = "service-account@myproject.iam.gserviceaccount.com";
      Credential credential = GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)    
      .setJsonFactory(JSON_FACTORY)
      .setServiceAccountId(serviceAccount)
      .setServiceAccountPrivateKeyFromP12File(new File("/path-to-key-file.p12"))
      .setServiceAccountScopes(Collections.singleton(GmailScopes.GMAIL_LABELS))
      .build();
      Gmail service = new Gmail.Builder(HTTP_TRANSPORT, JSON_FACTORY, cred).setApplicationName("web-application-name-created-via-console").build();
      String user = "me"; //Tried direct email id also  
      service.users().labels().list(user).execute();
      
    2. 响应,

      {
        "code" : 400,
        "errors" : [ {
          "domain" : "global",
          "message" : "Bad Request",
          "reason" : "failedPrecondition"
        } ],
        "message" : "Bad Request"
      }
      

      注意:编码部分在本地服务器中尝试,而不是具有SSL的编码部分。我想这应该不是问题,因为我拥有访问api所需的所有密钥文件。

      如果我错过了什么,请告诉我。

1 个答案:

答案 0 :(得分:0)

最初,我使用我的Web应用程序的OAuth 2.0客户端ID来获取来自特定Gmail帐户的邮件。然后我意识到我的应用程序根本不需要同意提示,而且当我偶然发现谷歌服务帐户消除了同意提示和存储授权令牌时。我确实尝试了上面发布的相同代码,并点击了"message" : "Bad Request", "reason" : "failedPrecondition"发布的完全相同的响应。

要解决此问题,请添加.setServiceAccountUser(googleServiceAccountUser),其中googleServiceAccountUser设置为我的应用程序尝试阅读邮件的谷歌电子邮件ID(xxx@gmail.com)。在您提供的代码段中,缺少调用“.setServiceAccountUser()”,添加它可能会帮助您解决问题。

private static Credential authorize() throws Exception {

  GoogleCredential credential = new GoogleCredential.Builder()
  .setTransport(httpTransport)
  .setJsonFactory(JSON_FACTORY)
  .setServiceAccountId(googleServiceAccountId)
  .setServiceAccountPrivateKeyFromP12File(new File(privatekeyFile))
  .setServiceAccountScopes(Collections.singleton(GmailScopes.MAIL_GOOGLE_COM))
  .setServiceAccountUser(googleServiceAccountUser)
  .build();

  return credential;
}