annotate forum/Sources/ManageMail.php @ 85:6d7b61434be7 website

Add a copy of this here, just in case!
author Chris Cannam
date Mon, 20 Jan 2014 11:02:36 +0000
parents e3e11437ecea
children
rev   line source
Chris@76 1 <?php
Chris@76 2
Chris@76 3 /**
Chris@76 4 * Simple Machines Forum (SMF)
Chris@76 5 *
Chris@76 6 * @package SMF
Chris@76 7 * @author Simple Machines http://www.simplemachines.org
Chris@76 8 * @copyright 2011 Simple Machines
Chris@76 9 * @license http://www.simplemachines.org/about/smf/license.php BSD
Chris@76 10 *
Chris@76 11 * @version 2.0
Chris@76 12 */
Chris@76 13
Chris@76 14 if (!defined('SMF'))
Chris@76 15 die('Hacking attempt...');
Chris@76 16
Chris@76 17 /* This file is all about mail, how we love it so. In particular it handles the admin side of
Chris@76 18 mail configuration, as well as reviewing the mail queue - if enabled.
Chris@76 19
Chris@76 20 void ManageMail()
Chris@76 21 // !!
Chris@76 22
Chris@76 23 void BrowseMailQueue()
Chris@76 24 // !!
Chris@76 25
Chris@76 26 void ModifyMailSettings()
Chris@76 27 // !!
Chris@76 28
Chris@76 29 void ClearMailQueue()
Chris@76 30 // !!
Chris@76 31
Chris@76 32 */
Chris@76 33
Chris@76 34 // This function passes control through to the relevant section
Chris@76 35 function ManageMail()
Chris@76 36 {
Chris@76 37 global $context, $txt, $scripturl, $modSettings, $sourcedir;
Chris@76 38
Chris@76 39 // You need to be an admin to edit settings!
Chris@76 40 isAllowedTo('admin_forum');
Chris@76 41
Chris@76 42 loadLanguage('Help');
Chris@76 43 loadLanguage('ManageMail');
Chris@76 44
Chris@76 45 // We'll need the utility functions from here.
Chris@76 46 require_once($sourcedir . '/ManageServer.php');
Chris@76 47
Chris@76 48 $context['page_title'] = $txt['mailqueue_title'];
Chris@76 49 $context['sub_template'] = 'show_settings';
Chris@76 50
Chris@76 51 $subActions = array(
Chris@76 52 'browse' => 'BrowseMailQueue',
Chris@76 53 'clear' => 'ClearMailQueue',
Chris@76 54 'settings' => 'ModifyMailSettings',
Chris@76 55 );
Chris@76 56
Chris@76 57 // By default we want to browse
Chris@76 58 $_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : 'browse';
Chris@76 59 $context['sub_action'] = $_REQUEST['sa'];
Chris@76 60
Chris@76 61 // Load up all the tabs...
Chris@76 62 $context[$context['admin_menu_name']]['tab_data'] = array(
Chris@76 63 'title' => $txt['mailqueue_title'],
Chris@76 64 'help' => '',
Chris@76 65 'description' => $txt['mailqueue_desc'],
Chris@76 66 );
Chris@76 67
Chris@76 68 // Call the right function for this sub-acton.
Chris@76 69 $subActions[$_REQUEST['sa']]();
Chris@76 70 }
Chris@76 71
Chris@76 72 // Display the mail queue...
Chris@76 73 function BrowseMailQueue()
Chris@76 74 {
Chris@76 75 global $scripturl, $context, $modSettings, $txt, $smcFunc;
Chris@76 76 global $sourcedir;
Chris@76 77
Chris@76 78 // First, are we deleting something from the queue?
Chris@76 79 if (isset($_REQUEST['delete']))
Chris@76 80 {
Chris@76 81 checkSession('post');
Chris@76 82
Chris@76 83 $smcFunc['db_query']('', '
Chris@76 84 DELETE FROM {db_prefix}mail_queue
Chris@76 85 WHERE id_mail IN ({array_int:mail_ids})',
Chris@76 86 array(
Chris@76 87 'mail_ids' => $_REQUEST['delete'],
Chris@76 88 )
Chris@76 89 );
Chris@76 90 }
Chris@76 91
Chris@76 92 // How many items do we have?
Chris@76 93 $request = $smcFunc['db_query']('', '
Chris@76 94 SELECT COUNT(*) AS queue_size, MIN(time_sent) AS oldest
Chris@76 95 FROM {db_prefix}mail_queue',
Chris@76 96 array(
Chris@76 97 )
Chris@76 98 );
Chris@76 99 list ($mailQueueSize, $mailOldest) = $smcFunc['db_fetch_row']($request);
Chris@76 100 $smcFunc['db_free_result']($request);
Chris@76 101
Chris@76 102 $context['oldest_mail'] = empty($mailOldest) ? $txt['mailqueue_oldest_not_available'] : time_since(time() - $mailOldest);
Chris@76 103 $context['mail_queue_size'] = comma_format($mailQueueSize);
Chris@76 104
Chris@76 105 $listOptions = array(
Chris@76 106 'id' => 'mail_queue',
Chris@76 107 'title' => $txt['mailqueue_browse'],
Chris@76 108 'items_per_page' => 20,
Chris@76 109 'base_href' => $scripturl . '?action=admin;area=mailqueue',
Chris@76 110 'default_sort_col' => 'age',
Chris@76 111 'no_items_label' => $txt['mailqueue_no_items'],
Chris@76 112 'get_items' => array(
Chris@76 113 'function' => 'list_getMailQueue',
Chris@76 114 ),
Chris@76 115 'get_count' => array(
Chris@76 116 'function' => 'list_getMailQueueSize',
Chris@76 117 ),
Chris@76 118 'columns' => array(
Chris@76 119 'subject' => array(
Chris@76 120 'header' => array(
Chris@76 121 'value' => $txt['mailqueue_subject'],
Chris@76 122 ),
Chris@76 123 'data' => array(
Chris@76 124 'function' => create_function('$rowData', '
Chris@76 125 global $smcFunc;
Chris@76 126 return $smcFunc[\'strlen\']($rowData[\'subject\']) > 50 ? sprintf(\'%1$s...\', htmlspecialchars($smcFunc[\'substr\']($rowData[\'subject\'], 0, 47))) : htmlspecialchars($rowData[\'subject\']);
Chris@76 127 '),
Chris@76 128 'class' => 'smalltext',
Chris@76 129 ),
Chris@76 130 'sort' => array(
Chris@76 131 'default' => 'subject',
Chris@76 132 'reverse' => 'subject DESC',
Chris@76 133 ),
Chris@76 134 ),
Chris@76 135 'recipient' => array(
Chris@76 136 'header' => array(
Chris@76 137 'value' => $txt['mailqueue_recipient'],
Chris@76 138 ),
Chris@76 139 'data' => array(
Chris@76 140 'sprintf' => array(
Chris@76 141 'format' => '<a href="mailto:%1$s">%1$s</a>',
Chris@76 142 'params' => array(
Chris@76 143 'recipient' => true,
Chris@76 144 ),
Chris@76 145 ),
Chris@76 146 'class' => 'smalltext',
Chris@76 147 ),
Chris@76 148 'sort' => array(
Chris@76 149 'default' => 'recipient',
Chris@76 150 'reverse' => 'recipient DESC',
Chris@76 151 ),
Chris@76 152 ),
Chris@76 153 'priority' => array(
Chris@76 154 'header' => array(
Chris@76 155 'value' => $txt['mailqueue_priority'],
Chris@76 156 ),
Chris@76 157 'data' => array(
Chris@76 158 'function' => create_function('$rowData', '
Chris@76 159 global $txt;
Chris@76 160
Chris@76 161 // We probably have a text label with your priority.
Chris@76 162 $txtKey = sprintf(\'mq_mpriority_%1$s\', $rowData[\'priority\']);
Chris@76 163
Chris@76 164 // But if not, revert to priority 0.
Chris@76 165 return isset($txt[$txtKey]) ? $txt[$txtKey] : $txt[\'mq_mpriority_1\'];
Chris@76 166 '),
Chris@76 167 'class' => 'smalltext',
Chris@76 168 ),
Chris@76 169 'sort' => array(
Chris@76 170 'default' => 'priority',
Chris@76 171 'reverse' => 'priority DESC',
Chris@76 172 ),
Chris@76 173 ),
Chris@76 174 'age' => array(
Chris@76 175 'header' => array(
Chris@76 176 'value' => $txt['mailqueue_age'],
Chris@76 177 ),
Chris@76 178 'data' => array(
Chris@76 179 'function' => create_function('$rowData', '
Chris@76 180 return time_since(time() - $rowData[\'time_sent\']);
Chris@76 181 '),
Chris@76 182 'class' => 'smalltext',
Chris@76 183 ),
Chris@76 184 'sort' => array(
Chris@76 185 'default' => 'time_sent',
Chris@76 186 'reverse' => 'time_sent DESC',
Chris@76 187 ),
Chris@76 188 ),
Chris@76 189 'check' => array(
Chris@76 190 'header' => array(
Chris@76 191 'value' => '<input type="checkbox" onclick="invertAll(this, this.form);" class="input_check" />',
Chris@76 192 ),
Chris@76 193 'data' => array(
Chris@76 194 'function' => create_function('$rowData', '
Chris@76 195 return \'<input type="checkbox" name="delete[]" value="\' . $rowData[\'id_mail\'] . \'" class="input_check" />\';
Chris@76 196 '),
Chris@76 197 'class' => 'smalltext',
Chris@76 198 ),
Chris@76 199 ),
Chris@76 200 ),
Chris@76 201 'form' => array(
Chris@76 202 'href' => $scripturl . '?action=admin;area=mailqueue',
Chris@76 203 'include_start' => true,
Chris@76 204 'include_sort' => true,
Chris@76 205 ),
Chris@76 206 'additional_rows' => array(
Chris@76 207 array(
Chris@76 208 'position' => 'below_table_data',
Chris@76 209 '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" />',
Chris@76 210 ),
Chris@76 211 ),
Chris@76 212 );
Chris@76 213
Chris@76 214 require_once($sourcedir . '/Subs-List.php');
Chris@76 215 createList($listOptions);
Chris@76 216
Chris@76 217 loadTemplate('ManageMail');
Chris@76 218 $context['sub_template'] = 'browse';
Chris@76 219 }
Chris@76 220
Chris@76 221 function list_getMailQueue($start, $items_per_page, $sort)
Chris@76 222 {
Chris@76 223 global $smcFunc, $txt;
Chris@76 224
Chris@76 225 $request = $smcFunc['db_query']('', '
Chris@76 226 SELECT
Chris@76 227 id_mail, time_sent, recipient, priority, private, subject
Chris@76 228 FROM {db_prefix}mail_queue
Chris@76 229 ORDER BY {raw:sort}
Chris@76 230 LIMIT {int:start}, {int:items_per_page}',
Chris@76 231 array(
Chris@76 232 'start' => $start,
Chris@76 233 'sort' => $sort,
Chris@76 234 'items_per_page' => $items_per_page,
Chris@76 235 )
Chris@76 236 );
Chris@76 237 $mails = array();
Chris@76 238 while ($row = $smcFunc['db_fetch_assoc']($request))
Chris@76 239 {
Chris@76 240 // Private PM/email subjects and similar shouldn't be shown in the mailbox area.
Chris@76 241 if (!empty($row['private']))
Chris@76 242 $row['subject'] = $txt['personal_message'];
Chris@76 243
Chris@76 244 $mails[] = $row;
Chris@76 245 }
Chris@76 246 $smcFunc['db_free_result']($request);
Chris@76 247
Chris@76 248 return $mails;
Chris@76 249 }
Chris@76 250
Chris@76 251 function list_getMailQueueSize()
Chris@76 252 {
Chris@76 253 global $smcFunc;
Chris@76 254
Chris@76 255 // How many items do we have?
Chris@76 256 $request = $smcFunc['db_query']('', '
Chris@76 257 SELECT COUNT(*) AS queue_size
Chris@76 258 FROM {db_prefix}mail_queue',
Chris@76 259 array(
Chris@76 260 )
Chris@76 261 );
Chris@76 262 list ($mailQueueSize) = $smcFunc['db_fetch_row']($request);
Chris@76 263 $smcFunc['db_free_result']($request);
Chris@76 264
Chris@76 265 return $mailQueueSize;
Chris@76 266 }
Chris@76 267
Chris@76 268 function ModifyMailSettings($return_config = false)
Chris@76 269 {
Chris@76 270 global $txt, $scripturl, $context, $settings, $birthdayEmails, $modSettings;
Chris@76 271
Chris@76 272 loadLanguage('EmailTemplates');
Chris@76 273
Chris@76 274 $body = $birthdayEmails[empty($modSettings['birthday_email']) ? 'happy_birthday' : $modSettings['birthday_email']]['body'];
Chris@76 275 $subject = $birthdayEmails[empty($modSettings['birthday_email']) ? 'happy_birthday' : $modSettings['birthday_email']]['subject'];
Chris@76 276
Chris@76 277 $emails = array();
Chris@76 278 foreach ($birthdayEmails as $index => $dummy)
Chris@76 279 $emails[$index] = $index;
Chris@76 280
Chris@76 281 $config_vars = array(
Chris@76 282 // Mail queue stuff, this rocks ;)
Chris@76 283 array('check', 'mail_queue'),
Chris@76 284 array('int', 'mail_limit'),
Chris@76 285 array('int', 'mail_quantity'),
Chris@76 286 '',
Chris@76 287 // SMTP stuff.
Chris@76 288 array('select', 'mail_type', array($txt['mail_type_default'], 'SMTP')),
Chris@76 289 array('text', 'smtp_host'),
Chris@76 290 array('text', 'smtp_port'),
Chris@76 291 array('text', 'smtp_username'),
Chris@76 292 array('password', 'smtp_password'),
Chris@76 293 '',
Chris@76 294 array('select', 'birthday_email', $emails, 'value' => empty($modSettings['birthday_email']) ? 'happy_birthday' : $modSettings['birthday_email'], 'javascript' => 'onchange="fetch_birthday_preview()"'),
Chris@76 295 '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 296 'birthday_body' => array('var_message', 'birthday_body', 'var_message' => nl2br($body), 'disabled' => true, 'size' => ceil(strlen($body) / 25)),
Chris@76 297 );
Chris@76 298
Chris@76 299 if ($return_config)
Chris@76 300 return $config_vars;
Chris@76 301
Chris@76 302 // Saving?
Chris@76 303 if (isset($_GET['save']))
Chris@76 304 {
Chris@76 305 // Make the SMTP password a little harder to see in a backup etc.
Chris@76 306 if (!empty($_POST['smtp_password'][1]))
Chris@76 307 {
Chris@76 308 $_POST['smtp_password'][0] = base64_encode($_POST['smtp_password'][0]);
Chris@76 309 $_POST['smtp_password'][1] = base64_encode($_POST['smtp_password'][1]);
Chris@76 310 }
Chris@76 311 checkSession();
Chris@76 312
Chris@76 313 // We don't want to save the subject and body previews.
Chris@76 314 unset($config_vars['birthday_subject'], $config_vars['birthday_body']);
Chris@76 315
Chris@76 316 saveDBSettings($config_vars);
Chris@76 317 redirectexit('action=admin;area=mailqueue;sa=settings');
Chris@76 318 }
Chris@76 319
Chris@76 320 $context['post_url'] = $scripturl . '?action=admin;area=mailqueue;save;sa=settings';
Chris@76 321 $context['settings_title'] = $txt['mailqueue_settings'];
Chris@76 322
Chris@76 323 prepareDBSettingContext($config_vars);
Chris@76 324
Chris@76 325 $context['settings_insert_above'] = '
Chris@76 326 <script type="text/javascript"><!-- // --><![CDATA[
Chris@76 327 var bDay = {';
Chris@76 328
Chris@76 329 $i = 0;
Chris@76 330 foreach ($birthdayEmails as $index => $email)
Chris@76 331 {
Chris@76 332 $is_last = ++$i == count($birthdayEmails);
Chris@76 333 $context['settings_insert_above'] .= '
Chris@76 334 ' . $index . ': {
Chris@76 335 subject: ' . JavaScriptEscape($email['subject']) . ',
Chris@76 336 body: ' . JavaScriptEscape(nl2br($email['body'])) . '
Chris@76 337 }' . (!$is_last ? ',' : '');
Chris@76 338 }
Chris@76 339 $context['settings_insert_above'] .= '
Chris@76 340 };
Chris@76 341 function fetch_birthday_preview()
Chris@76 342 {
Chris@76 343 var index = document.getElementById(\'birthday_email\').value;
Chris@76 344 document.getElementById(\'birthday_subject\').innerHTML = bDay[index].subject;
Chris@76 345 document.getElementById(\'birthday_body\').innerHTML = bDay[index].body;
Chris@76 346 }
Chris@76 347 // ]]></script>';
Chris@76 348 }
Chris@76 349
Chris@76 350 // This function clears the mail queue of all emails, and at the end redirects to browse.
Chris@76 351 function ClearMailQueue()
Chris@76 352 {
Chris@76 353 global $sourcedir, $smcFunc;
Chris@76 354
Chris@76 355 checkSession('get');
Chris@76 356
Chris@76 357 // This is certainly needed!
Chris@76 358 require_once($sourcedir . '/ScheduledTasks.php');
Chris@76 359
Chris@76 360 // If we don't yet have the total to clear, find it.
Chris@76 361 if (!isset($_GET['te']))
Chris@76 362 {
Chris@76 363 // How many items do we have?
Chris@76 364 $request = $smcFunc['db_query']('', '
Chris@76 365 SELECT COUNT(*) AS queue_size
Chris@76 366 FROM {db_prefix}mail_queue',
Chris@76 367 array(
Chris@76 368 )
Chris@76 369 );
Chris@76 370 list ($_GET['te']) = $smcFunc['db_fetch_row']($request);
Chris@76 371 $smcFunc['db_free_result']($request);
Chris@76 372 }
Chris@76 373 else
Chris@76 374 $_GET['te'] = (int) $_GET['te'];
Chris@76 375
Chris@76 376 $_GET['sent'] = isset($_GET['sent']) ? (int) $_GET['sent'] : 0;
Chris@76 377
Chris@76 378 // Send 50 at a time, then go for a break...
Chris@76 379 while (ReduceMailQueue(50, true, true) === true)
Chris@76 380 {
Chris@76 381 // Sent another 50.
Chris@76 382 $_GET['sent'] += 50;
Chris@76 383 pauseMailQueueClear();
Chris@76 384 }
Chris@76 385
Chris@76 386 return BrowseMailQueue();
Chris@76 387 }
Chris@76 388
Chris@76 389 // Used for pausing the mail queue.
Chris@76 390 function pauseMailQueueClear()
Chris@76 391 {
Chris@76 392 global $context, $txt, $time_start;
Chris@76 393
Chris@76 394 // Try get more time...
Chris@76 395 @set_time_limit(600);
Chris@76 396 if (function_exists('apache_reset_timeout'))
Chris@76 397 @apache_reset_timeout();
Chris@76 398
Chris@76 399 // Have we already used our maximum time?
Chris@76 400 if (time() - array_sum(explode(' ', $time_start)) < 5)
Chris@76 401 return;
Chris@76 402
Chris@76 403 $context['continue_get_data'] = '?action=admin;area=mailqueue;sa=clear;te=' . $_GET['te'] . ';sent=' . $_GET['sent'] . ';' . $context['session_var'] . '=' . $context['session_id'];
Chris@76 404 $context['page_title'] = $txt['not_done_title'];
Chris@76 405 $context['continue_post_data'] = '';
Chris@76 406 $context['continue_countdown'] = '2';
Chris@76 407 $context['sub_template'] = 'not_done';
Chris@76 408
Chris@76 409 // Keep browse selected.
Chris@76 410 $context['selected'] = 'browse';
Chris@76 411
Chris@76 412 // What percent through are we?
Chris@76 413 $context['continue_percent'] = round(($_GET['sent'] / $_GET['te']) * 100, 1);
Chris@76 414
Chris@76 415 // Never more than 100%!
Chris@76 416 $context['continue_percent'] = min($context['continue_percent'], 100);
Chris@76 417
Chris@76 418 obExit();
Chris@76 419 }
Chris@76 420
Chris@76 421 // Little function to calculate how long ago a time was.
Chris@76 422 function time_since($time_diff)
Chris@76 423 {
Chris@76 424 global $txt;
Chris@76 425
Chris@76 426 if ($time_diff < 0)
Chris@76 427 $time_diff = 0;
Chris@76 428
Chris@76 429 // Just do a bit of an if fest...
Chris@76 430 if ($time_diff > 86400)
Chris@76 431 {
Chris@76 432 $days = round($time_diff / 86400, 1);
Chris@76 433 return sprintf($days == 1 ? $txt['mq_day'] : $txt['mq_days'], $time_diff / 86400);
Chris@76 434 }
Chris@76 435 // Hours?
Chris@76 436 elseif ($time_diff > 3600)
Chris@76 437 {
Chris@76 438 $hours = round($time_diff / 3600, 1);
Chris@76 439 return sprintf($hours == 1 ? $txt['mq_hour'] : $txt['mq_hours'], $hours);
Chris@76 440 }
Chris@76 441 // Minutes?
Chris@76 442 elseif ($time_diff > 60)
Chris@76 443 {
Chris@76 444 $minutes = (int) ($time_diff / 60);
Chris@76 445 return sprintf($minutes == 1 ? $txt['mq_minute'] : $txt['mq_minutes'], $minutes);
Chris@76 446 }
Chris@76 447 // Otherwise must be second
Chris@76 448 else
Chris@76 449 return sprintf($time_diff == 1 ? $txt['mq_second'] : $txt['mq_seconds'], $time_diff);
Chris@76 450 }
Chris@76 451
Chris@76 452 ?>