<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 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')