All Downloads are FREE. Search and download functionalities are using the official Maven repository.

br.gov.frameworkdemoiselle.mail.internal.Dispatcher Maven / Gradle / Ivy

The newest version!
/*
 * Demoiselle Framework
 * Copyright (C) 2010 SERPRO
 * ----------------------------------------------------------------------------
 * This file is part of Demoiselle Framework.
 * 
 * Demoiselle Framework is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public License version 3
 * as published by the Free Software Foundation.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even 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 Lesser General Public License version 3
 * along with this program; if not,  see 
 * or write to the Free Software Foundation, Inc., 51 Franklin Street,
 * Fifth Floor, Boston, MA  02110-1301, USA.
 * ----------------------------------------------------------------------------
 * Este arquivo é parte do Framework Demoiselle.
 * 
 * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou
 * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação
 * do Software Livre (FSF).
 * 
 * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA
 * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou
 * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português
 * para maiores detalhes.
 * 
 * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título
 * "LICENCA.txt", junto com esse programa. Se não, acesse 
 * ou escreva para a Fundação do Software Livre (FSF) Inc.,
 * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
 */
package br.gov.frameworkdemoiselle.mail.internal;

import java.util.Date;

import javax.activation.DataHandler;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.SendFailedException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;

import org.slf4j.Logger;

import br.gov.frameworkdemoiselle.internal.producer.LoggerProducer;
import br.gov.frameworkdemoiselle.mail.MailException;
import br.gov.frameworkdemoiselle.mail.internal.enums.ContentDisposition;
import br.gov.frameworkdemoiselle.mail.internal.enums.ContentType;
import br.gov.frameworkdemoiselle.mail.internal.enums.MailHeader;
import br.gov.frameworkdemoiselle.mail.internal.enums.MessagePriority;
import br.gov.frameworkdemoiselle.mail.internal.enums.RecipientType;
import br.gov.frameworkdemoiselle.mail.util.MailUtil;
import br.gov.frameworkdemoiselle.util.Strings;

public class Dispatcher {

	private Logger logger;

	private Multipart multipart = new MimeMultipart(ContentType.MIXED.getValue());

	private MimeMultipart relatedMultipart = new MimeMultipart(ContentType.RELATED.getValue());

	private MimeMessage mimeMessage;

	private String charset;

	private Session session;

	private BaseMessage message;

	public Dispatcher(Session session, BaseMessage message) {
		this.logger = LoggerProducer.create(Dispatcher.class);
		logger.debug("Mail Dispatcher initializing.");
		this.session = session;
		this.message = message;
		this.initialize();
	}

	public void setSentDate(Date date) {
		try {
			mimeMessage.setSentDate(date);
		} catch (MessagingException e) {
			throw new RuntimeException(e);
		}
	}

	public void send() throws SendFailedException {
		try {
			logger.info("Preparing to send message");
			Transport.send(mimeMessage);
			logger.info("Message Sent!");
		} catch (MessagingException e) {
			logger.error("Error sending message.", e);
			throw new SendFailedException("Send Failed", e);
		}
	}

	private void initialize() {
		charset = "UTF-8";
		mimeMessage = createMimeMessage();
		setSentDate(new Date());
	}

	private void setFrom() throws MessagingException {
		logger.debug("Setting " + message.getFromAddresses().size() + " addresses as 'From'.");

		if (message.getFromAddresses().size() == 1) {
			mimeMessage.setFrom(message.getFromAddresses().iterator().next());
		} else {
			mimeMessage.addFrom(MailUtil.getInternetAddressses(message.getFromAddresses()));
		}
	}

	private void setTo() throws MessagingException {
		logger.debug("Setting " + message.getToAddresses().size() + " addresses as 'To'.");

		for (InternetAddress address : message.getToAddresses()) {
			mimeMessage.addRecipient(RecipientType.TO.getRecipientType(), address);
		}
	}

	private void setCc() throws MessagingException {
		logger.debug("Setting " + message.getCcAddresses().size() + " addresses as 'CC'.");

		for (InternetAddress address : message.getCcAddresses()) {
			mimeMessage.addRecipient(RecipientType.CC.getRecipientType(), address);
		}
	}

	private void setBcc() throws MessagingException {
		logger.debug("Setting " + message.getBccAddresses().size() + " addresses as 'BCC'.");

		for (InternetAddress address : message.getBccAddresses()) {
			mimeMessage.addRecipient(RecipientType.BCC.getRecipientType(), address);
		}
	}

