Ensure the value is set for the specified setting.

    .. note::

        The setting names are case-sensitive.

    :param str settings: A dictionary of the setting names and their values.
    :param str server: The SMTP server name.

    Example of usage:

    .. code-block:: yaml

        smtp-settings:
            win_smtp_server.server_setting:
                - settings:
                    LogType: 1
                    LogFilePeriod: 1
                    MaxMessageSize: 16777216
                    MaxRecipients: 10000
                    MaxSessionSize: 16777216

def server_setting(name, settings=None, server=_DEFAULT_SERVER):
    '''
    Ensure the value is set for the specified setting.

    .. note::

        The setting names are case-sensitive.

    :param str settings: A dictionary of the setting names and their values.
    :param str server: The SMTP server name.

    Example of usage:

    .. code-block:: yaml

        smtp-settings:
            win_smtp_server.server_setting:
                - settings:
                    LogType: 1
                    LogFilePeriod: 1
                    MaxMessageSize: 16777216
                    MaxRecipients: 10000
                    MaxSessionSize: 16777216
    '''
    ret = {'name': name,
           'changes': {},
           'comment': six.text_type(),
           'result': None}

    if not settings:
        ret['comment'] = 'No settings to change provided.'
        ret['result'] = True
        return ret

    ret_settings = dict()
    ret_settings['changes'] = {}
    ret_settings['failures'] = {}

    current_settings = __salt__['win_smtp_server.get_server_setting'](settings=settings.keys(),
                                                                      server=server)
    for key in settings:
        # Some fields are formatted like '{data}'. Salt/Python converts these to dicts
        # automatically on input, so convert them back to the proper format.
        settings = _normalize_server_settings(**settings)

        if six.text_type(settings[key]) != six.text_type(current_settings[key]):
            ret_settings['changes'][key] = {'old': current_settings[key],
                                            'new': settings[key]}
    if not ret_settings['changes']:
        ret['comment'] = 'Settings already contain the provided values.'
        ret['result'] = True
        return ret
    elif __opts__['test']:
        ret['comment'] = 'Settings will be changed.'
        ret['changes'] = ret_settings
        return ret

    __salt__['win_smtp_server.set_server_setting'](settings=settings, server=server)
    new_settings = __salt__['win_smtp_server.get_server_setting'](settings=settings.keys(),
                                                                  server=server)
    for key in settings:
        if six.text_type(new_settings[key]) != six.text_type(settings[key]):
            ret_settings['failures'][key] = {'old': current_settings[key],
                                             'new': new_settings[key]}
            ret_settings['changes'].pop(key, None)

    if ret_settings['failures']:
        ret['comment'] = 'Some settings failed to change.'
        ret['changes'] = ret_settings
        ret['result'] = False
    else:
        ret['comment'] = 'Set settings to contain the provided values.'
        ret['changes'] = ret_settings['changes']
        ret['result'] = True
    return ret