docs: def configure(self, config_file):
          """
          Parse configuration, and setup objects to use it.
  
          """
          cfg = configparser.RawConfigParser()
          try:
              cfg.readfp(open(config_file))
          except IOError as err:
              logger.critical(
                  'Error while reading config file {}: {}'.format(
                      config_file, err.strerror))
              sys.exit(1)
          logger.info('Parsed config file ' + config_file)
  
          # Extract user-defined log level from configuration
          if cfg.has_option('milter', 'loglevel'):
              loglevel = cfg.get('milter', 'loglevel')
              loglevel_numeric = getattr(logging, loglevel.upper(), None)
              if not isinstance(loglevel_numeric, int):
                  logger.critical(
                      'Config contains unsupported loglevel: ' + loglevel)
                  exit(1)
              rl = logging.getLogger()
              rl.setLevel(loglevel_numeric)
              logger.debug(
                  'Config option applied: milter->loglevel: {}'.format(loglevel))
  
          # Apply all config options to their respective classes
          section_class_map = {
              'milter': self,
              'dspam': DspamClient,
              'classification': DspamMilter,
          }
          for section in cfg.sections():
              try:
                  class_ = section_class_map[section]
              except KeyError:
                  logger.warning('Config contains unknown section: ' + section)
                  continue
              logger.debug('Handling config section: ' + section)
  
              dict_options = [
                  'headers',
                  'reject_classes',
                  'quarantine_classes',
                  'accept_classes'
              ]
              for option in cfg.options(section):
                  # Kludge: static_user needs to be set on the milter,
                  #   not on the client
                  if section == 'dspam' and option == 'static_user':
                      value = cfg.get('dspam', 'static_user')
                      DspamMilter.static_user = value
                      logger.debug(
                          'Config option applied: dspam->static_user: {}'.format(
                              value))
                      continue
  
                  if not hasattr(class_, option):
                      logger.warning(
                          'Config contains unknown option: {}->{}'.format(
                              section, option))
                      continue
  
                  value = cfg.get(section, option)
                  if option in dict_options:
                      value = utils.config_str2dict(value)
                  elif value.lower() in ['false', 'no']:
                      value = False
                  elif value.lower() in ['true', 'yes']:
                      value = True
  
                  setattr(class_, option, value)
                  logger.debug(
                      'Config option applied: {}->{}: {}'.format(
                          section, option, value))
          logger.debug('Configuration completed')