Index: branches/5.3.x/core/units/helpers/mailing_list_helper.php =================================================================== diff -u -N -r15698 -r15916 --- branches/5.3.x/core/units/helpers/mailing_list_helper.php (.../mailing_list_helper.php) (revision 15698) +++ branches/5.3.x/core/units/helpers/mailing_list_helper.php (.../mailing_list_helper.php) (revision 15916) @@ -1,6 +1,6 @@ getTableName(); // update sent email count for each processed mailing - foreach ($mailing_totals as $mailing_id => $mailing_total) { + foreach ( $mailing_totals as $mailing_id => $mailing_total ) { $sql = 'UPDATE ' . $table_name . ' SET EmailsSent = EmailsSent + ' . $mailing_total . ' WHERE ' . $config->getIDField() . ' = ' . $mailing_id; @@ -266,37 +268,42 @@ } /** - * Sent given messages from email queue + * Sent given messages from email queue. * - * @param Array $messages + * @return integer */ - function processQueue(&$messages) + function processQueue() { $esender = $this->Application->recallObject('EmailSender'); /* @var $esender kEmailSendingHelper */ - $queue_table = $this->Application->getUnitConfig('email-queue')->getTableName(); + $messages = $this->getMessages(); + $message_count = count($messages); + if ( !$message_count ) { + return 0; + } + $i = 0; - $message = Array (); - $mailing_totals = Array (); - $message_count = count($messages); + $message = Array(); + $mailing_totals = Array(); + $queue_table = $this->Application->getUnitConfig('email-queue')->getTableName(); - while ($i < $message_count) { + while ( $i < $message_count ) { $message[0] = unserialize($messages[$i]['MessageHeaders']); $message[1] =& $messages[$i]['MessageBody']; - $esender->setLogData( unserialize($messages[$i]['LogData']) ); + $esender->setLogData(unserialize($messages[$i]['LogData'])); $delivered = $esender->Deliver($message, true); // immediate send! - if ($delivered) { + if ( $delivered ) { // send succeeded, delete from queue $sql = 'DELETE FROM ' . $queue_table . ' WHERE EmailQueueId = ' . $messages[$i]['EmailQueueId']; $this->Conn->Query($sql); $mailing_id = $messages[$i]['MailingId']; - if (!array_key_exists($mailing_id, $mailing_totals)) { + if ( !array_key_exists($mailing_id, $mailing_totals) ) { $mailing_totals[$mailing_id] = 0; } $mailing_totals[$mailing_id]++; @@ -312,5 +319,68 @@ } $this->_updateSentTotals($mailing_totals); + + return $message_count; } + + /** + * Returns queued messages (or their count), that can be sent + * + * @param bool $count_only + * + * @return Array|int + * @access public + */ + public function getMessages($count_only = false) + { + $deliver_count = $this->getSetting('MailingListSendPerStep'); + + if ( !is_numeric($deliver_count) ) { + return $count_only ? 0 : Array(); + } + + $queue_table = $this->Application->getUnitConfig('email-queue')->getTableName(); + + if ( $count_only ) { + $sql = 'SELECT COUNT(*) + FROM ' . $queue_table . ' + WHERE (SendRetries < 5) AND (LastSendRetry < ' . strtotime('-2 hours') . ')'; + + return $this->Conn->GetOne($sql); + } + + // regular e-mails are pressed before mailing generated ones ! + $sql = 'SELECT * + FROM ' . $queue_table . ' + WHERE (SendRetries < 5) AND (LastSendRetry < ' . strtotime('-2 hours') . ') + ORDER BY MailingId ASC + LIMIT 0,' . $deliver_count; + + return $this->Conn->Query($sql); + } + + /** + * Allows to safely get mailing configuration variable + * + * @param string $variable_name + * + * @return int + * @access public + */ + public function getSetting($variable_name) + { + $value = $this->Application->ConfigValue($variable_name); + + if ( $value === false ) { + // ensure default value, when configuration variable is missing + return 10; + } + + if ( !$value ) { + // configuration variable found, but it's value is empty or zero + return false; + } + + return $value; + } } \ No newline at end of file