我有一个受 SSL 保护的 jetty Web 服务器,其任务是代表用户读取/发送电子邮件。对于阅读,首选 pub/sub,而不是 pull。已按照 developers.google.com
中的步骤操作现在剩下要做的就是使用 java 客户端库来利用服务帐户凭据并代表用户与 gmail api 进行对话(已从用户那里收集了该主题的身份验证和刷新令牌)
已尝试的步骤。
使用下载的私钥(p12)尝试创建凭证并用于检索邮件标签的示例
HttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
String serviceAccount = "[email protected]";
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 所需的所有密钥文件。
如果我遗漏了什么,请告诉我。
最初,我在 Web 应用程序中使用 OAuth 2.0 客户端 ID 从特定 Gmail 帐户获取消息。然后我意识到我的应用程序根本不需要同意提示,就在那时我偶然发现了谷歌服务帐户,它消除了同意提示和授权令牌的存储。我确实尝试了上面发布的完全相同的代码,并发现了发布的完全相同的响应
"message" : "Bad Request", "reason" : "failedPrecondition"
。
为了解决此问题,添加了
.setServiceAccountUser(googleServiceAccountUser)
,其中 googleServiceAccountUser 设置为我的应用程序尝试从中读取消息的 Google 电子邮件 ID ([电子邮件受保护])。在您的代码片段中,缺少调用“.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;
}
我看过一篇非常好的文章,其中所有内容都用 java 示例代码进行了解释。 链接