org.kuali.coeus.common.impl.mail.KcEmailServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.kuali.coeus.common.impl.mail.KcEmailServiceImpl.java

Source

/*
 * Kuali Coeus, a comprehensive research administration system for higher education.
 * 
 * Copyright 2005-2015 Kuali, Inc.
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 * 
 * 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 Affero General Public License for more details.
 * 
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.kuali.coeus.common.impl.mail;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.kuali.coeus.common.framework.mail.EmailAttachment;
import org.kuali.coeus.common.framework.mail.KcEmailService;
import org.kuali.kra.infrastructure.Constants;
import org.kuali.rice.core.api.config.property.ConfigurationService;
import org.kuali.rice.coreservice.framework.parameter.ParameterService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

@Component("kcEmailService")
public class KcEmailServiceImpl implements KcEmailService {
    private static final Log LOG = LogFactory.getLog(KcEmailServiceImpl.class);

    public static final String DEFAULT_ENCODING = "UTF-8";

    @Autowired
    @Qualifier("mailSender")
    private JavaMailSenderImpl mailSender;

    @Autowired
    @Qualifier("parameterService")
    private ParameterService parameterService;

    @Autowired
    @Qualifier("kualiConfigurationService")
    private ConfigurationService configurationService;

    private ExecutorService executorService = Executors.newCachedThreadPool();

    public void sendEmail(String from, Set<String> toAddresses, String subject, Set<String> ccAddresses,
            Set<String> bccAddresses, String body, boolean htmlMessage) {
        sendEmailWithAttachments(from, toAddresses, subject, ccAddresses, bccAddresses, body, htmlMessage, null);
    }

    public void sendEmailWithAttachments(String from, Set<String> toAddresses, String subject,
            Set<String> ccAddresses, Set<String> bccAddresses, String body, boolean htmlMessage,
            List<EmailAttachment> attachments) {

        if (mailSender != null) {
            if (CollectionUtils.isEmpty(toAddresses) && CollectionUtils.isEmpty(ccAddresses)
                    && CollectionUtils.isEmpty(bccAddresses)) {
                return;
            }

            MimeMessage message = mailSender.createMimeMessage();
            MimeMessageHelper helper = null;

            try {
                helper = new MimeMessageHelper(message, true, DEFAULT_ENCODING);
                helper.setFrom(from);

                if (StringUtils.isNotBlank(subject)) {
                    helper.setSubject(subject);
                } else {
                    LOG.warn("Sending message with empty subject.");
                }

                if (isEmailTestEnabled()) {
                    helper.setText(getTestMessageBody(body, toAddresses, ccAddresses, bccAddresses), true);
                    String toAddress = getEmailNotificationTestAddress();
                    if (StringUtils.isNotBlank(getEmailNotificationTestAddress())) {
                        helper.addTo(toAddress);
                    }
                } else {
                    helper.setText(body, htmlMessage);
                    if (CollectionUtils.isNotEmpty(toAddresses)) {
                        for (String toAddress : toAddresses) {
                            try {
                                helper.addTo(toAddress);
                            } catch (Exception ex) {
                                LOG.warn("Could not set to address:", ex);
                            }
                        }
                    }
                    if (CollectionUtils.isNotEmpty(ccAddresses)) {
                        for (String ccAddress : ccAddresses) {
                            try {
                                helper.addCc(ccAddress);
                            } catch (Exception ex) {
                                LOG.warn("Could not set to address:", ex);
                            }
                        }
                    }
                    if (CollectionUtils.isNotEmpty(bccAddresses)) {
                        for (String bccAddress : bccAddresses) {
                            try {
                                helper.addBcc(bccAddress);
                            } catch (Exception ex) {
                                LOG.warn("Could not set to address:", ex);
                            }
                        }
                    }
                }

                if (CollectionUtils.isNotEmpty(attachments)) {
                    for (EmailAttachment attachment : attachments) {
                        try {
                            helper.addAttachment(attachment.getFileName(),
                                    new ByteArrayResource(attachment.getContents()), attachment.getMimeType());
                        } catch (Exception ex) {
                            LOG.warn("Could not set to address:", ex);
                        }
                    }
                }
                executorService.execute(() -> mailSender.send(message));

            } catch (MessagingException ex) {
                LOG.error("Failed to create mime message helper.", ex);
            }
        } else {
            LOG.info(
                    "Failed to send email due to inability to obtain valid email mailSender, please check your configuration.");
        }
    }

    private String getEmailNotificationTestAddress() {
        String testAddress = parameterService.getParameterValueAsString(Constants.KC_GENERIC_PARAMETER_NAMESPACE,
                Constants.KC_ALL_PARAMETER_DETAIL_TYPE_CODE, "EMAIL_NOTIFICATION_TEST_ADDRESS");
        return testAddress;
    }

    private String getTestMessageBody(String body, Set<String> toAddresses, Set<String> ccAddresses,
            Set<String> bccAddresses) {
        StringBuffer testEmailBody = new StringBuffer("");
        testEmailBody.append("-----------------------------------------------------------<br/>");
        testEmailBody.append("TEST MODE<br/>");
        testEmailBody.append("In Production mode this mail will be sent to the following... <br/>");
        if (CollectionUtils.isNotEmpty(toAddresses)) {
            testEmailBody.append("TO: ");
            testEmailBody.append(toAddresses);
        }
        if (CollectionUtils.isNotEmpty(ccAddresses)) {
            testEmailBody.append("CC: ");
            testEmailBody.append(toAddresses);
        }
        if (CollectionUtils.isNotEmpty(bccAddresses)) {
            testEmailBody.append("BCC: ");
            testEmailBody.append(toAddresses);
        }
        testEmailBody.append("<br/>-----------------------------------------------------------");
        return testEmailBody.toString() + "<br/>" + body;

    }

    private boolean isEmailTestEnabled() {
        Boolean emailTestEnabled = parameterService.getParameterValueAsBoolean(
                Constants.KC_GENERIC_PARAMETER_NAMESPACE, Constants.KC_ALL_PARAMETER_DETAIL_TYPE_CODE,
                "EMAIL_NOTIFICATIONS_TEST_ENABLED");
        return emailTestEnabled == null ? false : emailTestEnabled;
    }

    public String getDefaultFromAddress() {
        String fromAddress = parameterService.getParameterValueAsString(Constants.KC_GENERIC_PARAMETER_NAMESPACE,
                Constants.KC_ALL_PARAMETER_DETAIL_TYPE_CODE, "EMAIL_NOTIFICATION_FROM_ADDRESS");
        return fromAddress != null ? fromAddress : configurationService.getPropertyValueAsString("mail.from");
    }

    public void setMailSender(JavaMailSenderImpl mailSender) {
        this.mailSender = mailSender;
    }

    public void setConfigurationService(ConfigurationService configurationService) {
        this.configurationService = configurationService;
    }

    public JavaMailSenderImpl getMailSender() {
        return mailSender;
    }

    public void setParameterService(ParameterService parameterService) {
        this.parameterService = parameterService;
    }

    public ParameterService getParameterService() {
        return parameterService;
    }
}