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

org.opencastproject.kernel.mail.BaseSmtpService Maven / Gradle / Ivy

There is a newer version: 16.7
Show newest version
/*
 * Licensed to The Apereo Foundation under one or more contributor license
 * agreements. See the NOTICE file distributed with this work for additional
 * information regarding copyright ownership.
 *
 *
 * The Apereo Foundation licenses this file to you under the Educational
 * Community License, Version 2.0 (the "License"); you may not use this file
 * except in compliance with the License. You may obtain a copy of the License
 * at:
 *
 *   http://opensource.org/licenses/ecl2.txt
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 * License for the specific language governing permissions and limitations under
 * the License.
 *
 */

package org.opencastproject.kernel.mail;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Date;
import java.util.Properties;

import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.MimeMessage;

/**
 * Base implementation that allows to send e-mails using javax.mail.
 */
public class BaseSmtpService {

  /** The logging facility */
  private static final Logger logger = LoggerFactory.getLogger(BaseSmtpService.class);

  /** The mode */
  protected enum Mode {
    production, test
  };

  /** Parameter prefix common to all "mail" properties */
  protected static final String OPT_MAIL_PREFIX = "mail.";

  /** Parameter name for the transport protocol */
  protected static final String OPT_MAIL_TRANSPORT = "mail.transport.protocol";

  /** Parameter suffix for the mail host */
  protected static final String OPT_MAIL_HOST_SUFFIX = ".host";

  /** Parameter suffix for the mail port */
  protected static final String OPT_MAIL_PORT_SUFFIX = ".port";

  /** Parameter suffix for the start tls status */
  protected static final String OPT_MAIL_TLS_ENABLE_SUFFIX = ".starttls.enable";

  /** Parameter suffix for the authentication setting */
  protected static final String OPT_MAIL_AUTH_SUFFIX = ".auth";

  /** Parameter name for the username */
  protected static final String OPT_MAIL_USER = "mail.user";

  /** Parameter name for the password */
  protected static final String OPT_MAIL_PASSWORD = "mail.password";

  /** Parameter name for the recipient */
  protected static final String OPT_MAIL_FROM = "mail.from";

  /** Parameter name for the debugging setting */
  protected static final String OPT_MAIL_DEBUG = "mail.debug";

  /** Default value for the transport protocol */
  private static final String DEFAULT_MAIL_TRANSPORT = "smtp";

  /** Default value for the mail port */
  private static final int DEFAULT_MAIL_PORT = 25;

  /** The current mail transport protocol */
  protected String mailTransport = DEFAULT_MAIL_TRANSPORT;

  /** Flag indicating whether the service is actually sending messages */
  private boolean productionMode = true;

  /** The mail host */
  private String host = null;

  /** The mail port */
  private int port = DEFAULT_MAIL_PORT;

  /** The mail user */
  private String user = null;

  /** The mail password */
  private String password = null;

  /** Whether debug is enabled */
  private boolean debug = false;

  /** Whether SSL/TLS is enabled */
  private boolean ssl = false;

  /** The optional sender */
  private String sender = null;

  /** The mail properties */
  private Properties mailProperties = new Properties();

  /** The default mail session */
  private Session defaultMailSession = null;

  public void setProductionMode(boolean mode) {
    this.productionMode = mode;
  }

  public boolean isProductionMode() {
    return productionMode;
  }

  public void setHost(String host) {
    this.host = host;
  }

  public void setMailTransport(String mailTransport) {
    this.mailTransport = mailTransport;
  }

  public void setPort(Integer port) {
    this.port = port;
  }

  public void setUser(String user) {
    this.user = user;
  }

  public void setPassword(String password) {
    this.password = password;
  }

  public void setDebug(boolean debug) {
    this.debug = debug;
  }

  public void setSender(String sender) {
    this.sender = sender;
  }

  public void setSsl(boolean ssl) {
    this.ssl = ssl;
  }

