ACSSendMailTask.java

package com.sintia.ffl.admin.optique.catalogue.util.mail;

import com.azure.communication.email.EmailClient;
import com.azure.communication.email.models.EmailMessage;
import com.azure.communication.email.models.EmailSendResult;
import com.azure.core.util.polling.LongRunningOperationStatus;
import com.azure.core.util.polling.PollResponse;
import com.azure.core.util.polling.SyncPoller;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.util.Arrays;
import java.util.stream.Collectors;

/**
 * Envoi de mail via Azure Communication Services
 */
@Component
@Profile("!smtp")
@RequiredArgsConstructor
@Slf4j
public class ACSSendMailTask implements SendMailTask {

    private final EmailClient emailClient;

    @Override
    public void sendMail(String[] recipients, String[] cc, String subject, String body, String sendMailFrom) {

        // Éliminer les chaines vides
        String[] ccFiltered = new String[] {};
        if(cc != null) {
            ccFiltered = Arrays.stream(cc)
                    .map(String::trim)
                    .filter(StringUtils::hasText)
                    .collect(Collectors.toList())
                    .toArray(new String[]{});
        }

        EmailMessage emailMessage = new EmailMessage()
                .setSenderAddress(sendMailFrom)
                .setToRecipients(recipients)
                .setCcRecipients(ccFiltered)
                .setSubject(subject)
                .setBodyPlainText(body);

        try {
            SyncPoller<EmailSendResult, EmailSendResult> poller = this.emailClient.beginSend(emailMessage, null);
            PollResponse<EmailSendResult> result = poller.waitForCompletion();

            if(LongRunningOperationStatus.FAILED.equals(result.getStatus())){
                log.error("Échec d'envoi du mail : {}\n\n{}", subject, body);
            } else {
                log.info("Mail envoyé");
            }
        } catch(Exception ex){
            log.error("Échec d'envoi du mail : {}\n\n{}", subject, body, ex);
        }

    }

}