mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

neil_a_wilson
20.04.2007 8f731063c3a73ae2585abd4f949611f153be9421
Add a general framework for OpenDS to send e-mail messages, and add an SMTP
alert handler that can be used to send e-mail messages in response to
administrative alerts generated within the server.

OpenDS Issue Number: 221
2 files added
9 files modified
651 ■■■■■ changed files
opends/resource/config/config.ldif 12 ●●●●● patch | view | raw | blame | history
opends/resource/schema/02-config.ldif 27 ●●●● patch | view | raw | blame | history
opends/src/admin/defn/org/opends/server/admin/std/GlobalConfiguration.xml 26 ●●●●● patch | view | raw | blame | history
opends/src/admin/defn/org/opends/server/admin/std/SMTPAlertHandlerConfiguration.xml 133 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/core/CoreConfigManager.java 112 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/core/DirectoryServer.java 37 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/extensions/SMTPAlertHandler.java 231 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/messages/ConfigMessages.java 16 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/messages/ExtensionsMessages.java 32 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/util/EMailMessage.java 9 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/util/ServerConstants.java 16 ●●●●● patch | view | raw | blame | history
opends/resource/config/config.ldif
@@ -95,7 +95,19 @@
objectClass: ds-cfg-alert-handler
cn: JMX Alert Handler
ds-cfg-alert-handler-class: org.opends.server.extensions.JMXAlertHandler
ds-cfg-alert-handler-enabled: true
dn: cn=SMTP Alert Handler,cn=Alert Handlers,cn=config
objectClass: top
objectClass: ds-cfg-alert-handler
objectClass: ds-cfg-smtp-alert-handler
cn: JMX Alert Handler
ds-cfg-alert-handler-class: org.opends.server.extensions.SMTPAlertHandler
ds-cfg-alert-handler-enabled: false
ds-cfg-sender-address: opends-alerts@example.com
ds-cfg-recipient-address: directory-administrators@example.com
ds-cfg-message-subject: OpenDS Alert %%alert-type%%
ds-cfg-message-body: Alert Type:  %%alert-type%%\n\nAlert ID:  %%alert-id%%\n\nAlert Message:  %%alert-message%%
dn: cn=Backends,cn=config
objectClass: top
opends/resource/schema/02-config.ldif
@@ -1477,12 +1477,26 @@
  X-ORIGIN 'OpenDS Directory Server' )
attributeTypes: ( 1.3.6.1.4.1.26027.1.1.443
  NAME 'ds-cfg-state-update-failure-policy'
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenDS Directory Server' )
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE
  X-ORIGIN 'OpenDS Directory Server' )
attributeTypes: ( 1.3.6.1.4.1.26027.1.1.444
  NAME 'ds-cfg-password-history-count' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
  X-ORIGIN 'OpenDS Directory Server' )
  SINGLE-VALUE X-ORIGIN 'OpenDS Directory Server' )
attributeTypes: ( 1.3.6.1.4.1.26027.1.1.445
  NAME 'ds-cfg-password-history-duration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
  SINGLE-VALUE X-ORIGIN 'OpenDS Directory Server' )
attributeTypes: ( 1.3.6.1.4.1.26027.1.1.446 NAME 'ds-cfg-smtp-server'
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenDS Directory Server' )
attributeTypes: ( 1.3.6.1.4.1.26027.1.1.447 NAME 'ds-cfg-sender-address'
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE
  X-ORIGIN 'OpenDS Directory Server' )
attributeTypes: ( 1.3.6.1.4.1.26027.1.1.448 NAME 'ds-cfg-recipient-address'
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'OpenDS Directory Server' )
attributeTypes: ( 1.3.6.1.4.1.26027.1.1.449 NAME 'ds-cfg-message-subject'
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE
  X-ORIGIN 'OpenDS Directory Server' )
attributeTypes: ( 1.3.6.1.4.1.26027.1.1.450 NAME 'ds-cfg-message-body'
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE
  X-ORIGIN 'OpenDS Directory Server' )
objectClasses: ( 1.3.6.1.4.1.26027.1.2.1
  NAME 'ds-cfg-access-control-handler' SUP top STRUCTURAL
@@ -1697,8 +1711,8 @@
  ds-cfg-notify-abandoned-operations $ ds-cfg-size-limit $ ds-cfg-time-limit $
  ds-cfg-proxied-authorization-identity-mapper-dn $ ds-cfg-writability-mode $
  ds-cfg-reject-unauthenticated-requests  $
  ds-cfg-bind-with-dn-requires-password $ ds-cfg-lookthrough-limit )
  X-ORIGIN 'OpenDS Directory Server' )
  ds-cfg-bind-with-dn-requires-password $ ds-cfg-lookthrough-limit $
  ds-cfg-smtp-server ) X-ORIGIN 'OpenDS Directory Server' )
