Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Gmail API设置服务帐户并代表用户阅读/发送邮件_Java_Webserver_Gmail Api_Google Api Java Client - Fatal编程技术网

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

Java Gmail API设置服务帐户并代表用户阅读/发送邮件,java,webserver,gmail-api,google-api-java-client,Java,Webserver,Gmail Api,Google Api Java Client,我有一个SSL安全的jetty web服务器,其任务是代表用户读取/发送电子邮件。阅读时,最好使用pub/sub,而不是pull。已从中遵循这些步骤 在控制台中创建了一个项目,启用了Gmail api,使用google apps创建了服务帐户,域范围的授权下载了json和p12私钥 通过选择web应用程序创建OAuth客户端id,并为其命名,并将授权重定向URI添加到web服务器api端点之一 使用控制台api授予主题的发布权限 在发布订阅中创建主题并使用HTTPs端点订阅。使用控制台API手动

我有一个SSL安全的jetty web服务器,其任务是代表用户读取/发送电子邮件。阅读时,最好使用pub/sub,而不是pull。已从中遵循这些步骤

  • 在控制台中创建了一个项目,启用了Gmail api,使用google apps创建了服务帐户,域范围的授权下载了json和p12私钥
  • 通过选择web应用程序创建OAuth客户端id,并为其命名,并将授权重定向URI添加到web服务器api端点之一
  • 使用控制台api授予主题的发布权限
  • 在发布订阅中创建主题并使用HTTPs端点订阅。使用控制台API手动检查以发布消息并成功接收
  • 现在剩下要做的就是使用java客户端库来利用服务帐户凭据,并代表用户与gmail api对话(已经从用户那里收集了主题的身份验证和刷新令牌)

    尝试过的步骤

  • 使用下载的私钥(第12页)尝试创建凭据并检索邮件标签示例

    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所需的所有关键文件


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

    起初,我使用OAuth 2.0客户端ID为我的web应用程序从特定的gmail帐户获取消息。然后我意识到,我的应用程序根本不需要同意提示,就在那时,我偶然发现谷歌服务帐户取消了同意提示和授权令牌的存储。我确实尝试了上面发布的代码,并得到了与之完全相同的回复。
    “消息”:“错误的请求”,“原因”:“失败的前提条件”

    为解决此问题,添加了
    .setServiceAccountUser(googleServiceAccountUser)
    ,其中googleServiceAccountUser设置为我的google电子邮件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;
    }
    

    您是否有任何方法记录最终请求的外观?:)这将是有益的。例如,方法、url和标题。您是否解决了此问题?如何代表用户发送?是,使用GoogleCredential.getApplicationDefault()发送