/**
* This Source Code Form is subject to the terms of the Mozilla Public License,
* v. 2.0. If a copy of the MPL was not distributed with this file, You can
* obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under
* the terms of the Healthcare Disclaimer located at http://openmrs.org/license.
*
* Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS
* graphic logo is a trademark of OpenMRS Inc.
*/
package org.openmrs.notification.mail;
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 org.openmrs.api.context.Context;
import org.openmrs.notification.Message;
import org.openmrs.notification.MessageException;
import org.openmrs.notification.MessageSender;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
public class MailMessageSender implements MessageSender {
protected static final Logger log = LoggerFactory.getLogger(MailMessageSender.class);
/**
* JavaMail session
*/
private Session session;
/**
* Default public constructor.
*/
public MailMessageSender() {
}
/**
* Public constructor.
*
* @param session
*/
public MailMessageSender(Session session) {
this.session = session;
}
/**
* Set javamail session.
*
* @param session
*/
public void setMailSession(Session session) {
this.session = session;
}
/**
* Send the message.
*
* @param message the message to be sent
*/
@Override
public void send(Message message) throws MessageException {
try {
MimeMessage mimeMessage = createMimeMessage(message);
Transport.send(mimeMessage);
}
catch (Exception e) {
log.error("failed to send message", e);
// catch mail-specific exception and re-throw it as app-specific exception
throw new MessageException(e);
}
}
/**
* Converts the message object to a mime message in order to prepare it to be sent.
*
* @param message
* @return MimeMessage
*/
public MimeMessage createMimeMessage(Message message) throws Exception {
if (message.getRecipients() == null) {
throw new MessageException("Message must contain at least one recipient");
}
// set the content-type to the default if it isn't defined in Message
if (!StringUtils.hasText(message.getContentType())) {
String contentType = Context.getAdministrationService().getGlobalProperty("mail.default_content_type");
message.setContentType(StringUtils.hasText(contentType) ? contentType : "text/plain");
}
MimeMessage mimeMessage = new MimeMessage(session);
if (message.getSender() != null) {
mimeMessage.setSender(new InternetAddress(message.getSender()));
} else {
String defaultFromMailAddress = Context.getAdministrationService().getGlobalProperty("mail.from");
if (StringUtils.hasText(defaultFromMailAddress)) {
mimeMessage.setSender(new InternetAddress(defaultFromMailAddress));
}
}
mimeMessage.setRecipients(javax.mail.Message.RecipientType.TO,
InternetAddress.parse(message.getRecipients(), false));
mimeMessage.setSubject(message.getSubject());
if (!message.hasAttachment()) {
mimeMessage.setContent(message.getContent(), message.getContentType());
} else {
mimeMessage.setContent(createMultipart(message));
}
return mimeMessage;
}
/**
* Creates a MimeMultipart, so that we can have an attachment.
*
* @param message
* @return
*/
private MimeMultipart createMultipart(Message message) throws Exception {
MimeMultipart toReturn = new MimeMultipart();
MimeBodyPart textContent = new MimeBodyPart();
textContent.setContent(message.getContent(), message.getContentType());
MimeBodyPart attachment = new MimeBodyPart();
attachment.setContent(message.getAttachment(), message.getAttachmentContentType());
attachment.setFileName(message.getAttachmentFileName());
toReturn.addBodyPart(textContent);
toReturn.addBodyPart(attachment);
return toReturn;
}
}