152
152
* @param string $status The status of the messages that need to be sent
153
153
* @param integer $limit The limit of emails that we should send at one time
154
* @param boolean $merge Whether or not to send one merged email for multiple entries with the same status and type.
155
function send($status, $limit)
156
function send($status, $limit = false, $merge = false)
157
// foreach email, we use retrieve one email details a time to avoid
158
// running out of memory.
158
if ($merge !== false) {
159
foreach (self::_getMergedList($status, $limit) as $maq_ids) {
160
$emails = self::_getEntries($maq_ids);
161
$recipients = array();
163
foreach ($emails as $email) {
164
$recipients[] = $email['recipient'];
168
$recipients = implode(',', $recipients);
169
$message = $email['headers'] . "\r\n\r\n" . $email['body'];
170
$structure = Mime_Helper::decode($message, false, false);
171
$headers = $structure->headers;
173
$headers['to'] = $recipients;
174
$headers = Mime_Helper::encodeHeaders($headers);
176
$res = Mail_Helper::prepareHeaders($headers);
177
if (PEAR::isError($res)) {
178
Error_Handler::logError(array($res->getMessage(), $res->getDebugInfo()), __FILE__, __LINE__);
182
list(,$text_headers) = $res;
183
$result = self::_sendEmail($recipients, $text_headers, $email['body'], $status);
185
if (PEAR::isError($result)) {
186
$maq_id = implode(',', $maq_ids);
187
$details = $result->getMessage() . "/" . $result->getDebugInfo();
188
echo "Mail_Queue: issue #{$email['maq_iss_id']}: Can't send merged mail $maq_id: $details\n";
190
foreach ($emails as $email) {
191
self::_saveStatusLog($email['id'], 'error', $details);
197
foreach ($emails as $email) {
198
self::_saveStatusLog($email['id'], 'sent', '');
200
if ($email['save_copy']) {
201
Mail_Helper::saveOutgoingEmailCopy($email);
159
207
foreach (self::_getList($status, $limit) as $maq_id) {
160
208
$email = self::_getEntry($maq_id);
166
$current_status = $status;
167
if ($email['maq_type'] == 'error') {
168
$current_status = 'error';
170
$result = self::_sendEmail($email['recipient'], $email['headers'], $email['body'], $current_status);
209
$result = self::_sendEmail($email['recipient'], $email['headers'], $email['body'], $status);
172
211
if (PEAR::isError($result)) {
173
212
$details = $result->getMessage() . "/" . $result->getDebugInfo();
330
* Retrieves the list of queued email messages ids, given a status, merged together by type
333
* @param string $status The status of the messages
334
* @param integer $limit The limit on the number of messages that need to be returned
335
* @return array The list of queued email messages
337
private function _getMergedList($status, $limit = false)
340
GROUP_CONCAT(maq_id) ids
342
" . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "mail_queue
352
if ($limit !== false) {
353
$sql .= " LIMIT 0, $limit";
356
$res = DB_Helper::getInstance()->getAll($sql, DB_FETCHMODE_ASSOC);
357
if (PEAR::isError($res)) {
358
Error_Handler::logError(array($res->getMessage(), $res->getDebugInfo()), __FILE__, __LINE__);
362
foreach ($res as &$value) {
363
$value = explode(',', $value['ids']);
289
370
* Retrieves queued email by maq_id.
291
372
* @access private
401
* Retrieves queued email by maq_ids.
404
* @param array $maq_ids IDs of queue entries
405
* @return array The queued email message
407
private function _getEntries($maq_ids)
412
maq_save_copy save_copy,
413
maq_recipient recipient,
419
" . APP_DEFAULT_DB . "." . APP_TABLE_PREFIX . "mail_queue
421
maq_id IN (" . implode(',', $maq_ids) . ")";
422
$res = DB_Helper::getInstance()->getAll($stmt, DB_FETCHMODE_ASSOC);
423
if (PEAR::isError($res)) {
424
Error_Handler::logError(array($res->getMessage(), $res->getDebugInfo()), __FILE__, __LINE__);
321
432
* Saves a log entry about the attempt, successful or otherwise, to send the