  public void configure() {
    mailProperties.clear();
    defaultMailSession = null;

    if (!("smtp".equals(mailTransport) || "smtps".equals(mailTransport))) {
      if (mailTransport != null)
        logger.warn("'{}' procotol not supported. Reverting to default: '{}'", mailTransport, DEFAULT_MAIL_TRANSPORT);
      logger.debug("Mail transport protocol defaults to '{}'", DEFAULT_MAIL_TRANSPORT);
      mailProperties.put(OPT_MAIL_TRANSPORT, DEFAULT_MAIL_TRANSPORT);
    } else {
      logger.debug("Mail transport protocol is '{}'", mailTransport);
      mailProperties.put(OPT_MAIL_TRANSPORT, mailTransport);
    }

    mailProperties.put(OPT_MAIL_PREFIX + mailTransport + OPT_MAIL_HOST_SUFFIX, host);
    logger.debug("Mail host is {}", host);

    mailProperties.put(OPT_MAIL_PREFIX + mailTransport + OPT_MAIL_PORT_SUFFIX, port);
    logger.debug("Mail server port is '{}'", port);

    // User and Authentication
    String propName = OPT_MAIL_PREFIX + mailTransport + OPT_MAIL_AUTH_SUFFIX;
    if (StringUtils.isNotBlank(user)) {
      mailProperties.put(OPT_MAIL_USER, user);
      mailProperties.put(propName, Boolean.toString(true));
      logger.debug("Mail user is '{}'", user);
    } else {
      mailProperties.put(propName, Boolean.toString(false));
      logger.debug("Sending mails to {} without authentication", host);
    }

    if (StringUtils.isNotBlank(password)) {
      mailProperties.put(OPT_MAIL_PASSWORD, password);
      logger.debug("Mail password set");
    }

    if (StringUtils.isNotBlank(sender)) {
      mailProperties.put(OPT_MAIL_FROM, sender);
      logger.debug("Mail sender is '{}'", sender);
    } else {
      logger.debug("Mail sender defaults not set");
    }

    mailProperties.put(OPT_MAIL_PREFIX + mailTransport + OPT_MAIL_TLS_ENABLE_SUFFIX, ssl);
    if (ssl) {
      logger.debug("TLS over SMTP is enabled");
    } else {
      logger.debug("TLS over SMTP is disabled");
    }

    mailProperties.put(OPT_MAIL_DEBUG, Boolean.toString(debug));
    logger.debug("Mail debugging is {}", debug ? "enabled" : "disabled");

    logger.info("Mail service configured with {}", host);
    Properties props = getSession().getProperties();
    for (String key : props.stringPropertyNames())
      logger.info("{}: {}", key, props.getProperty(key));
  }

  /**
   * Returns the default mail session that can be used to create a new message.
   *
   * @return the default mail session
   */
  public Session getSession() {
    if (defaultMailSession == null) {
      defaultMailSession = Session.getInstance(mailProperties);
    }
    return defaultMailSession;
  }

  /**
   * Creates a new message.
   *
   * @return the new message
   */
  public MimeMessage createMessage() {
    return new MimeMessage(getSession());
  }

  /**
   * Sends message using the configured transport.
   *
   * @param message
   *          the message
   * @throws MessagingException
   *           if sending the message failed
   */
  public void send(MimeMessage message) throws MessagingException {
    message.setSentDate(new Date());
    if (!productionMode) {
      logger.debug("Skipping sending of message {} due to test mode", message);
      return;
    }
    Transport t = getSession().getTransport(mailTransport);
    ClassLoader cl = Thread.currentThread().getContextClassLoader();
    try {
      Thread.currentThread().setContextClassLoader(javax.mail.Session.class.getClassLoader());
      if (user != null)
        t.connect(user, password);
      else
        t.connect();
      t.sendMessage(message, message.getAllRecipients());
    } finally {
      Thread.currentThread().setContextClassLoader(cl);
      t.close();
    }
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy