Package org.beangle.notification.notifiers.mail

Source Code of org.beangle.notification.notifiers.mail.AbstractMailNotifier

/* 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;
  }

}
TOP

Related Classes of org.beangle.notification.notifiers.mail.AbstractMailNotifier

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.