objectClasses: ( 1.3.6.1.4.1.26027.1.2.41 NAME 'ds-cfg-root-dn' SUP top
  AUXILIARY MAY ds-cfg-alternate-bind-dn X-ORIGIN 'OpenDS Directory Server' )
objectClasses: ( 1.3.6.1.4.1.26027.1.2.42 NAME 'ds-cfg-root-dse'
@@ -2089,4 +2103,9 @@
  MAY ( ds-cfg-default-user-password-storage-scheme $
  ds-cfg-default-auth-password-storage-scheme )
  X-ORIGIN 'OpenDS Directory Server' )
objectClasses: ( 1.3.6.1.4.1.26027.1.2.118
  NAME 'ds-cfg-smtp-alert-handler' SUP ds-cfg-alert-handler STRUCTURAL
  MUST ( ds-cfg-sender-address $ ds-cfg-recipient-address $
  ds-cfg-message-subject $ ds-cfg-message-body )
  X-ORIGIN 'OpenDS Directory Server' )
opends/src/admin/defn/org/opends/server/admin/std/GlobalConfiguration.xml
@@ -475,5 +475,31 @@
    </adm:profile>
  </adm:property>
  <adm:property name="smtp-server" mandatory="false" multi-valued="true">
    <adm:synopsis>
      Specifies the address (and optional port number) for a mail server that
      can be used to send e-mail messages via SMTP.  It may be an IP address or
      resolvable hostname, optionally followed by a colon and a port number.
    </adm:synopsis>
    <adm:default-behavior>
      <adm:alias>
        <adm:synopsis>
          If no values are defined, then it will not be possible to take
          advantage of server features that may provide thea bility to send
          e-mail via SMTP.
        </adm:synopsis>
      </adm:alias>
    </adm:default-behavior>
    <adm:syntax>
      <adm:string />
    </adm:syntax>
    <adm:profile name="ldap">
      <ldap:attribute>
        <ldap:oid>1.3.6.1.4.1.26027.1.1.446</ldap:oid>
        <ldap:name>ds-cfg-smtp-server</ldap:name>
      </ldap:attribute>
    </adm:profile>
  </adm:property>
