Package org.infoglue.cms.util.mail

Source Code of org.infoglue.cms.util.mail.MailService

/* ===============================================================================
*
* Part of the InfoGlue Content Management Platform (www.infoglue.org)
*
* ===============================================================================
*
*  Copyright (C)
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License version 2, as published by the
* Free Software Foundation. See the file LICENSE.html for more information.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY, including the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc. / 59 Temple
* Place, Suite 330 / Boston, MA 02111-1307 / USA.
*
* ===============================================================================
*/

package org.infoglue.cms.util.mail;

import java.util.ArrayList;
import java.util.List;

import javax.activation.DataHandler;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import org.apache.commons.mail.HtmlEmail;
import org.apache.commons.mail.SimpleEmail;
import org.apache.log4j.Logger;
import org.infoglue.cms.exception.Bug;
import org.infoglue.cms.exception.SystemException;
import org.infoglue.cms.util.CmsPropertyHandler;
import org.jsoup.Jsoup;

public class MailService
{
  private final static Logger logger = Logger.getLogger(MailService.class.getName());

    // The mail session.
    private Session session;


  /**
     * Creates a MailServices object and initializes it with the specified mail session.
     */

    public MailService(Session session)
    {
        this.session = session;
    }

    /**
     *
     */
    public MimeMessage createMessage()
    {
      return new MimeMessage(this.session);
    }
   
    /**
     *
     */
    public void send(final Message message) throws SystemException
    {
      try
      {
      Transport.send(message);
      }
      catch(MessagingException e)
      {
        e.printStackTrace();
          throw new SystemException("Unable to send message.", e);
      }
     
    }

  /**
   *
   * @param from the sender of the email.
   * @param to the recipient of the email.
   * @param subject the subject of the email.
   * @param content the body of the email.
   * @throws SystemException if the email couldn't be sent due to some mail server exception.
   */
  public void send(String from, String to, String bcc, String subject, String content) throws SystemException
  {
      send(createMessage(from, to, bcc, subject, content));
  }

  /**
   *
   * @param from the sender of the email.
   * @param to the recipient of the email.
   * @param subject the subject of the email.
   * @param content the body of the email.
   * @throws SystemException if the email couldn't be sent due to some mail server exception.
   */
  public void send(String from, String to, String subject, String content, String contentType, String encoding) throws SystemException
  {
    final Message message = createMessage(from, to, null, subject, content, contentType, encoding);
  
    try
    {
      Transport.send(message);
    }
      catch(MessagingException e)
      {
        e.printStackTrace();
          throw new SystemException("Unable to send message.", e);
      }

  }


  /**
   *
   * @param from the sender of the email.
   * @param to the recipient of the email.
   * @param subject the subject of the email.
   * @param content the body of the email.
   * @throws SystemException if the email couldn't be sent due to some mail server exception.
   */
  /*
  public void sendEmail(String from, String to, String bcc, String subject, String content, String encoding) throws SystemException
  {
    sendEmail(from, to, null, bcc, subject, content, encoding);
  }
  */
 
  /**
   *
   * @param from the sender of the email.
   * @param to the recipient of the email.
   * @param subject the subject of the email.
   * @param content the body of the email.
   * @throws SystemException if the email couldn't be sent due to some mail server exception.
   */
  /*
  public void sendEmail(String from, String to, String cc, String bcc, String replyTo, String subject, String content, String encoding) throws SystemException
  {
        String contentType = CmsPropertyHandler.getMailContentType();
        if(contentType == null || contentType.length() == 0)
            contentType = "text/html";

      if(contentType.equalsIgnoreCase("text/html"))
        sendHTML(from, to, cc, bcc, replyTo, subject, content, encoding);
      else
          sendPlain(from, to, cc, bcc, replyTo, subject, content, encoding);
  }
  */
  /**
   *
   * @param from the sender of the email.
   * @param to the recipient of the email.
   * @param subject the subject of the email.
   * @param content the body of the email.
   * @throws SystemException if the email couldn't be sent due to some mail server exception.
   */
  /*
  public void sendEmail(String contentType, String from, String to, String cc, String bcc, String subject, String content, String encoding) throws SystemException
  {
        sendEmail(contentType, from, to, cc, bcc, null, subject, content, encoding);
  }
  */
 
  /**
   *
   * @param from the sender of the email.
   * @param to the recipient of the email.
   * @param subject the subject of the email.
   * @param content the body of the email.
   * @throws SystemException if the email couldn't be sent due to some mail server exception.
   */
  public void sendEmail(String contentType, String from, String to, String cc, String bcc, String bounceAddress, String replyTo, String subject, String content, String encoding) throws SystemException
  {
         if(contentType.equalsIgnoreCase("text/html"))
        sendHTML(from, to, cc, bcc, bounceAddress, replyTo, subject, content, encoding);
      else
          sendPlain(from, to, cc, bcc, bounceAddress, replyTo, subject, content, encoding);
  }

