我正在尝试使用我的 Google Workspace 帐号在我的
Spring Boot
应用程序中发送电子邮件。
我访问了 Google Cloud Console,然后我:
APPLICATION_NAME_FROM_GOOGLE_CONSOLE
)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" }
createDelegated(EMAIL_ADDRESS_CREATED_WHEN_CREATING_THE_SERVICE_ACCOUNT)
您应将此设置为的电子邮件是您已为其配置委派的工作区帐户上的用户的电子邮件。
createDelegated("[email protected]")
发送也应该由您域中的用户发送。您预先配置的服务帐户的工作方式是模拟您域中的用户。通过这种方式,服务帐户就可以假装是该用户。
如果您尚未阅读本文:执行 Google Workspace 域范围内的授权我强烈建议您这样做。