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