</adm:managed-object>
opends/src/admin/defn/org/opends/server/admin/std/SMTPAlertHandlerConfiguration.xml
New file
@@ -0,0 +1,133 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
! CDDL HEADER START
!
! The contents of this file are subject to the terms of the
! Common Development and Distribution License, Version 1.0 only
! (the "License").  You may not use this file except in compliance
! with the License.
!
! You can obtain a copy of the license at
! trunk/opends/resource/legal-notices/OpenDS.LICENSE
! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
! See the License for the specific language governing permissions
! and limitations under the License.
!
! When distributing Covered Code, include this CDDL HEADER in each
! file and include the License file at
! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
! add the following below this CDDL HEADER, with the fields enclosed
! by brackets "[]" replaced with your own identifying information:
!      Portions Copyright [yyyy] [name of copyright owner]
!
! CDDL HEADER END
!
!
!      Portions Copyright 2007 Sun Microsystems, Inc.
! -->
<adm:managed-object name="smtp-alert-handler" plural-name="smtp-alert-handlers"
  package="org.opends.server.admin.std" extends="alert-handler"
  xmlns:adm="http://www.opends.org/admin"
  xmlns:ldap="http://www.opends.org/admin-ldap">
  <adm:synopsis>
    The
    <adm:user-friendly-name />
    may be used to send e-mail messages to notify administrators of significant
    events that occur within the server.
  </adm:synopsis>
  <adm:profile name="ldap">
    <ldap:object-class>
      <ldap:oid>1.3.6.1.4.1.26027.1.2.118</ldap:oid>
      <ldap:name>ds-cfg-smtp-alert-handler</ldap:name>
      <ldap:superior>ds-cfg-alert-handler</ldap:superior>
    </ldap:object-class>
  </adm:profile>
  <adm:property-override name="alert-handler-class">
    <adm:default-behavior>
      <adm:defined>
        <adm:value>
          org.opends.server.extensions.SMTPAlertHandler
        </adm:value>
      </adm:defined>
    </adm:default-behavior>
  </adm:property-override>
  <adm:property name="sender-address" mandatory="true" multi-valued="false">
    <adm:synopsis>
      Specifies the e-mail address to use as the sender for messages generated
      by this alert handler.
    </adm:synopsis>
    <adm:syntax>
      <adm:string />
    </adm:syntax>
    <adm:profile name="ldap">
      <ldap:attribute>
        <ldap:oid>1.3.6.1.4.1.26027.1.1.447</ldap:oid>
        <ldap:name>ds-cfg-sender-address</ldap:name>
      </ldap:attribute>
    </adm:profile>
  </adm:property>
  <adm:property name="recipient-address" mandatory="true" multi-valued="true">
    <adm:synopsis>
      Specifies an e-mail address to which the messages should be sent.
      Multiple values may be provided if there should be more than one
      recipient.
    </adm:synopsis>
    <adm:syntax>
      <adm:string />
    </adm:syntax>
    <adm:profile name="ldap">
      <ldap:attribute>
        <ldap:oid>1.3.6.1.4.1.26027.1.1.448</ldap:oid>
        <ldap:name>ds-cfg-recipient-address</ldap:name>
      </ldap:attribute>
    </adm:profile>
  </adm:property>
  <adm:property name="message-subject" mandatory="true" multi-valued="false">
    <adm:synopsis>
      Specifies the subject that should be used for e-mail messsages generated
      by this alert handler.  The token "%%alert-type%%" will be dynamically
      replaced with the alert type string.  The token "%%alert-id%%" will be
      dynamically replaced with the alert ID value.  The token
      "%%alert-message%%" will be dynamically replaced with the alert message.
      The token "\n" will be replaced with an end-of-line marker.
    </adm:synopsis>
    <adm:syntax>
      <adm:string />
    </adm:syntax>
    <adm:profile name="ldap">
      <ldap:attribute>
        <ldap:oid>1.3.6.1.4.1.26027.1.1.449</ldap:oid>
        <ldap:name>ds-cfg-message-subject</ldap:name>
      </ldap:attribute>
    </adm:profile>
  </adm:property>
  <adm:property name="message-body" mandatory="true" multi-valued="false">
    <adm:synopsis>
      Specifies the body that should be used for e-mail messsages generated
      by this alert handler.  The token "%%alert-type%%" will be dynamically
      replaced with the alert type string.  The token "%%alert-id%%" will be
      dynamically replaced with the alert ID value.  The token
      "%%alert-message%%" will be dynamically replaced with the alert message.
      The token "\n" will be replaced with an end-of-line marker.
    </adm:synopsis>
    <adm:syntax>
      <adm:string />
    </adm:syntax>
    <adm:profile name="ldap">
      <ldap:attribute>
        <ldap:oid>1.3.6.1.4.1.26027.1.1.450</ldap:oid>
        <ldap:name>ds-cfg-message-body</ldap:name>
      </ldap:attribute>
    </adm:profile>
  </adm:property>
