function qa_mailing_perform_step()
{
    require_once QA_INCLUDE_DIR . 'qa-db-users.php';
    $lastuserid = qa_opt('mailing_last_userid');
    if (strlen($lastuserid)) {
        $thistime = time();
        $lasttime = qa_opt('mailing_last_timestamp');
        $perminute = qa_opt('mailing_per_minute');
        if ($lasttime - $thistime > 60) {
            // if it's been a while, we assume there hasn't been continuous mailing...
            $lasttime = $thistime - 1;
        } else {
            // otherwise...
            $lasttime = max($lasttime, $thistime - 6);
        }
        // ... don't do more than 6 seconds' worth
        $count = min(floor(($thistime - $lasttime) * $perminute / 60), 100);
        // don't do more than 100 messages at a time
        if ($count > 0) {
            qa_opt('mailing_last_timestamp', $thistime + 30);
            // prevents a parallel call to qa_mailing_perform_step() from sending messages, unless we're very unlucky with timing (poor man's mutex)
            $sentusers = 0;
            $users = qa_db_users_get_mailing_next($lastuserid, $count);
            if (count($users)) {
                foreach ($users as $user) {
                    $lastuserid = max($lastuserid, $user['userid']);
                }
                qa_opt('mailing_last_userid', $lastuserid);
                qa_opt('mailing_done_users', qa_opt('mailing_done_users') + count($users));
                foreach ($users as $user) {
                    if (!($user['flags'] & QA_USER_FLAGS_NO_MAILINGS)) {
                        qa_mailing_send_one($user['userid'], $user['handle'], $user['email'], $user['emailcode']);
                        $sentusers++;
                    }
                }
                qa_opt('mailing_last_timestamp', $lasttime + $sentusers * 60 / $perminute);
                // can be floating point result, based on number of mails actually sent
            } else {
                qa_mailing_stop();
            }
        }
    }
}
                } else {
                    $errors['avatar_default_show'] = qa_lang_sub('main/image_not_read', implode(', ', qa_gd_image_formats()));
                }
            }
        }
    }
}
//	Mailings management
if ($adminsection == 'mailing') {
    if (qa_clicked('domailingtest') || qa_clicked('domailingstart') || qa_clicked('domailingresume') || qa_clicked('domailingcancel')) {
        if (!qa_check_form_security_code('admin/' . $adminsection, qa_post_text('code'))) {
            $securityexpired = true;
        } else {
            if (qa_clicked('domailingtest')) {
                $email = qa_get_logged_in_email();
                if (qa_mailing_send_one(qa_get_logged_in_userid(), qa_get_logged_in_handle(), $email, qa_get_logged_in_user_field('emailcode'))) {
                    $formokhtml = qa_lang_html_sub('admin/test_sent_to_x', qa_html($email));
                } else {
                    $formokhtml = qa_lang_html('main/general_error');
                }
            }
            if (qa_clicked('domailingstart')) {
                qa_mailing_start();
                $startmailing = true;
            }
            if (qa_clicked('domailingresume')) {
                $startmailing = true;
            }
            if (qa_clicked('domailingcancel')) {
                qa_mailing_stop();
            }