org.beangle.notification.notifiers.mail.AbstractMailNotifier.java Source code

Java tutorial

Introduction

Here is the source code for org.beangle.notification.notifiers.mail.AbstractMailNotifier.java

Source

/* Copyright c 2005-2012.
 * Licensed under GNU  LESSER General Public License, Version 3.
 * http://www.gnu.org/licenses
 */
package org.beangle.notification.notifiers.mail;

import java.util.Date;
import java.util.List;

import javax.mail.MessagingException;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.Validate;
import org.beangle.notification.Message;
import org.beangle.notification.NotificationException;
import org.beangle.notification.Notifier;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;

public abstract class AbstractMailNotifier<T extends MailMessage> implements Notifier<T> {

    protected static final Logger logger = LoggerFactory.getLogger(AbstractMailNotifier.class);

    protected JavaMailSender mailSender;

    private String from;

    private InternetAddress[] froms;

    public String getType() {
        return "mail";
    }

    public void deliver(T mailMsg) throws NotificationException {
        MimeMessage mimeMsg = mailSender.createMimeMessage();
        try {
            if (null == mailMsg.getSendAt()) {
                mimeMsg.setSentDate(new Date());
            } else {
                mimeMsg.setSentDate(mailMsg.getSendAt());
            }
            MimeMessageHelper messageHelper = null;
            String encoding = StringUtils.substringAfter(mailMsg.getContentType(), "charset=");
            if (StringUtils.isEmpty(encoding)) {
                messageHelper = new MimeMessageHelper(mimeMsg);
            } else {
                messageHelper = new MimeMessageHelper(mimeMsg, encoding);
            }
            messageHelper.setText(buildText(mailMsg), StringUtils.contains(mailMsg.getContentType(), "html"));
            String subject = buildSubject(mailMsg);
            messageHelper.setSubject(subject);
            int recipients = addRecipient(mimeMsg, mailMsg);
            beforeSend(mailMsg, mimeMsg);
            if (recipients > 0) {
                mailSender.send(mimeMsg);
                if (logger.isDebugEnabled()) {
                    logger.debug("mail sended from {} to {} with subject {}",
                            new Object[] { from, mailMsg.getRecipients(), subject });
                }
            } else {
                logger.warn("{} without any recipients ,sending aborted!", subject);
            }
        } catch (AddressException ex) {
            throw new NotificationException("Exception while sending message.", ex);
        } catch (MessagingException ex) {
            throw new NotificationException("Exception while sending message.", ex);
        }
        afterSend(mailMsg, mimeMsg);
    }

    // add from and other recipients
    private int addRecipient(MimeMessage mimeMsg, MailMessage mailMsg) throws MessagingException {
        String encoding = mailMsg.getEncoding();
        if (null == froms) {
            List<InternetAddress> addresses = MimeUtils.parseAddress(from, encoding);
            InternetAddress[] addressArray = new InternetAddress[addresses.size()];
            if (addressArray.length > 0) {
                addresses.toArray(addressArray);
                froms = addressArray;
            }
        }
        int recipients = 0;
        if (null != froms)
            mimeMsg.addFrom(froms);
        for (InternetAddress to : mailMsg.getTo()) {
            mimeMsg.addRecipient(javax.mail.Message.RecipientType.TO, to);
            recipients++;
        }
        for (InternetAddress cc : mailMsg.getCc()) {
            mimeMsg.addRecipient(javax.mail.Message.RecipientType.CC, cc);
            recipients++;
        }
        for (InternetAddress bcc : mailMsg.getBcc()) {
            mimeMsg.addRecipient(javax.mail.Message.RecipientType.BCC, bcc);
            recipients++;
        }
        return recipients;
    }

    abstract protected String buildSubject(Message msg);

    abstract protected String buildText(Message msg);

    protected void beforeSend(Message msg, MimeMessage mimeMsg) {
    }

    protected void afterSend(Message msg, MimeMessage mimeMsg) {
    }

    public JavaMailSender getMailSender() {
        return mailSender;
    }

    public void setMailSender(JavaMailSender javaMailSender) {
        this.mailSender = javaMailSender;
    }

    public String getFrom() {
        return from;
    }

    public void setFrom(String from) {
        Validate.notEmpty(from);
        this.from = from;
    }

}