'BrowseMailQueue', 'clear' => 'ClearMailQueue', 'settings' => 'ModifyMailSettings', ); // By default we want to browse $_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : 'browse'; $context['sub_action'] = $_REQUEST['sa']; // Load up all the tabs... $context[$context['admin_menu_name']]['tab_data'] = array( 'title' => $txt['mailqueue_title'], 'help' => '', 'description' => $txt['mailqueue_desc'], ); // Call the right function for this sub-acton. $subActions[$_REQUEST['sa']](); } /** * Display the mail queue... */ function BrowseMailQueue() { global $scripturl, $context, $modSettings, $txt, $smcFunc; global $sourcedir; // First, are we deleting something from the queue? if (isset($_REQUEST['delete'])) { checkSession('post'); $smcFunc['db_query']('', ' DELETE FROM {db_prefix}mail_queue WHERE id_mail IN ({array_int:mail_ids})', array( 'mail_ids' => $_REQUEST['delete'], ) ); } // How many items do we have? $request = $smcFunc['db_query']('', ' SELECT COUNT(*) AS queue_size, MIN(time_sent) AS oldest FROM {db_prefix}mail_queue', array( ) ); list ($mailQueueSize, $mailOldest) = $smcFunc['db_fetch_row']($request); $smcFunc['db_free_result']($request); $context['oldest_mail'] = empty($mailOldest) ? $txt['mailqueue_oldest_not_available'] : time_since(time() - $mailOldest); $context['mail_queue_size'] = comma_format($mailQueueSize); $listOptions = array( 'id' => 'mail_queue', 'title' => $txt['mailqueue_browse'], 'items_per_page' => 20, 'base_href' => $scripturl . '?action=admin;area=mailqueue', 'default_sort_col' => 'age', 'no_items_label' => $txt['mailqueue_no_items'], 'get_items' => array( 'function' => 'list_getMailQueue', ), 'get_count' => array( 'function' => 'list_getMailQueueSize', ), 'columns' => array( 'subject' => array( 'header' => array( 'value' => $txt['mailqueue_subject'], ), 'data' => array( 'function' => create_function('$rowData', ' global $smcFunc; return $smcFunc[\'strlen\']($rowData[\'subject\']) > 50 ? sprintf(\'%1$s...\', htmlspecialchars($smcFunc[\'substr\']($rowData[\'subject\'], 0, 47))) : htmlspecialchars($rowData[\'subject\']); '), 'class' => 'smalltext', ), 'sort' => array( 'default' => 'subject', 'reverse' => 'subject DESC', ), ), 'recipient' => array( 'header' => array( 'value' => $txt['mailqueue_recipient'], ), 'data' => array( 'sprintf' => array( 'format' => '%1$s', 'params' => array( 'recipient' => true, ), ), 'class' => 'smalltext', ), 'sort' => array( 'default' => 'recipient', 'reverse' => 'recipient DESC', ), ), 'priority' => array( 'header' => array( 'value' => $txt['mailqueue_priority'], ), 'data' => array( 'function' => create_function('$rowData', ' global $txt; // We probably have a text label with your priority. $txtKey = sprintf(\'mq_mpriority_%1$s\', $rowData[\'priority\']); // But if not, revert to priority 0. return isset($txt[$txtKey]) ? $txt[$txtKey] : $txt[\'mq_mpriority_1\']; '), 'class' => 'smalltext', ), 'sort' => array( 'default' => 'priority', 'reverse' => 'priority DESC', ), ), 'age' => array( 'header' => array( 'value' => $txt['mailqueue_age'], ), 'data' => array( 'function' => create_function('$rowData', ' return time_since(time() - $rowData[\'time_sent\']); '), 'class' => 'smalltext', ), 'sort' => array( 'default' => 'time_sent', 'reverse' => 'time_sent DESC', ), ), 'check' => array( 'header' => array( 'value' => '', ), 'data' => array( 'function' => create_function('$rowData', ' return \'\'; '), 'class' => 'smalltext', ), ), ), 'form' => array( 'href' => $scripturl . '?action=admin;area=mailqueue', 'include_start' => true, 'include_sort' => true, ), 'additional_rows' => array( array( 'position' => 'below_table_data', 'value' => '[' . $txt['mailqueue_clear_list'] . '] ', ), ), ); require_once($sourcedir . '/Subs-List.php'); createList($listOptions); loadTemplate('ManageMail'); $context['sub_template'] = 'browse'; } /** * This function grabs the mail queue items from the database, according to the params given. * * @param int $start * @param int $items_per_page * @param string $sort */ function list_getMailQueue($start, $items_per_page, $sort) { global $smcFunc, $txt; $request = $smcFunc['db_query']('', ' SELECT id_mail, time_sent, recipient, priority, private, subject FROM {db_prefix}mail_queue ORDER BY {raw:sort} LIMIT {int:start}, {int:items_per_page}', array( 'start' => $start, 'sort' => $sort, 'items_per_page' => $items_per_page, ) ); $mails = array(); while ($row = $smcFunc['db_fetch_assoc']($request)) { // Private PM/email subjects and similar shouldn't be shown in the mailbox area. if (!empty($row['private'])) $row['subject'] = $txt['personal_message']; $mails[] = $row; } $smcFunc['db_free_result']($request); return $mails; } /** * Returns the total count of items in the mail queue. */ function list_getMailQueueSize() { global $smcFunc; // How many items do we have? $request = $smcFunc['db_query']('', ' SELECT COUNT(*) AS queue_size FROM {db_prefix}mail_queue', array( ) ); list ($mailQueueSize) = $smcFunc['db_fetch_row']($request); $smcFunc['db_free_result']($request); return $mailQueueSize; } /** * Allows to view and modify the mail settings. * * @param bool $return_config */ function ModifyMailSettings($return_config = false) { global $txt, $scripturl, $context, $settings, $birthdayEmails, $modSettings; loadLanguage('EmailTemplates'); $body = $birthdayEmails[empty($modSettings['birthday_email']) ? 'happy_birthday' : $modSettings['birthday_email']]['body']; $subject = $birthdayEmails[empty($modSettings['birthday_email']) ? 'happy_birthday' : $modSettings['birthday_email']]['subject']; $emails = array(); foreach ($birthdayEmails as $index => $dummy) $emails[$index] = $index; $config_vars = array( // Mail queue stuff, this rocks ;) array('check', 'mail_queue'), array('int', 'mail_limit'), array('int', 'mail_quantity'), '', // SMTP stuff. array('select', 'mail_type', array($txt['mail_type_default'], 'SMTP')), array('text', 'smtp_host'), array('text', 'smtp_port'), array('text', 'smtp_username'), array('password', 'smtp_password'), '', array('select', 'birthday_email', $emails, 'value' => empty($modSettings['birthday_email']) ? 'happy_birthday' : $modSettings['birthday_email'], 'javascript' => 'onchange="fetch_birthday_preview()"'), 'birthday_subject' => array('var_message', 'birthday_subject', 'var_message' => $birthdayEmails[empty($modSettings['birthday_email']) ? 'happy_birthday' : $modSettings['birthday_email']]['subject'], 'disabled' => true, 'size' => strlen($subject) + 3), 'birthday_body' => array('var_message', 'birthday_body', 'var_message' => nl2br($body), 'disabled' => true, 'size' => ceil(strlen($body) / 25)), ); if ($return_config) return $config_vars; // Saving? if (isset($_GET['save'])) { // Make the SMTP password a little harder to see in a backup etc. if (!empty($_POST['smtp_password'][1])) { $_POST['smtp_password'][0] = base64_encode($_POST['smtp_password'][0]); $_POST['smtp_password'][1] = base64_encode($_POST['smtp_password'][1]); } checkSession(); // We don't want to save the subject and body previews. unset($config_vars['birthday_subject'], $config_vars['birthday_body']); saveDBSettings($config_vars); redirectexit('action=admin;area=mailqueue;sa=settings'); } $context['post_url'] = $scripturl . '?action=admin;area=mailqueue;save;sa=settings'; $context['settings_title'] = $txt['mailqueue_settings']; prepareDBSettingContext($config_vars); $context['settings_insert_above'] = ' '; } /** * This function clears the mail queue of all emails, and at the end redirects to browse. */ function ClearMailQueue() { global $sourcedir, $smcFunc; checkSession('get'); // This is certainly needed! require_once($sourcedir . '/ScheduledTasks.php'); // If we don't yet have the total to clear, find it. if (!isset($_GET['te'])) { // How many items do we have? $request = $smcFunc['db_query']('', ' SELECT COUNT(*) AS queue_size FROM {db_prefix}mail_queue', array( ) ); list ($_GET['te']) = $smcFunc['db_fetch_row']($request); $smcFunc['db_free_result']($request); } else $_GET['te'] = (int) $_GET['te']; $_GET['sent'] = isset($_GET['sent']) ? (int) $_GET['sent'] : 0; // Send 50 at a time, then go for a break... while (ReduceMailQueue(50, true, true) === true) { // Sent another 50. $_GET['sent'] += 50; pauseMailQueueClear(); } return BrowseMailQueue(); } /** * Used for pausing the mail queue. */ function pauseMailQueueClear() { global $context, $txt, $time_start; // Try get more time... @set_time_limit(600); if (function_exists('apache_reset_timeout')) @apache_reset_timeout(); // Have we already used our maximum time? if (time() - array_sum(explode(' ', $time_start)) < 5) return; $context['continue_get_data'] = '?action=admin;area=mailqueue;sa=clear;te=' . $_GET['te'] . ';sent=' . $_GET['sent'] . ';' . $context['session_var'] . '=' . $context['session_id']; $context['page_title'] = $txt['not_done_title']; $context['continue_post_data'] = ''; $context['continue_countdown'] = '2'; $context['sub_template'] = 'not_done'; // Keep browse selected. $context['selected'] = 'browse'; // What percent through are we? $context['continue_percent'] = round(($_GET['sent'] / $_GET['te']) * 100, 1); // Never more than 100%! $context['continue_percent'] = min($context['continue_percent'], 100); obExit(); } /** * Little utility function to calculate how long ago a time was. * * @param long $time_diff */ function time_since($time_diff) { global $txt; if ($time_diff < 0) $time_diff = 0; // Just do a bit of an if fest... if ($time_diff > 86400) { $days = round($time_diff / 86400, 1); return sprintf($days == 1 ? $txt['mq_day'] : $txt['mq_days'], $time_diff / 86400); } // Hours? elseif ($time_diff > 3600) { $hours = round($time_diff / 3600, 1); return sprintf($hours == 1 ? $txt['mq_hour'] : $txt['mq_hours'], $hours); } // Minutes? elseif ($time_diff > 60) { $minutes = (int) ($time_diff / 60); return sprintf($minutes == 1 ? $txt['mq_minute'] : $txt['mq_minutes'], $minutes); } // Otherwise must be second else return sprintf($time_diff == 1 ? $txt['mq_second'] : $txt['mq_seconds'], $time_diff); } ?>