</adm:managed-object>
opends/src/server/org/opends/server/core/CoreConfigManager.java
@@ -30,6 +30,8 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import org.opends.server.admin.server.ConfigurationChangeListener;
import org.opends.server.admin.std.server.GlobalCfg;
@@ -46,6 +48,7 @@
import static org.opends.server.messages.ConfigMessages.*;
import static org.opends.server.messages.MessageHandler.*;
import static org.opends.server.util.ServerConstants.*;
@@ -88,10 +91,50 @@
         managementContext.getRootConfiguration();
    // Get the global configuration, register with it as a change listener, and
    // apply the configuration to the server.
    // Get the global configuration and register with it as a change listener.
    GlobalCfg globalConfig = rootConfiguration.getGlobalConfiguration();
    globalConfig.addChangeListener(this);
    // If there are any STMP servers specified, then make sure that if the value
    // contains a colon that the portion after it is an integer between 1 and
    // 65535.
    Set<String> smtpServers = globalConfig.getSMTPServer();
    if (smtpServers != null)
    {
      for (String server : smtpServers)
      {
        int colonPos = server.indexOf(':');
        if ((colonPos == 0) || (colonPos == (server.length()-1)))
        {
          int    msgID   = MSGID_CONFIG_CORE_INVALID_SMTP_SERVER;
          String message = getMessage(msgID, server);
          throw new ConfigException(msgID, message);
        }
        else if (colonPos > 0)
        {
          try
          {
            int port = Integer.parseInt(server.substring(colonPos+1));
            if ((port < 1) || (port > 65535))
            {
              int    msgID   = MSGID_CONFIG_CORE_INVALID_SMTP_SERVER;
              String message = getMessage(msgID, server);
              throw new ConfigException(msgID, message);
            }
          }
          catch (Exception e)
          {
            int    msgID   = MSGID_CONFIG_CORE_INVALID_SMTP_SERVER;
            String message = getMessage(msgID, server);
            throw new ConfigException(msgID, message, e);
          }
        }
      }
    }
    // Apply the configuration to the server.
    applyGlobalConfiguration(globalConfig);
  }
@@ -180,6 +223,34 @@
         globalConfig.isBindWithDNRequiresPassword());
    DirectoryServer.setLookthroughLimit(globalConfig.getLookthroughLimit());
    ArrayList<Properties> mailServerProperties = new ArrayList<Properties>();
    Set<String> smtpServers = globalConfig.getSMTPServer();
    if ((smtpServers != null) && (! smtpServers.isEmpty()))
    {
      for (String smtpServer : smtpServers)
      {
        int colonPos = smtpServer.indexOf(':');
        if (colonPos > 0)
        {
          String smtpHost = smtpServer.substring(0, colonPos);
          String smtpPort = smtpServer.substring(colonPos+1);
          Properties properties = new Properties();
          properties.setProperty(SMTP_PROPERTY_HOST, smtpHost);
          properties.setProperty(SMTP_PROPERTY_PORT, smtpPort);
          mailServerProperties.add(properties);
        }
        else
        {
          Properties properties = new Properties();
          properties.setProperty(SMTP_PROPERTY_HOST, smtpServer);
          mailServerProperties.add(properties);
        }
      }
    }
    DirectoryServer.setMailServerPropertySets(mailServerProperties);
  }
@@ -217,6 +288,43 @@
      configAcceptable = false;
    }
    Set<String> smtpServers = configuration.getSMTPServer();
    if (smtpServers != null)
    {
      for (String server : smtpServers)
      {
        int colonPos = server.indexOf(':');
        if ((colonPos == 0) || (colonPos == (server.length()-1)))
        {
          int    msgID   = MSGID_CONFIG_CORE_INVALID_SMTP_SERVER;
          String message = getMessage(msgID, server);
          unacceptableReasons.add(message);
          configAcceptable = false;
        }
        else if (colonPos > 0)
        {
          try
          {
            int port = Integer.parseInt(server.substring(colonPos+1));
            if ((port < 1) || (port > 65535))
            {
              int    msgID   = MSGID_CONFIG_CORE_INVALID_SMTP_SERVER;
              String message = getMessage(msgID, server);
              unacceptableReasons.add(message);
              configAcceptable = false;
            }
          }
          catch (Exception e)
          {
            int    msgID   = MSGID_CONFIG_CORE_INVALID_SMTP_SERVER;
            String message = getMessage(msgID, server);
            unacceptableReasons.add(message);
            configAcceptable = false;
          }
        }
      }
    }
    return configAcceptable;
  }
opends/src/server/org/opends/server/core/DirectoryServer.java
@@ -361,9 +361,6 @@
  // The set of import task listeners registered with the Directory Server.
  private CopyOnWriteArrayList<ImportTaskListener> importTaskListeners;
  // The sets of mail server properties
  private CopyOnWriteArrayList<Properties> mailServerPropertySets;
  // The set of persistent searches registered with the Directory Server.
  private CopyOnWriteArrayList<PersistentSearch> persistentSearches;
