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(); }