Index: trunk/core/units/email_events/email_events_event_handler.php =================================================================== diff -u -N -r8104 -r8397 --- trunk/core/units/email_events/email_events_event_handler.php (.../email_events_event_handler.php) (revision 8104) +++ trunk/core/units/email_events/email_events_event_handler.php (.../email_events_event_handler.php) (revision 8397) @@ -18,9 +18,11 @@ { parent::mapPermissions(); $permissions = Array( - 'OnFrontOnly' => Array('self' => 'edit'), - 'OnSaveSelected' => Array('self' => 'view'), - ); + 'OnFrontOnly' => Array('self' => 'edit'), + 'OnSaveSelected' => Array('self' => 'view'), + + 'OnProcessEmailQueue' => Array('self' => 'add|edit'), + ); $this->permMapping = array_merge($this->permMapping, $permissions); } @@ -249,10 +251,10 @@ // 3. replace tags if needed $default_replacement_tags = Array ( ' ' ' 'GetDBField('ReplacementTags'); $replacement_tags = $replacement_tags ? unserialize($replacement_tags) : Array (); $replacement_tags = array_merge_recursive2($default_replacement_tags, $replacement_tags); @@ -376,5 +378,88 @@ $this->Application->removeObject('u.email-from'); $this->Application->removeObject('u.email-to'); } + + /** + * Process emails from queue + * + * @param kEvent $event + */ + function OnProcessEmailQueue(&$event) + { + $deliver_count = $event->getEventParam('deliver_count'); + if ($deliver_count === false) { + $deliver_count = 10; // 10 emails per script run (if not specified directly) + } + + $processing_type = $this->Application->GetVar('type'); + if ($processing_type = 'return_progress') { + $email_queue_progress = $this->Application->RecallVar('email_queue_progress'); + if ($email_queue_progress === false) { + $emails_sent = 0; + $sql = 'SELECT COUNT(*) + FROM '.TABLE_PREFIX.'EmailQueue + WHERE (SendRetries < 5) AND (LastSendRetry < '.(adodb_mktime() - 7200).')'; + $total_emails = $this->Conn->GetOne($sql); + $this->Application->StoreVar('email_queue_progress', $emails_sent.':'.$total_emails); + } + else { + list ($emails_sent, $total_emails) = explode(':', $email_queue_progress); + } + } + + $sql = 'SELECT * + FROM '.TABLE_PREFIX.'EmailQueue + WHERE (SendRetries < 5) AND (LastSendRetry < '.(adodb_mktime() - 7200).') + LIMIT 0,'.$deliver_count; + $messages = $this->Conn->Query($sql); + + $message_count = count($messages); + if (!$message_count) { + // no messages left to send in queue + if ($processing_type = 'return_progress') { + $this->Application->RemoveVar('email_queue_progress'); + $this->Application->Redirect($this->Application->GetVar('finish_template')); + } + return ; + } + + $esender =& $this->Application->recallObject('EmailSender'); + /* @var $esender kEmailSendingHelper */ + + $i = 0; + $message = Array (); + while ($i < $message_count) { + $message[0] = unserialize($messages[$i]['MessageHeaders']); + $message[1] =& $messages[$i]['MessageBody']; + $delivered = $esender->Deliver($message, true); // immediate send! + + if ($delivered) { + // send succseeded, delete from queue + $sql = 'DELETE FROM '.TABLE_PREFIX.'EmailQueue + WHERE EmailQueueId = '.$messages[$i]['EmailQueueId']; + $this->Conn->Query($sql); + } + else { + // send failed, increment retries counter + $sql = 'UPDATE '.TABLE_PREFIX.'EmailQueue + SET SendRetries = SendRetries + 1, LastSendRetry = '.adodb_mktime().' + WHERE EmailQueueId = '.$messages[$i]['EmailQueueId']; + $this->Conn->Query($sql); + } + $i++; + } + + if ($processing_type = 'return_progress') { + $emails_sent += $message_count; + if ($emails_sent >= $total_emails) { + $this->Application->RemoveVar('email_queue_progress'); + $this->Application->Redirect($this->Application->GetVar('finish_template')); + } + + $this->Application->StoreVar('email_queue_progress', $emails_sent.':'.$total_emails); + $event->status = erSTOP; + echo ($emails_sent / $total_emails) * 100; + } + } } ?> \ No newline at end of file