当前位置: 首页 > 知识库问答 >
问题:

Gmail API:作用域GMAIL_READONLY有效,但不能使用gmail_modify。这是为什么?

秦凯定
2023-03-14

我试图通过实现服务器到服务器的身份验证来修改消息的标签,因此我需要范围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();
    }

谢谢你

共有1个答案

谷梁浩思
2023-03-14

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

所以我尝试了另一个方向,我有我自己的gmail托管域,所以通过google api控制台,我重新创建了api,Access,p12等等。给它gmail.api访问权限,果然,我得到了同样的错误:401。在我的gmail“管理这个域”下,在安全“高级选项”>“管理API客户端访问”下,我把服务帐户电子邮件的两个范围读和修改。还是没起作用。最后,在“安全”>“高级选项”>“管理此域的OAuth密钥和机密”下,我启用了“两条腿的OAuth访问控制”,并且您可以使用它!我的服务帐户现在正在添加和删除标签:)

 类似资料:
  • 问题内容: 这是一个数据框: 我可以获取列基本上是从原来的列的元组使用: 但是,如果我想要一个值列表而不是它们的元组,那我就做不到,因为它不能满足我的期望: 相反,我需要这样做: 为什么我不能使用我想要的东西? 附录 一些可能的解决方法的时间安排: 问题答案: 罪魁祸首在这里。有了它就可以了,但是using在编译模块中引发了一个异常: 如您所见,它们捕获了异常,但不必费心去处理它。 即使没有太宽泛

  • 问题内容: 这是一个数据框: 我可以获取列基本上是从原来的列的元组df使用df.apply: 但是,如果我想要一个值列表而不是它们的元组,那我就做不到,因为它不能满足我的期望: 相反,我需要这样做: 为什么我不能使用df.apply(list, 1)我想要的东西? 附录 一些可能的解决方法的时间安排: 问题答案: 罪魁祸首在这里。有了它就可以了,但是在编译模块中引发了一个异常: 如您所见,它们捕获

  • 问题内容: 在这段代码中,当我使用 然后我的应用崩溃了,Logcat说 这是与此代码关联的XML文件 问题答案: 在这段代码中,当我使用TextView text =(TextView)getActivity()。findViewById(R.id.text1) 然后我的应用程序崩溃了,Logcat说这是由以下原因引起的:java.lang.NullPointerException:尝试在空对象引

  • 我正在尝试使用Linux中的命令行工具学习XPath查询(我正在学习斯坦福大学的Class2Go数据库入门课程)。给定一个包含书籍和杂志的书店的名为Bookstore Q. xml的XML文件,我可以在命令行运行以下查询: 它将返回以下结果: 如果在命令行使用xmllint,我会得到相同的结果,如下所示: 但是,如果我尝试使用与Saxon示例中相同的精确XPath查询,则会出现如下错误: 为什么?

  • 问题内容: 我正在为Python学习win32com,但遇到了一个奇怪的问题。 我正在尝试在词典列表中导出Outlook联系人。我的代码与win32com.client.Dispatch(“ Outlook.Application)完美配合。但是它与win32com.client.gencache.EnsureDispatch(” Outlook.Application)返回0个联系人,该联系人应

  • 问题内容: 这有效 并且以下不 任何想法为什么,以及如何解决? 相同的东西在所有其他浏览器上都可以正常工作,但在IE上却不行。当然,只有IE9支持它。旧版本不。 问题答案: 该属性中的破折号(’-‘)不适用于脚本编写。您应该改用。 顺便说一句:尽管许多浏览器 确实 从脚本中理解并解析了诸如style [‘background-color’]之类的CSS,但afaik Firefox却无法。此外,我