Mercurial > hg > vamp-website
diff forum/Sources/ManageMail.php @ 76:e3e11437ecea website
Add forum code
author | Chris Cannam |
---|---|
date | Sun, 07 Jul 2013 11:25:48 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/forum/Sources/ManageMail.php Sun Jul 07 11:25:48 2013 +0200 @@ -0,0 +1,452 @@ +<?php + +/** + * Simple Machines Forum (SMF) + * + * @package SMF + * @author Simple Machines http://www.simplemachines.org + * @copyright 2011 Simple Machines + * @license http://www.simplemachines.org/about/smf/license.php BSD + * + * @version 2.0 + */ + +if (!defined('SMF')) + die('Hacking attempt...'); + +/* This file is all about mail, how we love it so. In particular it handles the admin side of + mail configuration, as well as reviewing the mail queue - if enabled. + + void ManageMail() + // !! + + void BrowseMailQueue() + // !! + + void ModifyMailSettings() + // !! + + void ClearMailQueue() + // !! + +*/ + +// This function passes control through to the relevant section +function ManageMail() +{ + global $context, $txt, $scripturl, $modSettings, $sourcedir; + + // You need to be an admin to edit settings! + isAllowedTo('admin_forum'); + + loadLanguage('Help'); + loadLanguage('ManageMail'); + + // We'll need the utility functions from here. + require_once($sourcedir . '/ManageServer.php'); + + $context['page_title'] = $txt['mailqueue_title']; + $context['sub_template'] = 'show_settings'; + + $subActions = array( + 'browse' => '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' => '<a href="mailto:%1$s">%1$s</a>', + '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' => '<input type="checkbox" onclick="invertAll(this, this.form);" class="input_check" />', + ), + 'data' => array( + 'function' => create_function('$rowData', ' + return \'<input type="checkbox" name="delete[]" value="\' . $rowData[\'id_mail\'] . \'" class="input_check" />\'; + '), + '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' => '[<a href="' . $scripturl . '?action=admin;area=mailqueue;sa=clear;' . $context['session_var'] . '=' . $context['session_id'] . '" onclick="return confirm(\'' . $txt['mailqueue_clear_list_warning'] . '\');">' . $txt['mailqueue_clear_list'] . '</a>] <input type="submit" name="delete_redirects" value="' . $txt['delete'] . '" onclick="return confirm(\'' . $txt['quickmod_confirm'] . '\');" class="button_submit" />', + ), + ), + ); + + require_once($sourcedir . '/Subs-List.php'); + createList($listOptions); + + loadTemplate('ManageMail'); + $context['sub_template'] = 'browse'; +} + +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; +} + +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; +} + +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'] = ' + <script type="text/javascript"><!-- // --><![CDATA[ + var bDay = {'; + + $i = 0; + foreach ($birthdayEmails as $index => $email) + { + $is_last = ++$i == count($birthdayEmails); + $context['settings_insert_above'] .= ' + ' . $index . ': { + subject: ' . JavaScriptEscape($email['subject']) . ', + body: ' . JavaScriptEscape(nl2br($email['body'])) . ' + }' . (!$is_last ? ',' : ''); + } + $context['settings_insert_above'] .= ' + }; + function fetch_birthday_preview() + { + var index = document.getElementById(\'birthday_email\').value; + document.getElementById(\'birthday_subject\').innerHTML = bDay[index].subject; + document.getElementById(\'birthday_body\').innerHTML = bDay[index].body; + } + // ]]></script>'; +} + +// 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 function to calculate how long ago a time was. +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); +} + +?> \ No newline at end of file