  public void sendWarningMail(String subject, String message)
  {
        String warningEmailReceiver = CmsPropertyHandler.getWarningEmailReceiver();
        logger.info("warningEmailReceiver: " + warningEmailReceiver);
        if(warningEmailReceiver != null && !warningEmailReceiver.equals("") && warningEmailReceiver.indexOf("@warningEmailReceiver@") == -1)
        {
      try
      {
            logger.info("Mailing: " + warningEmailReceiver);
        MailServiceFactory.getService().sendEmail(CmsPropertyHandler.getMailContentType(), warningEmailReceiver, warningEmailReceiver, null, null, null, null, subject, message.replaceAll("\n", "<br/>"), "utf-8");
      }
      catch (Exception e)
      {
        logger.error("Could not send mail:" + e.getMessage());
        logger.warn("Could not send mail:" + e.getMessage(), e);
      }
        }
  }

  /**
   *
   * @param from the sender of the email.
   * @param to the recipient of the email.
   * @param subject the subject of the email.
   * @param content the body of the email.
   * @throws SystemException if the email couldn't be sent due to some mail server exception.
   */
  public void sendHTML(String from, String to, String cc, String bcc, String bounceAddress, String replyTo, String subject, String content, String encoding) throws SystemException
  {
    try
    {
      HtmlEmail email = new HtmlEmail();
        String mailServer = CmsPropertyHandler.getMailSmtpHost();
        String mailPort = CmsPropertyHandler.getMailSmtpPort();
        String systemEmailSender = CmsPropertyHandler.getSystemEmailSender();
       
        email.setHostName(mailServer);
        if(mailPort != null && !mailPort.equals(""))
          email.setSmtpPort(Integer.parseInt(mailPort));
       
        boolean needsAuthentication = false;
        try
        {
        needsAuthentication = new Boolean(CmsPropertyHandler.getMailSmtpAuth()).booleanValue();
        }
        catch (Exception ex)
        {
        needsAuthentication = false;
        }
       
        if (needsAuthentication)
        {
        final String userName = CmsPropertyHandler.getMailSmtpUser();
        final String password = CmsPropertyHandler.getMailSmtpPassword();
       
        email.setAuthentication(userName, password);
      }
       
        email.setBounceAddress(systemEmailSender);
        email.setCharset(encoding);
      
        if(logger.isInfoEnabled())
        {
          logger.info("systemEmailSender:" + systemEmailSender);
          logger.info("to:" + to);
          logger.info("from:" + from);
          logger.info("mailServer:" + mailServer);
          logger.info("mailPort:" + mailPort);
          logger.info("cc:" + cc);
          logger.info("bcc:" + bcc);
          logger.info("replyTo:" + replyTo);
          logger.info("subject:" + subject);
        }
       
        if(to.indexOf(";") > -1)
        {
          cc = to;
          to = from;
        }
       
        String limitString = CmsPropertyHandler.getEmailRecipientLimit();
        if(limitString != null && !limitString.equals("-1"))
        {
          try
          {
            Integer limit = new Integer(limitString);
            int count = 0;
            if(cc != null)
              count = count + cc.split(";").length;
            if(bcc != null)
              count = count + bcc.split(";").length;
           
            logger.info("limit: " + limit + ", count: " + count);
            if(count > limit)
              throw new Exception("You are not allowed to send mail to more than " + limit + " recipients at a time. This is specified in app settings.");
          }
          catch (NumberFormatException e)
          {
            logger.error("Exception validating number of recipients in mailservice:" + e.getMessage(), e);
        }
        }
       
        email.addTo(to, to);
        email.setFrom(from, from);
        if(cc != null)
          email.setCc(createInternetAddressesList(cc));
        if(bcc != null)
          email.setBcc(createInternetAddressesList(bcc));
        if(replyTo != null)
          email.setReplyTo(createInternetAddressesList(replyTo));
       
        email.setSubject(subject);
       
        email.setHtmlMsg(content);
       
        //email.setTextMsg(Jsoup.parse(content).text());
 
        email.send();

        logger.info("Email sent!");
    }
      catch (Exception e)
      {
        logger.error("An error occurred when we tried to send this mail:" + e.getMessage(), e);
          throw new SystemException("An error occurred when we tried to send this mail:" + e.getMessage(), e);
      }
  }

