package org.sigmah.server.mail; /* * #%L * Sigmah * %% * Copyright (C) 2010 - 2016 URD * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU 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 General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.lang3.StringUtils; import org.sigmah.server.conf.Properties; import org.sigmah.server.i18n.I18nServer; import org.sigmah.shared.Language; import org.sigmah.shared.conf.PropertyKey; import org.sigmah.shared.conf.PropertyName; import org.sigmah.shared.dto.referential.EmailKey; import org.sigmah.shared.dto.referential.EmailType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.inject.Inject; import java.io.InputStream; import java.util.Arrays; /** * Defines the mail service. * * @author Maxime Lombard (mlombard@ideia.fr) */ public class ModelMailService implements MailService { /** * Logger. */ private static final Logger LOG = LoggerFactory.getLogger(ModelMailService.class); // Content replacements. private static final String TAG_START = "{{"; private static final String TAG_END = "}}"; /** * Mail sender. */ private final MailSender sender; /** * Injected application properties. */ private final Properties properties; /** * Injected {@code i18nServer} service. */ private final I18nServer i18nServer; @Inject public ModelMailService(MailSender sender, Properties properties, I18nServer i18nServer) { this.sender = sender; this.properties = properties; this.i18nServer = i18nServer; } /** * {@inheritDoc} */ @Override public boolean send(final EmailType type, final Map<EmailKey, String> parameters, final Language language, final String... to) { return send(type, parameters, language, to, (String[]) null); } /** * {@inheritDoc} */ @Override public boolean send(final EmailType type, final Map<EmailKey, String> parameters, final Language language, final String[] to, final String... cc) { return send(type, parameters, null, null, language, to, cc); } /** * {@inheritDoc} */ @Override public boolean send(final EmailType type, final Map<EmailKey, String> parameters, final String fileName, final InputStream fileStream, final Language language, final String[] to, final String... cc) { // Checking that the type is not null. if (type == null) { if (LOG.isWarnEnabled()) { LOG.warn("The email model type is null, interrupting email sending."); } return false; } // Retrieving the mail model parts. final String subject = i18nServer.t(language, PropertyName.n(PropertyName.PREFIX_MAIL_MODEL, type.getPropertyName(), "subject")); final String content = i18nServer.t(language, PropertyName.n(PropertyName.PREFIX_MAIL_MODEL, type.getPropertyName(), "content")); final String header = i18nServer.t(language, PropertyName.n(PropertyName.PREFIX_MAIL_MODEL, "header")); final String footer = i18nServer.t(language, PropertyName.n(PropertyName.PREFIX_MAIL_MODEL, "footer")); final String username = properties.getProperty(PropertyKey.MAIL_AUTH_USERNAME); final String password = properties.getProperty(PropertyKey.MAIL_AUTH_PASSWORD); // Building the email. final Email email = new Email(); email.setFromAddress(properties.getProperty(PropertyKey.MAIL_FROM_ADDRESS)); email.setFromName(properties.getProperty(PropertyKey.MAIL_FROM_NAME)); email.setToAddresses(to); email.setCcAddresses(cc); email.setSubject(getReplacedString(subject, parameters)); email.setContent(header + getReplacedString(content, parameters) + footer); email.setContentType(properties.getProperty(PropertyKey.MAIL_CONTENT_TYPE)); email.setHostName(properties.getProperty(PropertyKey.MAIL_HOSTNAME)); email.setSmtpPort(properties.getIntegerProperty(PropertyKey.MAIL_PORT)); email.setEncoding(properties.getProperty(PropertyKey.MAIL_ENCODING)); email.setAuthenticationUserName(StringUtils.isBlank(username) ? null : username); email.setAuthenticationPassword(StringUtils.isBlank(password) ? null : password); // Sending the email. if (LOG.isInfoEnabled()) { LOG.info("Sending an email to '{}'.", Arrays.toString(email.getToAddresses())); } try { if(fileName == null || fileStream == null) { sender.send(email); } else { sender.sendWithAttachments(email, new EmailAttachment(fileName, fileStream)); } if (LOG.isInfoEnabled()) { LOG.info("Email successfully sent."); } return true; } catch (Exception e) { if (LOG.isInfoEnabled()) { LOG.info("Email sending failed.", e); } return false; } } /** * Replaces all the parameters in the source string and returns it. * * @param source * The source string. * @param parameters * The parameters. * @return The replaced string. */ private static String getReplacedString(String source, Map<EmailKey, String> parameters) { if (source == null) { return ""; } if (parameters != null) { for (final Map.Entry<EmailKey, String> entry : parameters.entrySet()) { source = replaceTag(source, entry.getKey().getKey(), entry.getValue()); } } return source; } /** * Replace a tag with the given replacing value in the source string. * * @param source * The source string. * @param tagName * The tag name. * @param replacedValue * The replacing value. * @return The replaced string. */ private static String replaceTag(String source, String tagName, String replacedValue) { return source.replaceAll(Pattern.quote(TAG_START + tagName + TAG_END), Matcher.quoteReplacement(replacedValue)); } }