1
0
mirror of https://github.com/e107inc/e107.git synced 2025-01-17 20:58:30 +01:00

Mail manager DB verification routine, Odd bits of tidying up

This commit is contained in:
e107steved 2009-11-23 21:06:00 +00:00
parent 773affcd66
commit 19e5e2c8c0
4 changed files with 203 additions and 41 deletions

View File

@ -9,8 +9,8 @@
* Administration - Site Maintenance
*
* $Source: /cvs_backup/e107_0.8/e107_admin/mailout.php,v $
* $Revision: 1.27 $
* $Date: 2009-11-18 20:45:18 $
* $Revision: 1.28 $
* $Date: 2009-11-23 21:05:50 $
* $Author: e107steved $
*
*/
@ -19,6 +19,7 @@
TODO:
1. Improve maintenance screen
2. 'Mail hold' function
3. Admin log
*/
/*

View File

@ -9,8 +9,8 @@
* e107 Main
*
* $Source: /cvs_backup/e107_0.8/e107_handlers/mail_manager_class.php,v $
* $Revision: 1.5 $
* $Date: 2009-11-19 20:24:21 $
* $Revision: 1.6 $
* $Date: 2009-11-23 21:05:58 $
* $Author: e107steved $
*/
@ -928,13 +928,13 @@ class e107MailManager
{
if (($handle <= 0) || !is_numeric($handle)) return FALSE;
$this->checkDB(1); // Make sure DB object created
// Set status of email body first - in this context, 'SENT' really means 'COMPLETED'
if (!$this->db->db_Update('mail_content','`mail_content_status` = '.MAIL_STATUS_SENT.' WHERE `mail_source_id` = '.intval($handle)))
// Set status of individual emails first, so we can get a count
if (FALSE === ($count = $this->db->db_Update('mail_recipients','`mail_status` = '.MAIL_STATUS_CANCELLED.' WHERE `mail_detail_id` = '.intval($handle).' AND `mail_status` >'.MAIL_STATUS_FAILED)))
{
return FALSE;
}
// Now set status of individual emails
if (FALSE === $this->db->db_Update('mail_recipients','`mail_status` = '.MAIL_STATUS_CANCELLED.' WHERE `mail_detail_id` = '.intval($handle).' AND `mail_status` >'.MAIL_STATUS_FAILED))
// Now do status of email body - no emails to go, add those not sent to fail count
if (!$this->db->db_Update('mail_content','`mail_content_status` = '.MAIL_STATUS_PARTIAL.', `mail_togo_count`=0, `mail_fail_count` = `mail_fail_count` + '.intval($count).' WHERE `mail_source_id` = '.intval($handle)))
{
return FALSE;
}
@ -969,6 +969,9 @@ class e107MailManager
case 'sent' :
$filters = array('`mail_content_status` = '.MAIL_STATUS_SENT);
break;
case 'allcomplete' :
$filters = array('((`mail_content_status` = '.MAIL_STATUS_SENT.') OR (`mail_content_status` = '.MAIL_STATUS_PARTIAL.') OR (`mail_content_status` = '.MAIL_STATUS_CANCELLED.'))');
break;
case 'failed' :
$filters = array('`mail_content_status` = '.MAIL_STATUS_FAILED);
break;
@ -999,7 +1002,7 @@ class e107MailManager
{
$query .= " LIMIT {$start}, {$count}";
}
// echo "{$start}, {$count} Mail query: {$query}<br />";
//echo "{$start}, {$count} Mail query: {$query}<br />";
$result = $this->db->db_Select_gen($query);
if ($result !== FALSE)
{

View File

@ -9,8 +9,8 @@
* Administration - Site Maintenance
*
* $Source: /cvs_backup/e107_0.8/e107_handlers/mailout_admin_class.php,v $
* $Revision: 1.5 $
* $Date: 2009-11-19 20:24:21 $
* $Revision: 1.6 $
* $Date: 2009-11-23 21:06:00 $
* $Author: e107steved $
*
*/
@ -24,12 +24,13 @@ Various admin-related mailout functions, mostly to do with creating and handling
TODO:
1. Use API to downloads plugin to get available files (when available)
2. Fuller checking prior to send
3. Complete dbTidy()
4. May want more control over date display format
3. May want more control over date display format
4. Add JS calendar for 'last visit' selector
*/
if (!defined('e107_INIT')) { exit; }
define('MAIL_ADMIN_DEBUG', TRUE);
require_once(e_HANDLER.'mail_manager_class.php');
@ -517,8 +518,13 @@ class mailoutAdminClass extends e107MailManager
}
// Generate list of userclasses, including the number of members in each class.
// Returns a userclass selection dropdown
/**
* Creates a 'select' dropdown of userclasses, including the number of members in each class.
*
* @param string $name - name for <select>
* @param string $curSel - current select value
* @return text for display
*/
public function userClassesTotals($name, $curSel)
{
$fixedClasses = array('all' => LAN_MAILOUT_12,'unverified' => LAN_MAILOUT_13, 'admin' => LAN_MAILOUT_53, 'self' => LAN_MAILOUT_54);
@ -551,26 +557,35 @@ class mailoutAdminClass extends e107MailManager
// Return a list of extended user fields
// TODO: Exclude system fields, and maybe others.
/**
* Creates a 'select' dropdown of non-system user fields
*
* @param string $list_name - name for <select>
* @param string $curval - current select value
* @param boolean $add_blank - add a blank line before the options if TRUE
* @return text for display
*/
public function ret_extended_field_list($list_name, $curval = '', $add_blank = FALSE)
{
$this->checkDB(2); // Make sure DB object created
$ue = e107::getUserExt(); // Get the extended field handler
$ret = "<select name='{$list_name}' class='tbox'>\n";
if ($add_blank) $ret .= "<option value=''>&nbsp;</option>\n";
$this->db2->db_Select("user_extended_struct");
while($row = $this->db2->db_Fetch())
foreach ($ue->fieldDefinitions as $fd)
{
$value = 'ue.user_'.$row['user_extended_struct_name'];
$selected = ($value == $curval) ? " selected='selected'" : '';
$ret .= "<option value='".$value."' {$selected}>".ucfirst($row['user_extended_struct_name'])."</option>\n";
if ($v['user_extended_struct_text'] != '_system_')
{
$value = 'ue.user_'.$fd['user_extended_struct_name'];
$selected = ($value == $curval) ? " selected='selected'" : '';
$ret .= "<option value='".$value."' {$selected}>".ucfirst($fd['user_extended_struct_name'])."</option>\n";
}
}
$ret .= "</select>\n";
return $ret;
}
/**
* Creates an array of data from standard $_POST fields
*
@ -1012,11 +1027,19 @@ class mailoutAdminClass extends e107MailManager
// Need to select main email entries; count number of addresses attached to each
$gen = new convert;
$frm = e107::getForm();
switch ($type)
{
case 'sent' :
$searchType = 'allcomplete';
break;
default :
$searchType = $type;
}
if ($from < 0) { $from = $this->showFrom; }
if ($amount < 0) { $amount = $this->showCount; }
// in $_GET, so = sort order, sf = sort field
$count = $this->selectEmailStatus($from, $amount, '*', $type, $this->sortField, $this->sortOrder);
$count = $this->selectEmailStatus($from, $amount, '*', $searchType, $this->sortField, $this->sortOrder);
$totalCount = $this->getEmailCount();
$emails_found = array(); // Log ID and count for later
@ -1043,7 +1066,7 @@ class mailoutAdminClass extends e107MailManager
while ($row = $this->getNextEmailStatus(FALSE))
{
// print_a($row);
//print_a($row);
$text .= '<tr>';
foreach ($fieldPrefs as $fieldName)
{ // Output column data value
@ -1152,12 +1175,12 @@ class mailoutAdminClass extends e107MailManager
}
$counters = $this->mailRetrieveCounters($mailMainID);
// $this->e107->admin_log->log_event('MAIL_02','ID: '.$mailMainID.' '.$counters['add'].'[!br!]'.$_POST['email_from_name']." &lt;".$_POST['email_from_email'],E_LOG_INFORMATIVE,'');
// $this->e107->admin_log->log_event('MAIL_02','ID: '.$mailMainID.' '.$counters['add'].'[!br!]'.$_POST['email_from_name']." &lt;".$_POST['email_from_email'],E_LOG_INFORMATIVE,'');
// We've got all the email addresses here - display a confirmation form
// Include start/end dates for send
// We've got all the email addresses here - display a confirmation form
// Include start/end dates for send
$text = "<div style='text-align:center'>";
$text .= "
@ -1197,9 +1220,6 @@ class mailoutAdminClass extends e107MailManager
</div>";
$this->e107->ns->tablerender("<div style='text-align:center'>".ADLAN_136." :: ".LAN_MAILOUT_179."</div>", $text);
// $text .= "</table></div>";
} // End of previewed email
@ -1250,7 +1270,7 @@ class mailoutAdminClass extends e107MailManager
$text .= "</tbody></table>\n</fieldset></form>";
// List of recipients
// List of recipients
// in $_GET, asc = sort order, fld = sort field
$count = $this->selectTargetStatus($mailID, $this->showFrom, $this->showCount, '*', FALSE, $this->sortField, $this->sortOrder);
$totalCount = $this->getTargetCount();
@ -1268,7 +1288,7 @@ class mailoutAdminClass extends e107MailManager
while ($row = $this->getNextTargetStatus(FALSE))
{
// print_a($row);
// print_a($row);
$text .= '<tr>';
foreach ($fieldPrefs as $fieldName)
{ // Output column data value
@ -1341,18 +1361,156 @@ class mailoutAdminClass extends e107MailManager
}
/**
* Clean up mailout DB
* Dump array of results to admin log
*
* @return boolean TRUE if no errors, FALSE if errors
*/
public function dbTidy()
{
$noError = TRUE;
$results = array();
$this->checkDB(2); // Make sure DB object created
if ($this->db2->db_Delete('mail_content', '`mail_content_status` = '.MAIL_STATUS_TEMP) === FALSE)
if (($res = $this->db2->db_Delete('mail_content', '`mail_content_status` = '.MAIL_STATUS_TEMP)) === FALSE)
{
return FALSE;
$results[] = 'Error '.$this->db2->mySQLlastErrNum.':'.$this->db2->mySQLlastErrText.' deleting temporary records from mail_content';
$noError = FALSE;
}
if ($this->db2->db_Delete('mail_recipients', '`mail_status` = '.MAIL_STATUS_TEMP) === FALSE)
else
{
return FALSE;
if ($res) $results[] = str_replace(array('--COUNT--', '--TABLE--'), array($res, 'mail_content'), LAN_MAILOUT_227);
}
return TRUE;
if (($res = $this->db2->db_Delete('mail_recipients', '`mail_status` = '.MAIL_STATUS_TEMP)) === FALSE)
{
$results[] = 'Error '.$this->db2->mySQLlastErrNum.':'.$this->db2->mySQLlastErrText.' deleting temporary records from mail_recipients';
$noError = FALSE;
}
else
{
if ($res) $results[] = str_replace(array('--COUNT--', '--TABLE--'), array($res, 'mail_recipients'), LAN_MAILOUT_227);
}
// Now look for 'orphaned' recipient records
if (($res = $this->db2->db_Select_gen("DELETE `#mail_recipients` FROM `#mail_recipients`
LEFT JOIN `#mail_content` ON `#mail_recipients`.`mail_detail_id` = `#mail_content`.`mail_source_id`
WHERE `#mail_content`.`mail_source_id` IS NULL")) === FALSE)
{
$results[] = 'Error '.$this->db2->mySQLlastErrNum.':'.$this->db2->mySQLlastErrText.' deleting orphaned records from mail_recipients';
$noError = FALSE;
}
else
{
if ($res) $results[] = str_replace('--COUNT--', $res, LAN_MAILOUT_226);
}
// Scan content table for anomalies, out of time records
if (($res = $this->db2->db_Select_gen("SELECT * FROM `#mail_content`
WHERE (`mail_content_status` >".MAIL_STATUS_FAILED.") AND (`mail_content_status` <=".MAIL_STATUS_MAX_ACTIVE.")
AND ((`mail_togo_count`=0) OR (`mail_last_date` < ".time()."))")) === FALSE)
{
$results[] = 'Error '.$this->db2->mySQLlastErrNum.':'.$this->db2->mySQLlastErrText.' checking bad status in mail_content';
$noError = FALSE;
}
else
{
$items = array(); // Store record number of any content record that needs to be changed
while ($row = $this->db2->db_Fetch(MYSQL_ASSOC))
{
$items[] = $row['mail_source_id'];
if ($row['mail_source_id'])
{
if (FALSE == $this->cancelEmail($row['mail_source_id']))
{
$results[] = 'Error cancelling email ref: '.$row['mail_source_id'];
}
}
}
if (count($items)) $results[] = str_replace(array('--COUNT--', '--RECORDS--'), array(count($items), implode(', ', $items)), LAN_MAILOUT_228);
}
//Finally - check for inconsistent recipient and content status records - basically verify counts
if (($res = $this->db2->db_Select_gen("SELECT COUNT(mr.`mail_status`) AS mr_count, mr.`mail_status`,
mc.`mail_source_id`, mc.`mail_togo_count`, mc.`mail_sent_count`, mc.`mail_fail_count`, mc.`mail_bounce_count`, mc.`mail_source_id` FROM `#mail_recipients` AS mr
LEFT JOIN `#mail_content` AS mc ON mr.`mail_detail_id` = mc.`mail_source_id`
WHERE mc.`mail_content_status` <= ".MAIL_STATUS_MAX_ACTIVE."
GROUP BY mr.`mail_status`, mc.`mail_source_id` ORDER BY mc.`mail_source_id`
")) === FALSE)
{
$results[] = 'Error '.$this->db2->mySQLlastErrNum.':'.$this->db2->mySQLlastErrText.' assembling email counts';
$noError = FALSE;
}
else
{
$lastMail = 0; // May get several rows per mail
$notLast = TRUE; // This forces one more loop, so we can clean up for last record read
$changeCount = 0;
$saveRow = array();
while (($row = $this->db2->db_Fetch(MYSQL_ASSOC)) || $notLast)
{
if (($lastMail > 0 && $row === FALSE) || ($lastMail != $row['mail_source_id']))
{ // Change of mail ID here - handle any accumulated info
if ($lastMail > 0)
{ // Need to verify counts for mail just read
$changes = array();
foreach ($counters as $k => $v)
{
if ($saveRow[$k] != $v)
{
$changes[$k] = $v; // Assume the counters have got it right
}
}
if (count($changes))
{
// *************** Update mail record here *********************
$this->checkDB(1);
$this->db->db_Update('mail_content', array('data' => $changes, 'WHERE' => '`mail_source_id` = '.$lastMail, '_FIELDS' => $this->dbTypes['mail_content']));
$line = "Count update for {$saveRow['mail_source_id']} - {$saveRow['mail_togo_count']}, {$saveRow['mail_sent_count']}, {$saveRow['mail_fail_count']}, {$saveRow['mail_bounce_count']} => ";
$line .= implode (', ', $counters);
$results[] = $line;
$changeCount++;
//echo $line.'<br />';
}
}
// Now reset for current mail
$lastMail = $row['mail_source_id'];
$counters = array('mail_togo_count' => 0, 'mail_sent_count' => 0, 'mail_fail_count' => 0, 'mail_bounce_count' => 0);
$saveRow = $row;
}
if ($row === FALSE) $notLast = FALSE;
// We get one record for each mail_status value for a given email - use them to update counts
if ($notLast)
{
switch ($row['mail_status'])
{
case MAIL_STATUS_SENT : // Mail sent. Email handler happy, but may have bounced (or may be yet to bounce)
$counters['mail_togo_count'] += $row['mr_count'];
break;
case MAIL_STATUS_BOUNCED :
$counters['mail_togo_count'] += $row['mr_count']; // It was sent, so increment that counter
$counters['mail_bounce_count'] += $row['mr_count']; //...but bounced, so extra status
break;
case MAIL_STATUS_CANCELLED : // Cancelled email - treat as a failure
case MAIL_STATUS_FAILED :
$counters['mail_fail_count'] += $row['mr_count']; // Never sent at all
break;
case MAIL_STATUS_PARTIAL : // Shouldn't get this on individual emails - ignore if we do
break;
default :
if (($row['mail_status'] >= MAIL_STATUS_PENDING) && ($row['mail_status'] <= MAIL_STATUS_MAX_ACTIVE))
{
$counters['mail_togo_count'] += $row['mr_count']; // Still in the queue
}
}
}
}
if ($changeCount) $results[] = str_replace('--COUNT--', $changeCount, LAN_MAILOUT_229);
}
$this->e107->admin_log->log_event('MAIL_05', implode('[!br!]', $results), E_LOG_INFORMATIVE, '');
return $noError;
}
}

View File

@ -9,8 +9,8 @@
* Plugin configuration module - gsitemap
*
* $Source: /cvs_backup/e107_0.8/e107_plugins/calendar_menu/e_cron.php,v $
* $Revision: 1.1 $
* $Date: 2009-11-22 10:11:31 $
* $Revision: 1.2 $
* $Date: 2009-11-23 21:06:00 $
* $Author: e107steved $
*
*/
@ -36,7 +36,7 @@ class calendar_menu_cron // include plugin-folder in the name.
public function __construct()
{
$this->e107 = e107::getInstance();
$this->debugLevel = 2;
//$this->debugLevel = 2;
}