У меня есть весеннее веб-приложение, и я хочу иметь возможность отправлять электронную почту из своего приложения. У меня было рабочее решение с javax.mail
Однако из-за изменений безопасности, внесенных Google, я должен либо использовать OAuth2, либо разрешить менее безопасным приложениям использовать учетную запись электронной почты, которую я использую для отправки электронных писем.
Я попытался использовать первый вариант, и он у меня работает, но меня просят дать согласие при первой отправке электронного письма.
Я не уверен, можно ли попросить пользователя дать согласие в любое время в будущем. Есть ли способ обойти это, или я должен полностью использовать другой подход?
public void sendEmail(CustomerMessage customerMessage)
throws MessagingException, IOException, GeneralSecurityException {
String to = "myemail@xxx.com";
String from = "myemail@xxx.com";
MimeMessage mimeMessage = createEmail(to, from, customerMessage.getName(), customerMessage.toFormatedString());
Message message = createMessageWithEmail(mimeMessage);
sendMessage(getGmailService(), from, message);
}
private Gmail getGmailService() throws GeneralSecurityException, IOException {
final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
Gmail service = new Gmail.Builder(HTTP_TRANSPORT, JacksonFactory.getDefaultInstance(),
getCredentials(HTTP_TRANSPORT)).setApplicationName(APPLICATION_NAME).build();
return service;
}
/**
* Creates an authorized Credential object.
*
* @param HTTP_TRANSPORT
* The network HTTP Transport.
* @return An authorized Credential object.
* @throws IOException
* If the credentials.json file cannot be found.
*/
private Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {
// Load client secrets.
InputStream in = GmailService.class.getResourceAsStream(CREDENTIALS_FILE_PATH);
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
// Build flow and trigger user authorization request.
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY,
clientSecrets, SCOPES)
.setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
.setAccessType("offline").build();
LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build();
return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
}