From de02a7fc3f03a8549535fc0cd05d615390bbd146 Mon Sep 17 00:00:00 2001 From: pupi1985 Date: Thu, 16 Aug 2018 00:47:38 -0300 Subject: [PATCH 1/2] Avoid sending emails to blocked and unapproved users --- qa-include/app/mailing.php | 13 ++++++++++--- qa-include/db/users.php | 2 +- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/qa-include/app/mailing.php b/qa-include/app/mailing.php index 1e78d09b7..fed89b378 100644 --- a/qa-include/app/mailing.php +++ b/qa-include/app/mailing.php @@ -59,6 +59,7 @@ function qa_mailing_stop() function qa_mailing_perform_step() { require_once QA_INCLUDE_DIR . 'db/users.php'; + require_once QA_INCLUDE_DIR . 'app/users.php'; $lastuserid = qa_opt('mailing_last_userid'); @@ -89,11 +90,17 @@ function qa_mailing_perform_step() qa_opt('mailing_last_userid', $lastuserid); qa_opt('mailing_done_users', qa_opt('mailing_done_users') + count($users)); + $isModeratingUsers = qa_opt('moderate_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++; + if (($user['flags'] & QA_USER_FLAGS_NO_MAILINGS) || // exclude users who don't want to get the mailings + ($user['flags'] & QA_USER_FLAGS_USER_BLOCKED) || // exclude blocked users + ($isModeratingUsers && ($user['level'] < QA_USER_LEVEL_APPROVED))) { // if moderating users exclude unapproved users + continue; } + + 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 diff --git a/qa-include/db/users.php b/qa-include/db/users.php index 9b90a92ee..95a11b1d1 100644 --- a/qa-include/db/users.php +++ b/qa-include/db/users.php @@ -376,7 +376,7 @@ function qa_db_user_levels_set($userid, $userlevels) function qa_db_users_get_mailing_next($lastuserid, $count) { return qa_db_read_all_assoc(qa_db_query_sub( - 'SELECT userid, email, handle, emailcode, flags FROM ^users WHERE userid># ORDER BY userid LIMIT #', + 'SELECT userid, email, handle, emailcode, flags, level FROM ^users WHERE userid># ORDER BY userid LIMIT #', $lastuserid, $count )); } From 306a9bec95fc3315028e78389b905f8b0e58d9fa Mon Sep 17 00:00:00 2001 From: pupi1985 Date: Thu, 16 Aug 2018 01:07:33 -0300 Subject: [PATCH 2/2] Apply some early returns in function qa_mailing_perform_step() --- qa-include/app/mailing.php | 71 ++++++++++++++++++++------------------ 1 file changed, 38 insertions(+), 33 deletions(-) diff --git a/qa-include/app/mailing.php b/qa-include/app/mailing.php index fed89b378..3f65c3e96 100644 --- a/qa-include/app/mailing.php +++ b/qa-include/app/mailing.php @@ -63,51 +63,56 @@ function qa_mailing_perform_step() $lastuserid = qa_opt('mailing_last_userid'); - if (strlen($lastuserid)) { - $thistime = time(); - $lasttime = qa_opt('mailing_last_timestamp'); - $perminute = qa_opt('mailing_per_minute'); + if (strlen($lastuserid) == 0) { + return; + } - if (($lasttime - $thistime) > 60) // if it's been a while, we assume there hasn't been continuous mailing... - $lasttime = $thistime - 1; // ... so only do 1 second's worth - else // otherwise... - $lasttime = max($lasttime, $thistime - 6); // ... don't do more than 6 seconds' worth + $thistime = time(); + $lasttime = qa_opt('mailing_last_timestamp'); + $perminute = qa_opt('mailing_per_minute'); - $count = min(floor(($thistime - $lasttime) * $perminute / 60), 100); // don't do more than 100 messages at a time + if (($lasttime - $thistime) > 60) // if it's been a while, we assume there hasn't been continuous mailing... + $lasttime = $thistime - 1; // ... so only do 1 second's worth + else // otherwise... + $lasttime = max($lasttime, $thistime - 6); // ... don't do more than 6 seconds' worth - 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) + $count = min(floor(($thistime - $lasttime) * $perminute / 60), 100); // don't do more than 100 messages at a time - $sentusers = 0; - $users = qa_db_users_get_mailing_next($lastuserid, $count); + if ($count == 0) { + return; + } - if (count($users)) { - foreach ($users as $user) { - $lastuserid = max($lastuserid, $user['userid']); - } + 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) - qa_opt('mailing_last_userid', $lastuserid); - qa_opt('mailing_done_users', qa_opt('mailing_done_users') + count($users)); + $sentusers = 0; + $users = qa_db_users_get_mailing_next($lastuserid, $count); - $isModeratingUsers = qa_opt('moderate_users'); + if (count($users)) { + foreach ($users as $user) { + $lastuserid = max($lastuserid, $user['userid']); + } - foreach ($users as $user) { - if (($user['flags'] & QA_USER_FLAGS_NO_MAILINGS) || // exclude users who don't want to get the mailings - ($user['flags'] & QA_USER_FLAGS_USER_BLOCKED) || // exclude blocked users - ($isModeratingUsers && ($user['level'] < QA_USER_LEVEL_APPROVED))) { // if moderating users exclude unapproved users - continue; - } + qa_opt('mailing_last_userid', $lastuserid); + qa_opt('mailing_done_users', qa_opt('mailing_done_users') + count($users)); - qa_mailing_send_one($user['userid'], $user['handle'], $user['email'], $user['emailcode']); - $sentusers++; - } + $isModeratingUsers = qa_opt('moderate_users'); - qa_opt('mailing_last_timestamp', $lasttime + $sentusers * 60 / $perminute); // can be floating point result, based on number of mails actually sent + foreach ($users as $user) { + if (($user['flags'] & QA_USER_FLAGS_NO_MAILINGS) || // exclude users who don't want to get the mailings + ($user['flags'] & QA_USER_FLAGS_USER_BLOCKED) || // exclude blocked users + ($isModeratingUsers && ($user['level'] < QA_USER_LEVEL_APPROVED))) { // if moderating users exclude unapproved users + continue; + } - } else - qa_mailing_stop(); + 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(); } }