Java Gmail API设置服务帐户并代表用户阅读/发送邮件
我有一个SSL安全的jetty web服务器,其任务是代表用户读取/发送电子邮件。阅读时,最好使用pub/sub,而不是pull。已从中遵循这些步骤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手动
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()发送