All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.threewks.spring.gmail.DivertingMailInterceptor Maven / Gradle / Ivy

The newest version!
package com.threewks.spring.gmail;

import javax.mail.Address;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.LinkedHashSet;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

@SuppressWarnings("OptionalUsedAsFieldOrParameterType")
public class DivertingMailInterceptor implements MimeMessageInterceptor {
    private final Set divertEmailsTo;
    private Optional subjectPrefix = Optional.empty();

    public DivertingMailInterceptor(String... divertEmailsTo) {
        this.divertEmailsTo = Stream.of(divertEmailsTo)
                .map(this::toEmailPortionOnly)
                .collect(Collectors.toCollection(LinkedHashSet::new));
    }

    @Override
    public MimeMessage apply(MimeMessage original) {
        if (divertEmailsTo.isEmpty()) {
            return original;
        }

        try {
            rewriteRecipients(original, Message.RecipientType.TO);
            rewriteRecipients(original, Message.RecipientType.CC);
            rewriteRecipients(original, Message.RecipientType.BCC);

            if (subjectPrefix.isPresent()) {
                String originalSubject = Optional.ofNullable(original.getSubject()).orElse("");
                original.setSubject(String.format("%s: %s", subjectPrefix.get(), originalSubject));
            }

            return original;
        } catch (MessagingException e) {
            throw new MessagingRuntimeException("Error diverting email message", e);
        }

    }

    public DivertingMailInterceptor setSubjectPrefix(String subjectPrefix) {
        this.subjectPrefix = Optional.ofNullable(subjectPrefix);
        return this;
    }

    private void rewriteRecipients(MimeMessage message, Message.RecipientType recipientType) throws MessagingException {
        Address[] addresses = Optional.ofNullable(message.getRecipients(recipientType)).orElse(new Address[0]);

        if (addresses.length > 0) {
            String previousAddresses = Stream.of(addresses)
                    .filter(addr -> InternetAddress.class.isAssignableFrom(addr.getClass()))
                    .map(addr -> (InternetAddress) addr)
                    .map(InternetAddress::getAddress)
                    .collect(Collectors.joining(","));

            String addressAlias = String.format("Diverted from %s", previousAddresses);
            InternetAddress[] divertAddresses = divertEmailsTo.stream()
                    .map(addr -> toInternetAddress(addr, addressAlias))
                    .toArray(InternetAddress[]::new);
            message.setRecipients(recipientType, divertAddresses);
        }
    }

    private String toEmailPortionOnly(String email) {
        try {
            InternetAddress address = new InternetAddress(email);
            address.validate();
            return address.getAddress();
        } catch (AddressException e) {
            throw new IllegalArgumentException("Invalid email address: " + email, e);
        }
    }

    private InternetAddress toInternetAddress(String email, String personal) {
        try {
            InternetAddress address = new InternetAddress(email);
            address.setPersonal(personal);
            return address;
        } catch (Exception e) {
            throw new MessagingRuntimeException(String.format("Error forming email address: \"%s\" <%s>" , personal, email), e);
        }
    }



}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy