通过 Google API 发送电子邮件 - 前提条件失败

问题描述 投票:0回答:1

我正在尝试使用我的 Google Workspace 帐号在我的

Spring Boot
应用程序中发送电子邮件。 我访问了 Google Cloud Console,然后我:

  1. 创建一个新项目并选择它(即
    APPLICATION_NAME_FROM_GOOGLE_CONSOLE
  2. 启用 Gmail API
  3. 创建了 OAuth 同意屏幕
  4. 导航到“凭据”并创建了一个新的“服务帐户凭据”,这给了我一个新电子邮件,我将其命名为
    EMAIL_ADDRESS_CREATED_WHEN_CREATING_THE_SERVICE_ACCOUNT

然后我有这段代码会导致 FAILED PRECONDITION 错误:

    // invoking code
    Gmail service = buildEmailService();
    Message message = createMessage(fromEmailAddress, toEmailAddress, subject, text);
    _sendMessage(service, message);


    private Gmail buildEmailService() throws MessagingException {
        GoogleCredentials credentials = null;
        try {
            String serviceAccountJson = "{\n" +
                    "  \"type\": \"service_account\",\n" +
                    "  \"project_id\": \"lybro-355514\",\n" +
                    "  \"private_key_id\.........." 
            ;

            InputStream targetStream = new ByteArrayInputStream(serviceAccountJson.getBytes());
            credentials = ServiceAccountCredentials.fromStream(targetStream)
                    .createScoped(Collections.singletonList(GmailScopes.GMAIL_SEND))
               .createDelegated(EMAIL_ADDRESS_CREATED_WHEN_CREATING_THE_SERVICE_ACCOUNT);

        } catch (IOException e) {
            e.printStackTrace();
            throw new MessagingException(e.getMessage());
        }
        HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials);

        Gmail service = new Gmail.Builder(new NetHttpTransport(),
                GsonFactory.getDefaultInstance(),
                requestInitializer)
                .setApplicationName(APPLICATION_NAME_FROM_GOOGLE_CONSOLE)
                .build();

        return service;
    }


    private void _sendMessage(Gmail service, Message message) throws MessagingException {
        try {
            // Create send message
            message = service.users().messages().send(EMAIL_ADDRESS_CREATED_WHEN_CREATING_THE_SERVICE_ACCOUNT, message).execute();
            System.out.println("Message id: " + message.getId());
            System.out.println(message.toPrettyString());
        } catch (GoogleJsonResponseException e) {
            // TODO(developer) - handle error appropriately
            GoogleJsonError error = e.getDetails();
            if (error != null && error.getCode() == 403) {
                System.err.println("Unable to send message: " + e.getDetails());
            } else {
                e.printStackTrace();
                throw new MessagingException(e.getMessage());
            }
        } catch (IOException e) {
            e.printStackTrace();
            throw new MessagingException(e.getMessage());
        }
    }

使用此代码,我收到以下错误:

javax.mail.MessagingException: 400 Bad Request POST https://gmail.googleapis.com/gmail/v1/users/[email protected]/messages/send {   "code": 400,   "errors": [
    {
      "domain": "global",
      "message": "Precondition check failed.",
      "reason": "failedPrecondition"
    }   ],   "message": "Precondition check failed.",   "status": "FAILED_PRECONDITION" }
java spring gmail-api google-workspace google-api-java-client
1个回答
2
投票
createDelegated(EMAIL_ADDRESS_CREATED_WHEN_CREATING_THE_SERVICE_ACCOUNT)

您应将此设置为的电子邮件是您已为其配置委派的工作区帐户上的用户的电子邮件。

createDelegated("[email protected]")

发送也应该由您域中的用户发送。您预先配置的服务帐户的工作方式是模拟您域中的用户。通过这种方式,服务帐户就可以假装是该用户。

如果您尚未阅读本文:执行 Google Workspace 域范围内的授权我强烈建议您这样做。

© www.soinside.com 2019 - 2024. All rights reserved.