【问题标题】:Gmail API setting up service account and reading/sending mails on behalf of userGmail API 设置服务帐户并代表用户阅读/发送邮件
【发布时间】:2016-05-14 10:05:22
【问题描述】:

我有一个 SSL 安全的码头网络服务器,其任务是代表用户阅读/发送电子邮件。阅读 pub/sub 是首选,而不是 pull。已从developers.google.com 执行这些步骤

  1. 在控制台中创建了一个项目,启用了 Gmail api,使用谷歌应用程序域范围委托创建了服务帐户,下载了 json 和 p12 私钥
  2. 通过选择 Web 应用程序创建 OAuth 客户端 ID 并为其命名,并将授权的重定向 URI 添加到 Web 服务器 api 端点之一
  3. 使用控制台 api 授予主题的发布权
  4. 在 pub-sub 中创建主题并使用 HTTPs 端点订阅。使用控制台 API 手动检查发布消息并成功接收

现在剩下要做的就是使用 java 客户端库来利用服务帐户凭据并代表用户与 gmail api 交谈(已从用户那里收集了该主题的身份验证和刷新令牌)

已尝试的步骤。

  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();
    

响应,

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

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

如果我遗漏了什么,请告诉我。

【问题讨论】:

  • 您有什么方法可以记录最终请求的外观吗? :) 那会很有用。例如。方法,网址和标题。
  • 您解决了吗?您如何代表用户发送信息?
  • 是的,使用 GoogleCredential.getApplicationDefault()

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


【解决方案1】:

最初,我使用我的 Web 应用程序的 OAuth 2.0 客户端 ID 从特定的 gmail 帐户获取消息。然后我意识到我的应用程序根本不需要同意提示,那时我偶然发现了谷歌服务帐户,它消除了同意提示和授权令牌的存储。我确实尝试了上面发布的完全相同的代码,并得到了与"message" : "Bad Request", "reason" : "failedPrecondition" 完全相同的回复。

为解决此问题,添加了 .setServiceAccountUser(googleServiceAccountUser),其中 googleServiceAccountUser 设置为我的应用程序尝试从中读取消息的 Google 电子邮件 ID (xxx@gmail.com)。在您的代码 sn-p 中,如果缺少调用“.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;
}

【讨论】:

    猜你喜欢
    • 2021-03-15
    • 2020-09-30
    • 2021-06-04
    • 1970-01-01
    • 2016-01-18
    • 2016-03-15
    • 2021-10-22
    • 1970-01-01
    • 2014-09-13
    相关资源
    最近更新 更多