Gmail api Gmail API:Scope Gmail_只读工作,但不支持Gmail_修改。为什么呢?

Gmail api Gmail API:Scope Gmail_只读工作,但不支持Gmail_修改。为什么呢?,gmail-api,Gmail Api,我试图通过实现服务器到服务器的身份验证来修改消息的标签,因此我需要GMAIL_modify的作用域,它将允许我执行其他读/写操作。当我实现此更改时,只要尝试第一个请求,就会得到一个NullPointerException 为了简单起见,我使用了一个简单的代码来列出gmail帐户中的线程 我确实在我帐户的开发者控制台上设置了一个项目,以及所有的jazz 以下是我的Java代码: public static void main (String [] args) throws IOExceptio

我试图通过实现服务器到服务器的身份验证来修改消息的标签,因此我需要GMAIL_modify的作用域,它将允许我执行其他读/写操作。当我实现此更改时,只要尝试第一个请求,就会得到一个NullPointerException

为了简单起见,我使用了一个简单的代码来列出gmail帐户中的线程

我确实在我帐户的开发者控制台上设置了一个项目,以及所有的jazz

以下是我的Java代码:

  public static void main (String [] args) throws IOException {

      Collection<String> scopesArray = new ArrayList<String>();
      scopesArray.add(GmailScopes.GMAIL_MODIFY);
      //scopesArray.add(GmailScopes.GMAIL_READONLY);
      {

          try {
              httpTransport = GoogleNetHttpTransport.newTrustedTransport();
              credential = new GoogleCredential.Builder()
              .setTransport(httpTransport)
              .setJsonFactory(JSON_FACTORY)
              .setServiceAccountId(email_address)
              .setServiceAccountPrivateKeyFromP12File(new File("myfile.p12"))
              .setServiceAccountScopes(scopesArray)
              .setServiceAccountUser(USER)
              .build();
          }
          catch (IOException | GeneralSecurityException e)
          {
              throw new RuntimeException(e);
          }

      }


    // Create a new authorized Gmail API client
    Gmail service = new Gmail.Builder(httpTransport, JSON_FACTORY, credential)
        .setApplicationName(APP_NAME).build();

    try {

        ListThreadsResponse threadsResponse = service.users().threads().list(USER).execute();
        List<com.google.api.services.gmail.model.Thread> threads = threadsResponse.getThreads();
        for (com.google.api.services.gmail.model.Thread thread : threads) {
          System.out.println("Thread ID: " + thread.getId());
        }


    } catch (GoogleJsonResponseException e) {
        GoogleJsonError error = e.getDetails();
        System.err.println("Error code:  "+ error.getCode());
        System.err.println("Error message: " + error.getMessage());
    } catch (HttpResponseException e) {
        // No Json body was returned by the API.
        System.err.println("HTTP Status code: "+ e.getStatusCode());
        System.err.println("HTTP Reason: " + e.getMessage());
    } catch (IOException e) {
        e.printStackTrace();
    }
这将返回: 线程主java.lang.NullPointerException中出现异常 位于com.google.api.client.repackaged.com.google.common.base.premissions.checknotnullpremissions.java:191 在com.google.api.client.util.premissions.CheckNotNullPremissions.java:127 在com.google.api.client.json.jackson2.JacksonFactory.createJsonParserJacksonFactory.java:96 在com.google.api.client.json.JsonObjectParser.parseAndCloseJsonObjectParser.java:85 在com.google.api.client.json.JsonObjectParser.parseAndCloseJsonObjectParser.java:81 位于com.google.api.client.auth.oauth2.TokenResponseException.fromTokenResponseException.java:88 在com.google.api.client.auth.oauth2.TokenRequest.executeUnparsedTokenRequest.java:287 位于com.google.api.client.auth.oauth2.TokenRequest.executeTokenRequest.java:307 位于com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshTokenGoogleCredential.java:268 位于com.google.api.client.auth.oauth2.Credential.refreshTokenCredential.java:489 位于com.google.api.client.auth.oauth2.Credential.interceptCredential.java:217 位于com.google.api.client.http.HttpRequest.executeHttpRequest.java:859 位于com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsedAbstractGoogleClientRequest.java:410 位于com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsedAbstractGoogleClientRequest.java:343 位于com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeAbstractGoogleClientRequest.java:460 位于core.crescent.gmail.GmailApiQuickstart.mainGmailApiQuickstart.java:228

当我使用范围GMAIL_只读范围时,它可以工作。即使根据GMAIL API文档,它应该可以工作,但为什么它不能与scope modify一起工作呢


谢谢

是的,我也经历过同样的问题。我还需要创建一个服务帐户,可以访问我的@gmail.com帐户,阅读电子邮件,然后删除并添加标签。这应该很简单,但应用范围修改将导致错误。我试着调低最新的1.20版本,但除了显示的错误之外,没有任何区别。它现在显示401身份验证错误,而不是看到premissions.checknotnullpremissions.java:191。这让我觉得服务器端不允许@gmail.com帐户修改服务帐户范围


所以我从另一个方向尝试了一些东西,我有自己的gmail托管域,所以通过GoogleAPI控制台,我重新创建了api、Access、p12等等。。。给了它Gmail.api访问权限,果然,我得到了同样的错误:401。在我的gmail Manage this Domain中,在security advance options>Manage API client access下,我将服务帐户电子邮件放在“读取”和“修改”两个范围内。它仍然不起作用。最后,在“安全性”>“高级选项”>“管理此域的OAuth密钥和机密”下的另一个设置中,我启用了双腿OAuth访问控制,并且Youreka成功了!。我的服务帐户现在正在添加和删除标签:

@Michael Taylor的帖子让我走上了正确的轨道

确保此处列出了您的客户端ID和作用域:

我在这里找到了相关说明这是一个Ruby客户端,但仍然相关:

这就是我在scopes中输入的内容,以使其发挥作用:
https://www.googleapis.com/auth/gmail,https://www.googleapis.com/auth/gmail.modify,https://www.googleapis.com/auth/gmail.readonly

查看此链接谢谢您的回复。我描述的问题更多的是关于用户帐户的读/写权限,而不是身份验证。我在Google开发者控制台上,没有看到任何这些链接/选项。我也没有谷歌应用托管的域名。您知道有没有启用两条腿的OAuth表单开发人员控制台?谢谢你的回复,这给了我一些希望