
com.threewks.spring.gmail.DivertingMailInterceptor Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of spring-gae-gmail Show documentation
Show all versions of spring-gae-gmail Show documentation
Spring Boot, Google App Engine and Gmail integration
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