  /**
   *
   * @param from the sender of the email.
   * @param to the recipient of the email.
   * @param subject the subject of the email.
   * @param content the body of the email.
   * @throws SystemException if the email couldn't be sent due to some mail server exception.
   */
  public void sendPlain(String from, String to, String cc, String bcc, String bounceAddress, String replyTo, String subject, String content, String encoding) throws SystemException
  {
    try
    {
        SimpleEmail email = new SimpleEmail();
        String mailServer = CmsPropertyHandler.getMailSmtpHost();
        String mailPort = CmsPropertyHandler.getMailSmtpPort();
        String systemEmailSender = CmsPropertyHandler.getSystemEmailSender();
       
        email.setHostName(mailServer);
        if(mailPort != null && !mailPort.equals(""))
          email.setSmtpPort(Integer.parseInt(mailPort));
       
        boolean needsAuthentication = false;
        try
        {
        needsAuthentication = new Boolean(CmsPropertyHandler.getMailSmtpAuth()).booleanValue();
        }
        catch (Exception ex)
        {
        needsAuthentication = false;
        }
       
        if (needsAuthentication)
        {
        final String userName = CmsPropertyHandler.getMailSmtpUser();
        final String password = CmsPropertyHandler.getMailSmtpPassword();
       
        email.setAuthentication(userName, password);
      }
       
        email.setBounceAddress(systemEmailSender);
        email.setCharset(encoding);
      
        if(to.indexOf(";") > -1)
        {
          cc = to;
          to = from;
        }

        String limitString = CmsPropertyHandler.getEmailRecipientLimit();
        if(limitString != null && !limitString.equals("-1"))
        {
          try
          {
            Integer limit = new Integer(limitString);
            int count = 0;
            if(cc != null)
              count = count + cc.split(";").length;
            if(bcc != null)
              count = count + bcc.split(";").length;
           
            logger.info("limit: " + limit + ", count: " + count);
            if(count > limit)
              throw new Exception("You are not allowed to send mail to more than " + limit + " recipients at a time. This is specified in app settings.");
          }
          catch (NumberFormatException e)
          {
            logger.error("Exception validating number of recipients in mailservice:" + e.getMessage(), e);
        }
        }

        email.addTo(to, to);
        email.setFrom(from, from);
       
        if(cc != null)
          email.setCc(createInternetAddressesList(cc));
        if(bcc != null)
          email.setBcc(createInternetAddressesList(bcc));
        if(replyTo != null)
          email.setReplyTo(createInternetAddressesList(replyTo));
       
        email.setSubject(subject);
        email.setMsg(content);
 
        email.send();
    }
      catch (Exception e)
      {
        logger.error("An error occurred when we tried to send this mail:" + e.getMessage(), e);
      }
     
      /*
    final Message message = createMessage(from, to, bcc, subject, content, contentType, encoding);
  
    try
    {
      Transport.send(message);
    }
      catch(MessagingException e)
      {
        e.printStackTrace();
          throw new SystemException("Unable to send message.", e);
      }
      */
  }

  /**
   *
   */
  private Message createMessage(String from, String to, String bcc, String subject, String content) throws SystemException
  {
    try
    {
        final Message message = new MimeMessage(this.session);

        message.setContent(content, "text/html");
      message.setFrom(createInternetAddress(from));
        message.setRecipient(Message.RecipientType.TO, createInternetAddress(to));
      if(bcc != null)
          message.setRecipients(Message.RecipientType.BCC, createInternetAddresses(bcc));
          message.setSubject(subject);
          message.setText(content);
          message.setDataHandler(new DataHandler(new StringDataSource(content, "text/html")));
 
          return message;
      }
      catch(MessagingException e)
      {
          throw new Bug("Unable to create the message.", e);
      }
  }

  /**
   *
   */
  private Message createMessage(String from, String to, String bcc, String subject, String content, String contentType, String encoding) throws SystemException
  {
    try
    {
      final Message message = new MimeMessage(this.session);
        String contentTypeWithEncoding = contentType+";charset="+encoding;

      //message.setContent(content, contentType);
      message.setFrom(createInternetAddress(from));
      message.setRecipient(Message.RecipientType.TO, createInternetAddress(to));
      if(bcc != null)
          message.setRecipients(Message.RecipientType.BCC, createInternetAddresses(bcc));
      //message.setSubject(subject);

          ((MimeMessage)message).setSubject(subject, encoding);
          //message.setText(content);
          message.setDataHandler(new DataHandler(new StringDataSource(content, contentTypeWithEncoding, encoding)));
          //message.setText(content);
          //message.setDataHandler(new DataHandler(new StringDataSource(content, "text/html")));

      return message;
    }
    catch(MessagingException e)
    {
      throw new Bug("Unable to create the message.", e);
    }
  }
 
  /**
   *
   */
  private Address createInternetAddress(String address)
  {
    try
    {
          return new InternetAddress(address);
      }
      catch(AddressException e)
      {
          throw new Bug("Badly formatted email address [" + address + "].", e);
      }
  }
 
  /**
   *
   */
  private Address[] createInternetAddresses(String emailAddressString) throws SystemException
  {
      String[] emailAddresses = emailAddressString.split(";");
     
      Address[] addresses = new Address[emailAddresses.length];
      for(int i=0; i<emailAddresses.length; i++)
      {
          String email = emailAddresses[i];
          try
      {
              addresses[i] = new InternetAddress(email);
          }
        catch(AddressException e)
        {
            throw new SystemException("Badly formatted email address [" + email + "].", e);
        }
      }
     
      return addresses;
  }

  /**
   *
   */
  private List createInternetAddressesList(String emailAddressString) throws SystemException
  {
      String[] emailAddresses = emailAddressString.split(";");
     
      List addresses = new ArrayList();
      for(int i=0; i<emailAddresses.length; i++)
      {
          String email = emailAddresses[i];
          try
      {
              addresses.add(new InternetAddress(email));
          }
        catch(AddressException e)
        {
            throw new SystemException("Badly formatted email address [" + email + "].", e);
        }
      }
     
      return addresses;
  }
 
}
TOP

Related Classes of org.infoglue.cms.util.mail.MailService

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.