function bayesspam_get_probability(&$imapConnection, $message_id, $no_cache = 0, $internal_use = 1)
{
    if ($GLOBALS['bayesdbhandle'] == null) {
        return;
    }
    bayesspam_set_message_id($imapConnection, $message_id);
    $GLOBALS['bayes_was_cached'] = 1;
    if (($is_spam = bayesspam_get_old_message_score()) === FALSE && $internal_use || $no_cache || isset($_REQUEST['bayes_recache']) && $_REQUEST['bayes_recache'] == 1) {
        if ($GLOBALS['bayesspam_do_timing']) {
            if (!isset($GLOBALS['bayes_parse_time']) || !$GLOBALS['bayes_parse_time']) {
                $GLOBALS['bayes_parse_time'] = 0;
                $GLOBALS['bayes_parsed_messages'] = 0;
            }
            list($fractions, $seconds) = split(" ", microtime());
            $start_time = $fractions + $seconds;
        }
        if (!isset($GLOBALS['bayesspam_tokens']) || !$GLOBALS['bayesspam_tokens'] || $GLOBALS['bayesspam_tokens_message'] != $message_id) {
            $GLOBALS['bayesspam_tokens'] = bayesspam_get_tokens($imapConnection, $message_id);
            $GLOBALS['bayesspam_tokens_message'] = $message_id;
        }
        if (!isset($_SESSION['bayesspam_corpus']) || !$_SESSION['bayesspam_corpus']) {
            $_SESSION['bayesspam_corpus'] = bayesspam_get_corpus();
        }
        $most_interesting = bayesspam_get_interesting_tokens($GLOBALS['bayesspam_tokens'], $_SESSION['bayesspam_corpus']);
        $prod = 1;
        $minus_one_prod = 1;
        $GLOBALS['bayes_scoring_tokens'] = 0;
        foreach ($most_interesting as $value) {
            $GLOBALS['bayes_scoring_tokens'] += $_SESSION['bayesspam_corpus']['token' . $GLOBALS['bayesspam_tokens'][$value[0]]][1];
            $prod *= $_SESSION['bayesspam_corpus']['token' . $GLOBALS['bayesspam_tokens'][$value[0]]][0];
            $minus_one_prod *= 1.0 - $_SESSION['bayesspam_corpus']['token' . $GLOBALS['bayesspam_tokens'][$value[0]]][0];
        }
        unset($most_interesting);
        $is_spam = $prod / ($prod + $minus_one_prod);
        bayesspam_cache_message_score($is_spam, $GLOBALS['bayes_scoring_tokens']);
        $GLOBALS['bayes_was_cached'] = 0;
        if ($GLOBALS['bayesspam_do_timing']) {
            list($fractions, $seconds) = split(" ", microtime());
            $GLOBALS['bayes_parse_time'] += $fractions + $seconds - $start_time;
            $GLOBALS['bayes_parsed_messages']++;
        }
        return $is_spam;
    }
    $GLOBALS['bayes_scoring_tokens'] = $is_spam[1];
    return $is_spam[0];
}
function bayesspam_filters($imap_stream, $use_mailbox = 0)
{
    $spam_stats = 0;
    $ham_stats = 0;
    $unsure_stats = 0;
    $total_messages = 0;
    $run_folders = array();
    $boxes = sqimap_mailbox_list($imap_stream);
    foreach ($boxes as $box) {
        if ($GLOBALS['bayesspam_inboxonly'] != 1 || $GLOBALS['bayesspam_inboxonly'] == 1 && 'INBOX' == $box['unformatted-dm']) {
            if ($use_mailbox == 1 && $box['unformatted-dm'] == $GLOBALS['mailbox'] && !in_array($box['unformatted-dm'], $GLOBALS['bayesspam_ignore_folders']) || $use_mailbox == 0 && !in_array($box['unformatted-dm'], $GLOBALS['bayesspam_ignore_folders'])) {
                if ((array_search('noselect', $box['flags']) === FALSE || array_search('noselect', $box['flags']) === NULL) && $GLOBALS['sent_folder'] != $box['unformatted-dm'] && sqimap_unseen_messages($imap_stream, $box['unformatted-dm']) > 0) {
                    $run_folders[] = $box['unformatted-dm'];
                }
            }
        }
    }
    foreach ($run_folders as $box) {
        $spam_messages = array();
        $uncertain_messages = array();
        $mbxresponse = sqimap_mailbox_select($imap_stream, $box);
        $messages = array();
        $search = "SEARCH UNSEEN UNDELETED";
        if (isset($_SESSION['bayesspam_last_filter'])) {
            $search .= " SINCE " . date('d-M-Y', $_SESSION['bayesspam_last_filter']);
        }
        $_SESSION['bayesspam_last_filter'] = time();
        $read = sqimap_run_command($imap_stream, $search, TRUE, $response, $message, TRUE);
        if (isset($read[0])) {
            for ($i = 0, $iCnt = count($read); $i < $iCnt; ++$i) {
                if (preg_match("/^\\* SEARCH (.+)\$/", $read[$i], $regs)) {
                    $messages = preg_split("/ /", trim($regs[1]));
                    break;
                }
            }
        }
        foreach ($messages as $passed_id) {
            bayesspam_set_message_id($imap_stream, $passed_id);
            $bayesspam_check_messageid = bayesspam_check_messageid();
            if ($GLOBALS['bayesspam_do_stats'] && $GLOBALS['bayesspam_do_user_stats']) {
                $bayesspam_old_message_score = bayesspam_get_old_message_score();
            }
            $is_spam = bayesspam_get_probability($imap_stream, $passed_id, 1);
            if ($is_spam > 0.9) {
                $spam_messages[] = $passed_id;
            } elseif ($is_spam >= 0.1) {
                $uncertain_messages[] = $passed_id;
            }
            if ($GLOBALS['bayesspam_do_stats'] && $GLOBALS['bayesspam_do_user_stats'] && $bayesspam_old_message_score === FALSE) {
                if ($is_spam > 0.9) {
                    $spam_stats++;
                    $total_messages++;
                }
                if ($is_spam <= 0.9 && $is_spam >= 0.1) {
                    $unsure_stats++;
                    $total_messages++;
                }
                if ($is_spam < 0.1) {
                    $ham_stats++;
                    $total_messages++;
                }
            }
        }
        if ($spam_messages) {
            $message_str = sqimap_message_list_squisher($spam_messages);
            if ($GLOBALS['bayesspam_delete']) {
                sqimap_run_command($imap_stream, 'STORE ' . $message_str . ' +FLAGS (\\Deleted)', true, $response, $message, $GLOBALS['uid_support']);
            } elseif (sqimap_mailbox_exists($imap_stream, $GLOBALS['bayesspam_folder'])) {
                sqimap_run_command($imap_stream, 'COPY ' . $message_str . ' "' . $GLOBALS['bayesspam_folder'] . '"', true, $response, $message, $GLOBALS['uid_support']);
                sqimap_run_command($imap_stream, 'STORE ' . $message_str . ' +FLAGS (\\Deleted)', true, $response, $message, $GLOBALS['uid_support']);
            }
            sqimap_mailbox_expunge($imap_stream, $box);
        }
        if ($uncertain_messages && $GLOBALS['bayesspam_do_uncertain_filtering']) {
            $message_str = sqimap_message_list_squisher($uncertain_messages);
            if (sqimap_mailbox_exists($imap_stream, $GLOBALS['bayesspam_uncertain_folder'])) {
                sqimap_run_command($imap_stream, 'COPY ' . $message_str . ' "' . $GLOBALS['bayesspam_uncertain_folder'] . '"', true, $response, $message, $GLOBALS['uid_support']);
                sqimap_run_command($imap_stream, 'STORE ' . $message_str . ' +FLAGS (\\Deleted)', true, $response, $message, $GLOBALS['uid_support']);
            }
            sqimap_mailbox_expunge($imap_stream, $box);
        }
    }
    if ($GLOBALS['bayesspam_do_stats'] && $GLOBALS['bayesspam_do_user_stats'] && $total_messages) {
        $res = $GLOBALS['bayesdbhandle']->query('SELECT UserName FROM ' . $GLOBALS['bayesdbprefix'] . 'stats WHERE UserName=\'' . $GLOBALS['bayes_username'] . '\'');
        if (!DB::isError($res) && !($row = $res->fetchRow())) {
            $GLOBALS['bayesdbhandle']->query('INSERT INTO ' . $GLOBALS['bayesdbprefix'] . 'stats SET StatsStart=NOW(),UserName=\'' . $GLOBALS['bayes_username'] . '\',TotalMessages=' . $total_messages . ',HamMessages=' . $ham_stats . ',SpamMessages=' . $spam_stats . ',UnsureMessages=' . $unsure_stats . ($GLOBALS['bayesspam_do_timing'] ? ',TimedMessages=' . $GLOBALS['bayes_parsed_messages'] . ',TotalParseTime=' . $GLOBALS['bayes_parse_time'] : ''));
        } else {
            $GLOBALS['bayesdbhandle']->query('UPDATE ' . $GLOBALS['bayesdbprefix'] . 'stats SET TotalMessages=TotalMessages+' . $total_messages . ',HamMessages=HamMessages+' . $ham_stats . ',SpamMessages=SpamMessages+' . $spam_stats . ', UnsureMessages=UnsureMessages+' . $unsure_stats . ($GLOBALS['bayesspam_do_timing'] ? ',TimedMessages=TimedMessages+' . $GLOBALS['bayes_parsed_messages'] . ',TotalParseTime=TotalParseTime+' . $GLOBALS['bayes_parse_time'] : '') . ' WHERE UserName=\'' . $GLOBALS['bayes_username'] . '\'');
        }
    }
}