@@ -443,6 +440,9 @@
  // The set of connections that are currently established.
  private LinkedHashSet<ClientConnection> establishedConnections;
  // The sets of mail server properties
  private List<Properties> mailServerPropertySets;
  // The set of schema changes made by editing the schema configuration files
  // with the server offline.
  private List<Modification> offlineSchemaChanges;
@@ -1071,11 +1071,6 @@
      // Initialize information about the mail servers for use by the Directory
      // Server.
      initializeMailServerPropertySets();
      // Initialize the server alert handlers.
      initializeAlertHandlers();
@@ -2045,25 +2040,17 @@
  /**
   * Initializes the set of properties to use to connect to mail servers for
   * sending messages.
   * Specifies the set of mail server properties that should be used for SMTP
   * communication.
   *
   * @throws  ConfigException  If there is a configuration problem with any of
   *                           the mail server entries.
   *
   * @throws  InitializationException  If a problem occurs while initializing
   *                                   the mail server property sets that is not
   *                                   related to the server configuration.
   * @param  mailServerPropertySets  A list of {@code Properties} objects that
   *                                 provide information that can be used to
   *                                 communicate with SMTP servers.
   */
  public void initializeMailServerPropertySets()
         throws ConfigException, InitializationException
  public static void setMailServerPropertySets(List<Properties>
                                                    mailServerPropertySets)
  {
    mailServerPropertySets = new CopyOnWriteArrayList<Properties>();
    // FIXME -- Actually read the information from the config handler.
    Properties defaultProperties = new Properties();
    defaultProperties.setProperty("mail.smtp.host", "127.0.0.1");
    mailServerPropertySets.add(defaultProperties);
    directoryServer.mailServerPropertySets = mailServerPropertySets;
  }
@@ -2075,7 +2062,7 @@
   * @return  The sets of information about the mail servers configured for use
   *          by the Directory Server.
   */
  public static CopyOnWriteArrayList<Properties> getMailServerPropertySets()
  public static List<Properties> getMailServerPropertySets()
  {
    return directoryServer.mailServerPropertySets;
  }
opends/src/server/org/opends/server/extensions/SMTPAlertHandler.java
New file
@@ -0,0 +1,231 @@
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at
 * trunk/opends/resource/legal-notices/OpenDS.LICENSE
 * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at
 * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 * add the following below this CDDL HEADER, with the fields enclosed
 * by brackets "[]" replaced with your own identifying information:
 *      Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 *
 *
 *      Portions Copyright 2006-2007 Sun Microsystems, Inc.
 */
package org.opends.server.extensions;
import java.util.ArrayList;
import java.util.List;
import org.opends.server.admin.server.ConfigurationChangeListener;
import org.opends.server.admin.std.server.AlertHandlerCfg;
import org.opends.server.admin.std.server.SMTPAlertHandlerCfg;
import org.opends.server.api.AlertGenerator;
import org.opends.server.api.AlertHandler;
import org.opends.server.core.DirectoryServer;
import org.opends.server.config.ConfigException;
import org.opends.server.loggers.debug.DebugTracer;
import org.opends.server.types.ConfigChangeResult;
import org.opends.server.types.DebugLogLevel;
import org.opends.server.types.ErrorLogCategory;
import org.opends.server.types.ErrorLogSeverity;
import org.opends.server.types.InitializationException;
import org.opends.server.types.ResultCode;
import org.opends.server.util.EMailMessage;
import static org.opends.server.loggers.ErrorLogger.*;
import static org.opends.server.loggers.debug.DebugLogger.*;
import static org.opends.server.messages.ExtensionsMessages.*;
import static org.opends.server.messages.MessageHandler.*;
import static org.opends.server.util.StaticUtils.*;
/**
 * This class implements a Directory Server alert handler that may be used to
 * send administrative alerts via SMTP.
 */
