package io.milton.mail.send; import io.milton.mail.StandardMessage; import io.milton.mail.StandardMessageFactory; import io.milton.mail.StandardMessageFactoryImpl; import java.io.UnsupportedEncodingException; import java.util.List; import java.util.Properties; import javax.mail.Address; import javax.mail.Message.RecipientType; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import org.masukomi.aspirin.core.AspirinInternal; import org.masukomi.aspirin.core.delivery.DeliveryManager; import org.masukomi.aspirin.core.listener.AspirinListener; import org.masukomi.aspirin.core.listener.ListenerManager; import org.masukomi.aspirin.core.listener.ResultState; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class AspirinMailSender implements MailSender, AspirinListener { private final static Logger log = LoggerFactory.getLogger(AspirinMailSender.class); private final AspirinInternal aspirin; private final ListenerManager listenerManager; private final DeliveryManager deliveryManager; private boolean started; /** * * @param retryInterval - eg 1000 * @param deliveryThreads - eg 2 * @param postmaster - eg admin@ettrema.com * @param maxRetries - eg 3 */ public AspirinMailSender(AspirinInternal aspirinInternal, DeliveryManager deliveryManager, ListenerManager listenerManager) { this.listenerManager = listenerManager; this.deliveryManager = deliveryManager; this.aspirin = aspirinInternal; } @Override public void sendMail(MimeMessage mm) { if( !started ) { throw new RuntimeException("This mail sender is stopped"); } try { aspirin.add(mm, -1); } catch (MessagingException ex) { throw new RuntimeException(ex); } } @Override public void sendMail(String from, String fromPersonal, List<String> to, String replyTo, String subject, String text) { if( !started ) { throw new RuntimeException("This mail sender is stopped"); } try { MimeMessage mm = new MimeMessage(getSession()); mm.setSubject(subject); mm.setFrom(new InternetAddress(from, fromPersonal)); Address[] add = new Address[1]; add[0] = new InternetAddress(replyTo); mm.setReplyTo(add); for (String sTo : to) { mm.addRecipient(RecipientType.TO, new InternetAddress(sTo)); } mm.setContent(text, "text/plain"); sendMail(mm); } catch (UnsupportedEncodingException ex) { throw new RuntimeException(ex); } catch (MessagingException messagingException) { throw new RuntimeException(messagingException); } } @Override public Session getSession() { Properties props = new Properties(); return Session.getInstance(props); } @Override public MimeMessage newMessage(MimeMessage mm) { try { return new MySmtpMessage(getSession(), mm); } catch (MessagingException ex) { throw new RuntimeException(ex); } } @Override public MimeMessage newMessage() { return new MimeMessage(getSession()); } @Override public void start() { this.started = true; listenerManager.add(this); aspirin.start(); } @Override public void stop() { this.started = false; listenerManager.remove(this); deliveryManager.shutdown(); aspirin.shutdown(); } @Override public void sendMail( StandardMessage sm ) { StandardMessageFactory smf = new StandardMessageFactoryImpl(); MimeMessage mm = newMessage(); smf.toMimeMessage( sm, mm ); sendMail( mm ); } @Override public void delivered(String mailId, String recipient, ResultState state, String resultContent) { log.info("delivered: " + recipient + " state: " + state + " result: " + resultContent); } }