我的组织有一个GSuite帐户。我想使用Gmail API在我的Java应用程序中发送邮件,但我不想使用Oauth2身份验证。我按照此文档将权限委派给服务帐户https://developers.google.com/identity/protocols/OAuth2ServiceAccount#delegatingauthority。
我按照以下步骤操作:
我的Kotlin代码能够初始化Gmail服务如下(代码在Java中相当)
@Configuration
class MixitApplication {
@Bean
fun jacksonFactory() = JacksonFactory.getDefaultInstance()
@Bean
fun dataStoreFactory() = MemoryDataStoreFactory.getDefaultInstance()
@Bean
fun httpTransport() = GoogleNetHttpTransport.newTrustedTransport()
@Bean
fun authorize(): Credential {
val jsonConfig = "{\n" +
" \"type\": \"service_account\",\n" +
" \"project_id\": \"mixit-EeAZEAZE\",\n" +
" \"private_key_id\": \"FAKE\",\n" +
" \"private_key\": \"-----BEGIN PRIVATE KEY-----\\FAKE\\n-----END PRIVATE KEY-----\\n\",\n" +
" \"client_email\": \"website@FAKE.iam.gserviceaccount.com\",\n" +
" \"client_id\": \"FAKE\",\n" +
" \"auth_uri\": \"https://accounts.google.com/o/oauth2/auth\",\n" +
" \"token_uri\": \"https://accounts.google.com/o/oauth2/token\",\n" +
" \"auth_provider_x509_cert_url\": \"https://www.googleapis.com/oauth2/v1/certs\",\n" +
" \"client_x509_cert_url\": \"https://www.googleapis.com/robot/v1/metadata/x509/website%40mixit-196820.iam.gserviceaccount.com\"\n" +
"}"
return GoogleCredential
.fromStream(jsonConfig.byteInputStream())
.createScoped(listOf(GmailScopes.GMAIL_SEND))
}
@Bean
fun gmailService() = Gmail.Builder(httpTransport(), jacksonFactory(), authorize()).build()
}
在我的服务中,当我尝试使用此代码结束电子邮件时
val result = gmailService.users().messages().send("me", emailMessage).execute();
我一直有这个错误
400 Bad Request { "code" : 400, "errors" : [ { "domain" : "global", "message" : "Bad Request", "reason" : "failedPrecondition" } ], "message" : "Bad Request" }
我发现了几篇关于类似问题的帖子。但通常是因为该帐户不是Gsuite帐户
我试图找到Google对此问题的支持,但目前我还没有解决方案。 Google API控制台上没有相关信息。我只是知道我的请求不好。
我发送邮件的电子邮件功能非常简单。 EmailMessage是一个自定义对象,包含电子邮件信息(对象,主题和内容)
fun send(email: EmailMessage) {
val session = Session.getDefaultInstance(Properties(), null)
val message = MimeMessage(session)
message.setFrom(InternetAddress("me"))
message.addRecipient(javax.mail.Message.RecipientType.TO, InternetAddress(email.to))
message.subject = email.subject
message.setContent(email.content, MediaType.TEXT_HTML_VALUE)
val buffer = ByteArrayOutputStream()
message.writeTo(buffer)
val emailMessage = Message()
emailMessage.encodeRaw(buffer.toByteArray())
val result = gmailService.users().messages().send("me", emailMessage).execute();
System.out.println(result.toPrettyString())
}
当我尝试通过测试API控制台https://developers.google.com/apis-explorer/?hl=en_GB#p/gmail/v1/gmail.users.messages.send发送此消息时,会发送消息
你能帮助我吗?
答案 0 :(得分:0)
使用Gmail API requires OAuth2 authorization,甚至是service accounts uses Oauth2.0:
对Gmail API的所有请求必须经过身份验证授权 用户。 Gmail使用OAuth 2.0协议对Google进行身份验证 帐户和授权访问用户数据。您也可以使用Google+ 登录即可与Google"登录认证方法 你的应用。
简而言之,您需要使用OAuth2.0。您可以在此SO post中查看服务帐户的实施情况。