public class SMTPAlertHandler
       implements AlertHandler<SMTPAlertHandlerCfg>,
                  ConfigurationChangeListener<SMTPAlertHandlerCfg>
{
  /**
   * The tracer object for the debug logger.
   */
  private static final DebugTracer TRACER = getTracer();
  // The current configuration for this alert handler.
  private SMTPAlertHandlerCfg currentConfig;
  /**
   * Creates a new instance of this SMTP alert handler.
   */
  public SMTPAlertHandler()
  {
    super();
    // All initialization should be done in the initializeAlertHandler method.
  }
  /**
   * {@inheritDoc}
   */
  public void initializeAlertHandler(SMTPAlertHandlerCfg configuration)
       throws ConfigException, InitializationException
  {
    // Make sure that the Directory Server is configured with information about
    // at least one SMTP server.
    if ((DirectoryServer.getMailServerPropertySets() == null) ||
        DirectoryServer.getMailServerPropertySets().isEmpty())
    {
      int    msgID   = MSGID_SMTPALERTHANDLER_NO_SMTP_SERVERS;
      String message = getMessage(msgID);
      throw new ConfigException(msgID, message);
    }
    configuration.addSMTPChangeListener(this);
    currentConfig = configuration;
  }
  /**
   * {@inheritDoc}
   */
  public boolean isConfigurationAcceptable(AlertHandlerCfg configuration,
                                           List<String> unacceptableReasons)
  {
    return true;
  }
  /**
   * {@inheritDoc}
   */
  public void finalizeAlertHandler()
  {
    // No action is required.
  }
  /**
   * {@inheritDoc}
   */
  public void sendAlertNotification(AlertGenerator generator, String alertType,
                                    int alertID, String alertMessage)
  {
    SMTPAlertHandlerCfg cfg = currentConfig;
    ArrayList<String> recipients =
         new ArrayList<String>(cfg.getRecipientAddress());
    String alertIDStr = String.valueOf(alertID);
    String subject = replaceTokens(cfg.getMessageSubject(), alertType,
                                   alertIDStr, alertMessage);
    String body = replaceTokens(cfg.getMessageBody(), alertType, alertIDStr,
                                alertMessage);
    EMailMessage message = new EMailMessage(cfg.getSenderAddress(), recipients,
                                            subject);
    message.setBody(wrapText(body, 75));
    try
    {
      message.send();
    }
    catch (Exception e)
    {
      if (debugEnabled())
      {
        TRACER.debugCaught(DebugLogLevel.ERROR, e);
      }
      int msgID = MSGID_SMTPALERTHANDLER_ERROR_SENDING_MESSAGE;
      String msg = getMessage(msgID, alertType, alertMessage,
                              stackTraceToSingleLineString(e));
      logError(ErrorLogCategory.CORE_SERVER, ErrorLogSeverity.SEVERE_WARNING,
               msg, msgID);
    }
  }
  /**
   * Replaces any occurrences of special tokens in the given string with the
   * appropriate value.  Tokens supported include:
   * <UL>
   *   <LI>%%alert-type%% -- Will be replaced with the alert type string</LI>
   *   <LI>%%alert-id%% -- Will be replaced with the alert ID value</LI>
   *   <LI>%%alert-message%% -- Will be replaced with the alert message</LI>
   *   <LI>\n -- Will be replaced with an end-of-line character.
   * </UL>
   *
   * @param  s             The string to be processed.
   * @param  alertType     The string to use to replace the "%%alert-type%%"
   *                       token.
   * @param  alertID       The string to use to replace the "%%alert-id%%"
   *                       token.
   * @param  alertMessage  The string to use to replace the "%%alert-message%%"
   *                       token.
   *
   * @return  A processed version of the provided string.
   */
  private String replaceTokens(String s, String alertType, String alertID,
                               String alertMessage)
  {
    return s.replace("%%alert-type%%", alertType).
             replace("%%alert-id%%", alertID).
             replace("%%alert-message%%", alertMessage).
             replace("\\n", "\r\n");
  }
  /**
   * {@inheritDoc}
   */
  public boolean isConfigurationChangeAcceptable(
                      SMTPAlertHandlerCfg configuration,
                      List<String> unacceptableReasons)
  {
    return true;
  }
  /**
   * {@inheritDoc}
   */
  public ConfigChangeResult applyConfigurationChange(
                                 SMTPAlertHandlerCfg configuration)
  {
    currentConfig = configuration;
    return new ConfigChangeResult(ResultCode.SUCCESS, false);
  }
}
opends/src/server/org/opends/server/messages/ConfigMessages.java
@@ -7057,6 +7057,16 @@
  /**
   * The message ID for the message that will be used if an SMTP server value is
   * not properly-formed.  This takes a single argument, which is the invalid
   * server value.
   */
  public static final int MSGID_CONFIG_CORE_INVALID_SMTP_SERVER =
       CATEGORY_MASK_CONFIG | SEVERITY_MASK_SEVERE_ERROR | 697;
  /**
   * Associates a set of generic messages with the message IDs defined in this
   * class.
   */
