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: ?>