Использование javax.mail с Microsoft OAuth

Поскольку Microsoft объявила, что собирается отказаться от аутентификации по паролю для своих SMTP-сервисов. Я пытаюсь заменить аутентификацию пароля наjavax.mailс OAuth. Однако я получаю исключение с сообщением535 5.7.3 Authentication unsuccessful [MN2PR04CA0023.namprd04.prod.outlook.com].

Мой фрагмент кода выглядит сейчас так:

      /**
 * Class for sending email notifications.
 */
public class MailClient {
    /**
     * Send email (SMTP)
     *  
     * @param params            Runtime Parameters
     * @param durationString    Formatted duration
     * @param endTime           Time at which the task completed
     * @param totalJournals     Number of Journals read
     * @param totalLines        Number of Journal Lines Written
     * @param outputFileStored  Was output file stored?
     * @param refFileStored     Was Org Ref file stored?
     * @param checkpointStored  Was timestamp checkpoint stored?
     * @param errorFile         Location of error file (null if no errors)
     * @throws Exception
     */
    public static void send(ArgParse params, String durationString, ZonedDateTime endTime, int totalJournals, 
        int totalLines, Boolean outputFileStored, Boolean refFileStored, Boolean checkpointStored, String errorFile)
            throws Exception {
        Properties properties = System.getProperties();
        properties.setProperty("mail.smtp.host", params.smtpHost);
        //properties.setProperty("mail.smtp.auth", "true");
        properties.setProperty("mail.smtp.starttls.enable", "true");
        properties.setProperty("mail.smtp.ssl.protocols", "TLSv1.2");
        properties.setProperty("mail.smtp.port", Integer.toString(params.smtpPort));

        // Old password auth
        /*Session session = Session.getDefaultInstance(properties, new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(params.smtpUsername, params.smtpPassword);
            }
        });*/

        Session session = Session.getDefaultInstance(properties);

        Multipart multipart = new MimeMultipart();
        MimeMessage message = new MimeMessage(session);
        MimeBodyPart messageBodyPart;
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String endTimeString = endTime.format(formatter), endDateString = endTimeString.split("T")[0];
        String subject = "secure: Journal-DataWarehouse run [" + endDateString + "]", body = "<html>";

        message.setFrom(new InternetAddress(params.mailFrom));

        for(int i = 0; i < params.mailTo.length; i++)
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(params.mailTo[i]));

        message.addHeader("Date", endTime.format(DateTimeFormatter.RFC_1123_DATE_TIME));
        message.setSubject(subject);
        
        if(errorFile != null) {
            messageBodyPart = new MimeBodyPart();
            DataSource source = new FileDataSource(errorFile);
            messageBodyPart.setDataHandler(new DataHandler(source));
            messageBodyPart.setFileName("error_logs.txt");
            multipart.addBodyPart(messageBodyPart);
            body += "<p style=\"font-family:monospace,garamond,serif;\"><b>WARNING: Program completed with errors, error_logs.txt attached.</b></p>";
        }
        
        body += "asOfEntryDateTime (Query Parameter): " + params.asOfEntryDateTime + "<br /></p>";
        body += "</html>";

        messageBodyPart = new MimeBodyPart();
        messageBodyPart.setContent(body, "text/html");
        multipart.addBodyPart(messageBodyPart);
        message.setContent(multipart);
        
        // Fetch OAuth token and send message. (New code)

        MicrosoftAuth auth = new MicrosoftAuth();
        String authToken = auth.getAccessToken();

        SMTPTransport transport = new SMTPTransport(session, null);
        transport.connect(params.smtpHost, params.username, null);
        transport.issueCommand("AUTH XOAUTH2 " + new String(BASE64EncoderStream.encode(String.format("user=%s\1auth=Bearer %s\1\1", params.username, authToken).getBytes())), 235);
        transport.sendMessage(message, message.getAllRecipients());
        transport.close();
    }

The MicrosoftAuthкласс используетmsal4j.ConfidentialClientApplicationдля получения токена аутентификации с использованием идентификатора клиента и секрета клиента.

0 ответов

Другие вопросы по тегам