@@ -7649,6 +7659,12 @@
                    "Configuration entry %s has an invalid value for " +
                    "configuration attribute " + ATTR_NOTIFY_ABANDONED_OPS +
                    " (it should be a Boolean value of true or false):  %s");
    registerMessage(MSGID_CONFIG_CORE_INVALID_SMTP_SERVER,
                    "The provided SMTP server value '%s' is invalid.  An " +
                    "SMTP server value must have an IP address or a " +
                    "resolvable name, and it may optionally be followed by a " +
                    "colon and an integer value between 1 and 65535 to " +
                    "specify the server port number");
    registerMessage(MSGID_CONFIG_CORE_INVALID_PROXY_MAPPER_DN,
                    "Configuration entry %s has an invalid value for " +
                    "configuration attribute " + ATTR_PROXY_MAPPER_DN +
opends/src/server/org/opends/server/messages/ExtensionsMessages.java
@@ -5512,6 +5512,27 @@
  /**
   * The message ID for the message that will be used if the Directory Server is
   * not configured with information about any SMTP servers.  This does not take
   * any configuration arguments.
   */
  public static final int MSGID_SMTPALERTHANDLER_NO_SMTP_SERVERS =
       CATEGORY_MASK_EXTENSIONS | SEVERITY_MASK_MILD_ERROR | 531;
  /**
   * The message ID for the message that will be used if an error occurs while
   * trying to send an e-mail message.  This takes three arguments, which are
   * the alert type, the alert message, and a string representation of the
   * exception that was caught.
   */
  public static final int MSGID_SMTPALERTHANDLER_ERROR_SENDING_MESSAGE =
       CATEGORY_MASK_EXTENSIONS | SEVERITY_MASK_SEVERE_WARNING | 532;
  /**
   * Associates a set of generic messages with the message IDs defined in this
   * class.
   */
@@ -7919,6 +7940,17 @@
                    "The password policy state extended request included an " +
                    "operation with an invalid or unsupported operation type " +
                    "of %s");
    registerMessage(MSGID_SMTPALERTHANDLER_NO_SMTP_SERVERS,
                    "The Directory Server is not configured with any " +
                    "SMTP servers.  The SMTP alert handler cannot be used " +
                    "unless the Directory Server is configured with " +
                    "information about at least one SMTP server");
    registerMessage(MSGID_SMTPALERTHANDLER_ERROR_SENDING_MESSAGE,
                    "An error occurred when trying to send an e-mail message " +
                    "for administrative alert with type %s and message %s:  " +
                    "%s");
  }
}
opends/src/server/org/opends/server/util/EMailMessage.java
@@ -46,10 +46,10 @@
import javax.mail.internet.MimeMultipart;
import org.opends.server.core.DirectoryServer;
import static org.opends.server.loggers.debug.DebugLogger.*;
import org.opends.server.loggers.debug.DebugTracer;
import org.opends.server.types.DebugLogLevel;
import static org.opends.server.loggers.debug.DebugLogger.*;
import static org.opends.server.messages.MessageHandler.*;
import static org.opends.server.messages.UtilityMessages.*;
@@ -123,7 +123,9 @@
    this.recipients = recipients;
    this.subject    = subject;
    body = new StringBuilder();
    body         = new StringBuilder();
    attachments  = new LinkedList<MimeBodyPart>();
    bodyMIMEType = "text/plain";
  }
@@ -427,6 +429,7 @@
      try
      {
        Transport.send(message);
        return;
      }
      catch (SendFailedException sfe)
      {
opends/src/server/org/opends/server/util/ServerConstants.java
@@ -2552,5 +2552,21 @@
   */
  public static final String SCHEMA_BASE_FILE_NAME_WITHOUT_REVISION  =
       "schema.ldif.";
  /**
   * The name of the JavaMail property that can be used to specify the address
   * of the SMTP server.
   */
  public static final String SMTP_PROPERTY_HOST = "mail.smtp.host";
  /**
   * The name of the JavaMail property that can be used to specify the port for
   * the SMTP server.
   */
  public static final String SMTP_PROPERTY_PORT = "mail.smtp.port";
}