3

我正在尝试使用 Gmail API 获取邮箱的代表。我的应用程序在 Google App-engine 上运行,并具有使用电子邮件设置 API 添加、删除、获取代表的功能。现在我计划将这些功能迁移到 Gmail API,因为电子邮件设置 API 将被弃用。

技术方面,我正在使用 Java 语言。我已按照 Gmail API文档提供的所有步骤进行操作。对 Gmail API 的身份验证成功。但是当我试图让代表时,它给出了以下错误-

404 Not Found { "code" : 404, "errors" : [ { "domain" : "global", "message" : "Invalid delegate", "reason" : "notFound" } ], "message" : "Invalid delegate " }

下面的控制台内部是错误 -

*com.google.api.client.googleapis.json.GoogleJsonResponseException: 404 Not Found { "code" : 404, "errors" : [ { "domain" : "global", "message" : "Invalid delegate", "reason " : "notFound" } ], "message" : "无效委托" }

在 com.google.api.client.googleapis.json.GoogleJsonResponseException.from (GoogleJsonResponseException.java:150) 在 com.google.api.client.googleapis.services.json.AbstractGoogleJsonClie ntRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)在 com.google.api.client.googleapis.services.json.AbstractGoogleJsonClie ntRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40) 在 com.google.api.client.googleapis.services.AbstractGoogleClientRequest $1.interceptResponse(AbstractGoogleClientRequest.java:321)在 com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1067) 在 com.google.api.client.googleapis.services.AbstractGoogleClientRequest .executeUnparsed(AbstractGoogleClientRequest.java:419) 在 com.google.api .client.googleapis.services。AbstractGoogleClientRequest .executeUnparsed(AbstractGoogleClientRequest.java:352) 在 com.google.api.client.googleapis.services.AbstractGoogleClientRequest .execute(AbstractGoogleClientRequest.java:469) 在 com.aeegle.services.GmailService.retrieveEmailDelegates(GmailService.java:106) ActionInvoker.invoke(ActionInvoker.java:161) at play.server.PlayHandler$NettyInvocation.execute(PlayHandler.java:255) at play.Invoker$Invocation.run(Invoker.java:278) at play.server.PlayHandler$NettyInvocation .run(PlayHandler.java:233) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:51 1) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util .concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask。在 java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask 访问 $201(ScheduledThreadPoolExecutor.java:180)。在 java.util.concurrent.ThreadPoolExecutor$Worker 的 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 处运行 (ScheduledThreadPoolExecutor.java:293)。

您可以观察到 GmailService 行号 106 有问题。现在我要发布我的java代码。

1: -验证码 -

  public Gmail getGmailService(String email) throws Exception {
        System.out.println("-------------getGmailService");

        HttpTransport httpTransport = new NetHttpTransport();
        JacksonFactory jsonFactory = new JacksonFactory();
        Collection<String> SCOPES = new ArrayList<String>();
        SCOPES.add(GmailScopes.GMAIL_SETTINGS_BASIC);
        SCOPES.add(GmailScopes.MAIL_GOOGLE_COM);
        SCOPES.add(GmailScopes.GMAIL_MODIFY);
        SCOPES.add(GmailScopes.GMAIL_READONLY);
        GoogleCredential credential;
        // To load classpath resources.
        ClassLoader classLoader = getClass().getClassLoader();  
        new File(SERVICE_ACCOUNT_PKCS12_FILE_PATH);
        credential = new GoogleCredential.Builder().setTransport(httpTransport).setJsonFactory(jsonFactory)
                .setServiceAccountId(SERVICE_ACCOUNT_EMAIL).setServiceAccountUser(email).setServiceAccountScopes(SCOPES)
                .setServiceAccountPrivateKeyFromP12File(new File(SERVICE_ACCOUNT_PKCS12_FILE_PATH)).build();
        System.out.println("----calling Builder");
        service = new Gmail.Builder(httpTransport, jsonFactory, null).setHttpRequestInitializer(credential)
                .setApplicationName(APPLICATION_NAME).build();

        return service;

    }

2:-接下来尝试使用服务对象获取邮箱的代表-

public Delegate retrieveEmailDelegates(String user, Gmail service) throws Exception {
        if (isBlankOrNullString(user)) {
            throw new IllegalArgumentException();
        }
        Delegate delegatesResponse=null;
        try {

            System.out.println("Call retrieveEmailDelegates for "+user);
             delegatesResponse = service.users().settings().delegates().get(user, "me").execute();
            System.out.println("-------service" + delegatesResponse.getDelegateEmail());

        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }
        return delegatesResponse;
    }

请帮助我,因为我仍在我的 localhost 机器上运行它。

4

2 回答 2

1

如果您想访问其他用户的电子邮件帐户,您必须打开邮件延迟,以允许代理人代表他们阅读、发送和删除:

  1. 登录您的Google 管理控制台

    注意: 使用您的管理员帐户登录(不以@gmail.com 结尾)。

  2. 在管理控制台首页,转到应用> Gsuite > Gmail >用户设置

  3. 在邮件委托旁边,选择让用户将其邮箱的访问权限委托给域中的其他用户
  4. (可选)选择包含您要为其启用邮件委派的用户的每个组织,然后选中邮件委派框。
  5. 单击保存

启用后,任何想要指派代表访问其电子邮件的用户都必须在其 Gmail 帐户中设置邮件委托。

于 2018-09-12T08:11:36.183 回答
1

免责声明:我在 Gmail 和 Gmail API 平台上工作。

看起来您正在尝试获取一个帐户的所有代表的列表service.users().settings().delegates().list(),因此您必须使用而不是service.users().settings().delegates().get().

请注意,这将需要对您的代码进行进一步更改,以处理返回的ListDelegatesResponse.

顺便说一句,您收到"Invalid delegate"错误是因为service.users().settings().delegates().get(user, "me")正在提供me您尝试检索的代表的电子邮件。您需要提供有效的电子邮件地址才能使请求成功。但是,我意识到这很可能是由于您错误地使用了Get委托方法而不是List委托方法。

于 2018-09-12T15:15:24.693 回答