	private void setReplyTo() throws MessagingException {
		logger.debug("Setting " + message.getReplyToAddresses().size() + " addresses as 'Reply-To'.");

		if (message.getReplyToAddresses().size() > 0) {
			mimeMessage.setReplyTo(MailUtil.getInternetAddressses(message.getReplyToAddresses()));
		}
	}

	private void setReadReceipt() throws MessagingException {
		logger.debug("Setting " + message.getReadReceiptAddresses().size() + " addresses as 'Read Receipt'.");

		for (InternetAddress address : message.getReadReceiptAddresses()) {
			mimeMessage.setHeader(MailHeader.READ_RECIEPT.headerValue(), "<" + address.getAddress() + ">");
		}
	}

	private void setDeliveryReceipt() throws MessagingException {
		logger.debug("Setting " + message.getDeliveryReceiptAddresses().size() + " addresses as 'Delivery Receipt'.");

		for (InternetAddress address : message.getDeliveryReceiptAddresses()) {
			mimeMessage.setHeader(MailHeader.DELIVERY_RECIEPT.headerValue(), "<" + address.getAddress() + ">");
		}
	}

	private void setImportance() throws MessagingException {
		logger.debug("Setting message importance:" + message.getImportance().getImportance());

		if (message.getImportance() != null && message.getImportance() != MessagePriority.NORMAL) {
			mimeMessage.setHeader(MailHeader.XPRIORITY.headerValue(), message.getImportance().getX_priority());
			mimeMessage.setHeader(MailHeader.PRIORITY.headerValue(), message.getImportance().getPriority());
			mimeMessage.setHeader(MailHeader.IMPORTANCE.headerValue(), message.getImportance().getImportance());
		}
	}

	private MimeBodyPart createTextBodyPart(String text) {
		logger.debug("Defining Text Body.");

		MimeBodyPart textBodyPart = new MimeBodyPart();

		try {
			textBodyPart.setDisposition(ContentDisposition.INLINE.headerValue());
			textBodyPart.setText(text, charset);
		} catch (MessagingException e) {
			throw new MailException("Can't set Text Body", e);
		}

		return textBodyPart;
	}

	private void setContent() throws MessagingException {
		logger.debug("Setting e-mail content.");

		if (!Strings.isEmpty(message.getTextBody())) {
			multipart.addBodyPart(createTextBodyPart(message.getTextBody()));
		} else if (!Strings.isEmpty(message.getHtmlBody())) {
			MimeBodyPart relatedBodyPart = new MimeBodyPart();
			try {
				relatedMultipart.addBodyPart(createHTMLBodyPart(message.getHtmlBody()));
				relatedBodyPart.setContent(relatedMultipart);
				multipart.addBodyPart(relatedBodyPart);
			} catch (MessagingException e) {
				throw new MailException("Can't set email content", e);
			}
		}
	}

	private MimeBodyPart createHTMLBodyPart(String html) {
		logger.debug("Setting HTML body.");

		MimeBodyPart htmlBodyPart = new MimeBodyPart();
		try {
			htmlBodyPart.setDisposition(ContentDisposition.INLINE.headerValue());
			htmlBodyPart.setText(html, charset, "html");
		} catch (MessagingException e) {
			throw new MailException("Can't create HTML Body Part", e);
		}

		return htmlBodyPart;
	}

	private void setAttachments() {
		logger.debug("Setting attachments.");

		for (Attachment attachment : message.getAttachments()) {
			MimeBodyPart messageBodyPart = new MimeBodyPart();
			ByteArrayDataSource datasource = new ByteArrayDataSource(attachment.getBytes(), attachment.getMimeType());
			try {
				messageBodyPart.setDataHandler(new DataHandler(datasource));
				messageBodyPart.setFileName(attachment.getFileName());
				multipart.addBodyPart(messageBodyPart);
			} catch (MessagingException e) {
				throw new MailException("Can't add attachment.", e);
			}
		}
	}

	private MimeMessage createMimeMessage() {
		mimeMessage = new MimeMessage(session);
		try {
			mimeMessage.setContent(multipart);
			setFrom();
			setTo();
			setCc();
			setBcc();
			setReplyTo();
			setReadReceipt();
			setDeliveryReceipt();
			setImportance();
			setAttachments();
			mimeMessage.setSubject(message.getSubject(), charset);
			setContent();
		} catch (Exception e) {
			throw new MailException("Error preparing e-mail message", e);
		}

		return mimeMessage;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy