gpt4 book ai didi

java - 当我尝试通过我的 Google Suite 帐户发送电子邮件时,Gmail API 返回 failedPrecondition 错误

转载 作者:太空宇宙 更新时间:2023-11-04 10:39:45 26 4
gpt4 key购买 nike

我的组织有一个 GSuite 帐户。我想在我的 Java 应用程序中使用 Gmail API 发送邮件,但我不想使用 Oauth2 身份验证。我按照此文档将权限委托(delegate)给服务帐户 https://developers.google.com/identity/protocols/OAuth2ServiceAccount#delegatingauthority .

我按照以下步骤操作:

  • 配置新帐户服务
  • 在开发控制台中激活 Gmail API
  • 在我的客户端 ID 和 API 之间关联权限

下面是我的能够初始化 Gmail 服务的 Kotlin 代码(该代码与 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消息已发送

你能帮我吗?

最佳答案

使用Gmail API requires OAuth2 authorization ,甚至service accounts uses Oauth2.0 :

All requests to the Gmail API must be authorized by an authenticated user. Gmail uses the OAuth 2.0 protocol for authenticating a Google account and authorizing access to user data. You can also use Google+ Sign-in to provide a "sign-in with Google" authentication method for your app.

简而言之,你需要使用OAuth2.0。您可以在这个SO post中查看服务帐户的实现情况.

关于java - 当我尝试通过我的 Google Suite 帐户发送电子邮件时,Gmail API 返回 failedPrecondition 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49117902/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com