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