【问题标题】:Gmail API returns failedPrecondition error when I try to send an email via my Google Suite Account当我尝试通过我的 Google 套件帐户发送电子邮件时,Gmail API 返回 failedPrecondition 错误
【发布时间】:2018-08-13 13:08:28
【问题描述】:

我的组织有一个 GSuite 帐户。我想使用 Gmail API 在我的 Java 应用程序中发送邮件,但我不想使用 Oauth2 身份验证。我按照此文档将权限委派给服务帐户 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 发送消息

你能帮帮我吗?

【问题讨论】:

    标签: java kotlin gmail-api


    【解决方案1】:

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

    对 Gmail API 的所有请求都必须由经过身份验证的人授权 用户。 Gmail 使用 OAuth 2.0 协议对 Google 进行身份验证 帐户和授权访问用户数据。您还可以使用 Google+ 登录以提供“使用 Google 登录”身份验证方法 你的应用程序。

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

    【讨论】:

    • 感谢您的链接。我遵循了不同的步骤,但新错误现在是 com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request { "error" : "invalid_grant", "error_description" : "Invalid JWT Signature." }
    猜你喜欢
    • 1970-01-01
    • 2021-10-14
    • 2016-06-09
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 2018-07-21
    相关资源
    最近更新 更多