/*
* created on 2005/1/3
*
* $Author$
* $Revision$
* $Date$
*/
package io.kaif.mail;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import javax.annotation.PreDestroy;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.mail.javamail.MimeMessagePreparator;
import org.springframework.stereotype.Component;
import com.google.common.base.Charsets;
/**
* the bean will enable if AwsSesMailAgent disabled. for dev mode with local tomcat and production
* mode with vagrant
*/
@Component
@ConditionalOnMissingBean(AwsSesMailAgent.class)
public class JavaMailAgent implements MailAgent {
static final class EncodingMimeMessagePreparator implements MimeMessagePreparator {
private final Mail message;
EncodingMimeMessagePreparator(Mail message) {
this.message = message;
}
public void prepare(MimeMessage mimeMessage) throws MessagingException {
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage,
true,
Charsets.UTF_8.toString());
try {
messageHelper.setFrom(message.getFrom(), message.getFromName());
} catch (UnsupportedEncodingException e) {
throw new MessagingException(
"UnsupportedEncodingException while encode 'the name of FROM person'",
e);
}
messageHelper.setTo(message.getTo());
if (message.getBcc() != null) {
messageHelper.setBcc(message.getBcc());
}
if (message.getCc() != null) {
messageHelper.setCc(message.getCc());
}
if (message.getReplyTo() != null) {
messageHelper.setReplyTo(message.getReplyTo());
}
messageHelper.setSubject(message.getSubject());
messageHelper.setText(message.getText());
}
}
private static Logger logger = LoggerFactory.getLogger(JavaMailAgent.class);
@Autowired
private JavaMailSender mailSender;
private ExecutorService executorService = Executors.newFixedThreadPool(5);
@Autowired
private MailComposer mailComposer;
public CompletableFuture<Boolean> send(final Mail message) {
return CompletableFuture.supplyAsync(() -> {
//TODO timeout ?
mailSender.send(new EncodingMimeMessagePreparator(message));
if (logger.isDebugEnabled()) {
logger.debug("mail message sent:\n{}", message);
} else {
logger.info("mail message sent to:{} ", Arrays.toString(message.getTo()));
}
return true;
}).handle((result, e) -> {
logger.error("mail message sent failed:"
+ Arrays.toString(message.getTo())
+ ", cause:"
+ e.getMessage());
return false;
});
}
@Override
public MailComposer mailComposer() {
return mailComposer;
}
@PreDestroy
public void destroy() throws Exception {
executorService.shutdownNow();
executorService.awaitTermination(5, TimeUnit.SECONDS);
logger.info("shutdowned");
}
}