использовать Gmail API для отправки электронной почты из собственной учетной записи, не запрашивая согласия пользователя - PullRequest
0 голосов
/ 19 января 2019

У меня есть весеннее веб-приложение, и я хочу иметь возможность отправлять электронную почту из своего приложения. У меня было рабочее решение с 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");

}
...