我正在尝试使用Gmail API获取邮箱的代表。 我的应用程序在Google App引擎上运行,并具有使用电子邮件设置API添加,删除,获取代表的功能。 现在,由于不推荐使用电子邮件设置API,因此我打算将这些功能迁移到Gmail API。
从技术角度来讲,我正在使用Java语言。 我已按照Gmail API documentation提供的所有步骤进行操作。对Gmail API的身份验证成功。但是,当我尝试获取代表时,会出现以下错误-
找不到404 { “代码”:404, “错误”:[{ “ domain”:“ global”, “ message”:“无效的代表”, “ reason”:“ notFound” }], “ message”:“无效的代表” }
下面的控制台内部是错误-
* com.google.api.client.googleapis.json.GoogleJsonResponseException:找不到404 { “代码”:404, “错误”:[{ “ domain”:“ global”, “ message”:“无效的代表”, “ reason”:“ notFound” }], “ message”:“无效的代表” }
在com.google.api.client.googleapis.json.GoogleJsonResponseException.fro m(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) 在com.aeegle.DAOImpl.EmailDAOImpl.getDelegatesGmail(EmailDAOImpl.java:1 43) 在controllers.DelegateController.getListDelegatesGmail(DelegateControll er.java:82) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl。 Java:62) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces sorImpl.java:43) 在java.lang.reflect.Method.invoke(Method.java:498) 在play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:557) 在play.mvc.ActionInvoker.invoke(ActionInvoker.java:508) 在play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:484) 在play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:479) 在play.mvc.ActionInvoker.invoke(ActionInvoker.java:161) 在play.server.PlayHandler $ NettyInvocation.execute(PlayHandler.java:255) 在玩.Invoker $ Invocation.run(Invoker.java:278) 在play.server.PlayHandler $ NettyInvocation.run(PlayHandler.java:233) 在java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:51 1) 在java.util.concurrent.FutureTask.run(FutureTask.java:266) 在java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask中。 access $ 201(ScheduledThreadPoolExecutor.java:180) 在java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask中。 运行(ScheduledThreadPoolExecutor.java:293) 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor。 Java:1149) 在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor .java:624) 在java.lang.Thread.run(Thread.java:748)*
您可以看到Gmail服务第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;
}
请帮助我,因为我仍在本地计算机上运行它。
答案 0 :(得分:1)
如果您要访问其他用户的电子邮件帐户,则必须打开允许代理代表读取,发送和删除的邮件延迟:
登录 到您的Google Admin console。
注意:使用您的管理员帐户登录(不以结束 @ gmail.com)。
从管理控制台主页上,转到应用> Gsuite > Gmail > 用户设置。
启用后,任何想要分配代表访问其电子邮件的用户都必须set up on mail delegation在其Gmail帐户中。
答案 1 :(得分: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
委托方法。