View Issue Details

IDProjectCategoryView StatusLast Update
0006646mantisbtreportspublic2018-04-20 17:09
Reportermlovell Assigned To 
PrioritynormalSeverityfeatureReproducibilityN/A
Status acknowledgedResolutionopen 
Product Version1.0.0rc5 
Summary0006646: Weekly nag email script
Description

Attached below is the PHP script I have deployed to send a weekly reminder email to users. For each enabled user, the script finds

  • open issues they own, which need to be resolved;
  • resolved issues they reported, which need to be closed; and
  • if they manage any projects, new issues which need to be assigned.

In that last group, the new issues are taken only from projects for which that user is listed as a manager.

The script doesn't adhere to the tabbing/space conventions, but I tried to follow all variable-naming conventions and use existing functions when appropriate.

The script was developed against Mantis 1.0.0.rc5.

Tagspatch
Attached Files
nag_email.php.txt (6,909 bytes)   
<?php

##############################################################################
#
# reminder_email.php -- 
#    email nag-o-grams as needed, presumably once per week.
#


require_once( 'core.php' );

$t_core_path = config_get( 'core_path' );

require_once( $t_core_dir . 'current_user_api.php' );
require_once( $t_core_dir . 'email_api.php' );
require_once( $t_core_dir . 'history_api.php' );
require_once( $t_core_dir . 'bug_api.php' );

$g_debug = 0;

if ($argv[1] == "-d" || $argv[1] == "--debug") {
  $g_debug = 1;
}

# Get list of all enabled projects.  Eventually, we will need a way to
# turn off email for projects which are considered "done".  Can
# probably use project status for that function.
$g_all_projects = project_get_all_rows();
$t_project_ids  = array();
foreach ($g_all_projects as $t_project) {
  if ($t_project['enabled']) 
    $t_project_ids[] = $t_project['id'];
}

#var_dump($g_all_projects);
#var_dump($t_project_ids);

# Get all users in current installation
$t_all_users = user_get_all_rows();

#var_dump($t_all_users);

# Loop through each user, looking for open and resolved issues.
foreach ($t_all_users as $t_user) {

  # skip adminstrative accounts
  if ($t_user['username'] == "administrator") { continue; }
  # if ($t_user['access_level'] >= ADMINISTRATOR) { continue; }

  # Decide if this user is a manager.  Collect all Project IDs for
  # which they are a manager
  $t_manage_ids = array();
  if ($t_user['access_level'] >= MANAGER) {
    $t_manage_ids = $t_project_ids;
  } else {
    
    $t_proj_user_list = config_get( 'mantis_project_user_list_table' );
    $query = 
      "SELECT DISTINCT project_id FROM $t_proj_user_list WHERE " .
      "user_id = " . $t_user['id'] . " AND " .
      "access_level > " . MANAGER;

    $result = db_query( $query );
    $count  = db_num_rows( $result );
    for ( $i = 0; $i < $count; $i++ ) {
      $row = db_fetch_array( $result );
      $t_manage_ids[] = (int)$row['project_id'];
    }

  }

  user_nag_message($t_user, $t_project_ids, $t_manage_ids);
}


##############################################################################
#                         F U N C T I O N S
##############################################################################


# Return all info on all users
function user_get_all_rows() {
  $t_user_table = config_get( 'mantis_user_table' );
  $query = "SELECT * FROM $t_user_table WHERE enabled = 1";
  $result = db_query( $query );
  $count  = db_num_rows( $result );
  for ( $i = 0; $i < $count; $i++ ) {
    $row = db_fetch_array( $result );
    $t_users[(int)$row['id']] = $row;
  }
  return $t_users;

} # user_get_all_rows




# Given a user, look through all issues in enabled projects 
# for three lists:
#
#   1.  Issues owned (Handled By) this user, which need to
#       be resolved.
#
#   2.  Issues reported by this user which have been resolved. 
#       The user needs to close these issues.
#
#   3.  If the user is a manager for any project, look for
#       unassigned new issues.  Remind manager to find
#       an owner for these.
#
function user_nag_message( $p_user, $p_proj_ids, $p_manage_ids ) {
  global $g_all_projects;
  global $g_debug;

  $open_count     = 0;
  $resolved_count = 0;
  $new_count      = 0;

  echo "Checking issues for " . $p_user['realname'] . "\n";

  $t_bug_table = config_get( 'mantis_bug_table' );

  # Open issues which need to be resolved
  $query = 
    "SELECT id, summary " .
    "FROM $t_bug_table WHERE status < " . RESOLVED . " AND " .
    "handler_id = " . $p_user['id'] . " AND " .
    "project_id in (" . implode(",", $p_proj_ids) . ") " .
    "ORDER BY priority DESC, id";

  $result = db_query( $query );
  $open_count = db_num_rows( $result );
  for ( $i = 0; $i< $open_count; $i++ ) {
    $row = db_fetch_array( $result );
    $t_open[(int)$row['id']] = $row;
    if ($g_debug) { echo "  Open issue " . $row['id'] . "\n"; }
  }

  # Resolved issues which need to be closed
  $query = 
    "SELECT id, summary " .
    "FROM $t_bug_table WHERE status IN (" . RESOLVED . ") AND " .
    "reporter_id = " . $p_user['id'] . " AND " . 
    "project_id in (" . implode(",", $p_proj_ids) . ") " .
    "ORDER BY priority DESC, id";

  $result = db_query( $query );
  $resolved_count = db_num_rows( $result );
  for ( $i = 0; $i< $resolved_count; $i++ ) {
    $row = db_fetch_array( $result );
    $t_resolved[(int)$row['id']] = $row;
    if ($g_debug) { echo "  Resolved issue " . $row['id'] . "\n"; }
  }

  # New issues which need to be assigned
  if (count($p_manage_ids) > 0) {
    
    $query = 
      "SELECT id, summary " .
      "FROM $t_bug_table WHERE status IN (" . NEW_ . ") AND " .
      "project_id in (" . implode(",", $p_manage_ids) . ") " .
      "ORDER BY priority DESC, id";    
    
    $result = db_query( $query );
    $new_count = db_num_rows( $result );
    for ( $i = 0; $i< $new_count; $i++ ) {
      $row = db_fetch_array( $result );
      $t_new[(int)$row['id']] = $row;
      if ($g_debug) { echo "  New issue " . $row['id'] . "\n"; }
    }    
  }

  
  # If nothing worth nagging about has been found, just return
  if ($open_count == 0 &&
      $resolved_count == 0 &&
      $new_count == 0) {
    return;
  }

  #
  # ...otherwise, construct the nag message !!
  #

  $t_padding = config_get( 'display_bug_padding' );
  $t_host    = getenv('HOSTNAME');

  $subject = "Mantis reminder";

  $message = "This message is a reminder from Mantis on " . $t_host . ".\n\n";
  # %%% FIXME: URL should be generic
  $message .= "    http://wally/mantis/" . config_get( 'default_home_page' );
  $message .= "\n\n\n";

  $message .= "The issues listed below are sorted in priority order.\n\n\n";

  if ($open_count > 0) {
    $message .= "The following open issues need to be resolved: \n";
    $message .= str_pad('', 78, '-') . "\n";

    foreach ($t_open as $issue) {
      $message .= str_pad( $issue['id'], $t_padding, ' ', STR_PAD_LEFT ) . " ";
      $message .= $issue['summary'];
      $message .= "\n";
    }
    $message .= "\n\n";
  }



  if ($resolved_count > 0) {
    $message .= "The following resolved issues need to be closed: \n";
    $message .= str_pad('', 78, '-') . "\n";

    foreach ($t_resolved as $issue) {
      $message .= str_pad( $issue['id'], $t_padding, ' ', STR_PAD_LEFT ) . " ";
      $message .= $issue['summary'];
      $message .= "\n";
    }
    $message .= "\n\n";
  }



  if ($new_count > 0) {
    $message .= "The following NEW issues need to be assigned: \n";
    $message .= str_pad('', 78, '-') . "\n";

    foreach ($t_new as $issue) {
      $message .= str_pad( $issue['id'], $t_padding, ' ', STR_PAD_LEFT ) . " ";
      $message .= $issue['summary'];
      $message .= "\n";
    }
    $message .= "\n\n";
  }
  
  if ($g_debug) {  
    echo $message;
  } else {
    email_send( $p_user['email'], $subject, $message, "", "", false);
  }

} # user_nag_message

?>
nag_email.php.txt (6,909 bytes)   
nag_email.php (6,890 bytes)   
<?php

##############################################################################
#
# reminder_email.php -- 
#    email nag-o-grams as needed, presumably once per week.
#


require_once( 'core.php' );

$t_core_path = config_get( 'core_path' );

require_once( $t_core_dir . 'current_user_api.php' );
require_once( $t_core_dir . 'email_api.php' );
require_once( $t_core_dir . 'history_api.php' );
require_once( $t_core_dir . 'bug_api.php' );

$g_debug = 0;

if ($argv[1] == "-d" || $argv[1] == "--debug") {
  $g_debug = 1;
}

# Get list of all enabled projects.  Eventually, we will need a way to
# turn off email for projects which are considered "done".  Can
# probably use project status for that function.
$g_all_projects = project_get_all_rows();
$t_project_ids  = array();
foreach ($g_all_projects as $t_project) {
  if ($t_project['enabled']) 
    $t_project_ids[] = $t_project['id'];
}

#var_dump($g_all_projects);
#var_dump($t_project_ids);

# Get all users in current installation
$t_all_users = user_get_all_rows();

#var_dump($t_all_users);

# Loop through each user, looking for open and resolved issues.
foreach ($t_all_users as $t_user) {

  # skip adminstrative accounts
  if ($t_user['username'] == "administrator") { continue; }
  # if ($t_user['access_level'] >= ADMINISTRATOR) { continue; }

  # Decide if this user is a manager.  Collect all Project IDs for
  # which they are a manager
  $t_manage_ids = array();
  if ($t_user['access_level'] >= MANAGER) {
    $t_manage_ids = $t_project_ids;
  } else {
    
    $t_proj_user_list = config_get( 'mantis_project_user_list_table' );
    $query = 
      "SELECT DISTINCT project_id FROM $t_proj_user_list WHERE " .
      "user_id = " . $t_user['id'] . " AND " .
      "access_level > " . MANAGER;

    $result = db_query( $query );
    $count  = db_num_rows( $result );
    for ( $i = 0; $i < $count; $i++ ) {
      $row = db_fetch_array( $result );
      $t_manage_ids[] = (int)$row['project_id'];
    }

  }

  user_nag_message($t_user, $t_project_ids, $t_manage_ids);
}


##############################################################################
#                         F U N C T I O N S
##############################################################################


# Return all info on all users
function user_get_all_rows() {
  $t_user_table = config_get( 'mantis_user_table' );
  $query = "SELECT * FROM $t_user_table WHERE enabled = 1";
  $result = db_query( $query );
  $count  = db_num_rows( $result );
  for ( $i = 0; $i < $count; $i++ ) {
    $row = db_fetch_array( $result );
    $t_users[(int)$row['id']] = $row;
  }
  return $t_users;

} # user_get_all_rows




# Given a user, look through all issues in enabled projects 
# for three lists:
#
#   1.  Issues owned (Handled By) this user, which need to
#       be resolved.
#
#   2.  Issues reported by this user which have been resolved. 
#       The user needs to close these issues.
#
#   3.  If the user is a manager for any project, look for
#       unassigned new issues.  Remind manager to find
#       an owner for these.
#
function user_nag_message( $p_user, $p_proj_ids, $p_manage_ids ) {
  global $g_all_projects;
  global $g_debug;

  $open_count     = 0;
  $resolved_count = 0;
  $new_count      = 0;

  echo "Checking issues for " . $p_user['realname'] . "\n";

  $t_bug_table = config_get( 'mantis_bug_table' );

  # Open issues which need to be resolved
  $query = 
    "SELECT id, summary " .
    "FROM $t_bug_table WHERE status < " . RESOLVED . " AND " .
    "handler_id = " . $p_user['id'] . " AND " .
    "project_id in (" . implode(",", $p_proj_ids) . ") " .
    "ORDER BY priority DESC, id";

  $result = db_query( $query );
  $open_count = db_num_rows( $result );
  for ( $i = 0; $i< $open_count; $i++ ) {
    $row = db_fetch_array( $result );
    $t_open[(int)$row['id']] = $row;
    if ($g_debug) { echo "  Open issue " . $row['id'] . "\n"; }
  }

  # Resolved issues which need to be closed
  $query = 
    "SELECT id, summary " .
    "FROM $t_bug_table WHERE status IN (" . RESOLVED . ") AND " .
    "reporter_id = " . $p_user['id'] . " AND " . 
    "project_id in (" . implode(",", $p_proj_ids) . ") " .
    "ORDER BY priority DESC, id";

  $result = db_query( $query );
  $resolved_count = db_num_rows( $result );
  for ( $i = 0; $i< $resolved_count; $i++ ) {
    $row = db_fetch_array( $result );
    $t_resolved[(int)$row['id']] = $row;
    if ($g_debug) { echo "  Resolved issue " . $row['id'] . "\n"; }
  }

  # New issues which need to be assigned
  if (count($p_manage_ids) > 0) {
    
    $query = 
      "SELECT id, summary " .
      "FROM $t_bug_table WHERE status IN (" . NEW_ . ") AND " .
      "project_id in (" . implode(",", $p_manage_ids) . ") " .
      "ORDER BY priority DESC, id";    
    
    $result = db_query( $query );
    $new_count = db_num_rows( $result );
    for ( $i = 0; $i< $new_count; $i++ ) {
      $row = db_fetch_array( $result );
      $t_new[(int)$row['id']] = $row;
      if ($g_debug) { echo "  New issue " . $row['id'] . "\n"; }
    }    
  }

  
  # If nothing worth nagging about has been found, just return
  if ($open_count == 0 &&
      $resolved_count == 0 &&
      $new_count == 0) {
    return;
  }

  #
  # ...otherwise, construct the nag message !!
  #

  $t_padding = config_get( 'display_bug_padding' );
  $t_host    = getenv('HOSTNAME');

  $subject = "Mantis reminder";

  $message = "This message is a reminder from Mantis.\n\n";
  # %%% FIXME: URL should be generic
  $message .= "    http://wally/mantis/" . config_get( 'default_home_page' );
  $message .= "\n\n\n";

  $message .= "The issues listed below are sorted in priority order.\n\n\n";

  if ($open_count > 0) {
    $message .= "The following open issues need to be resolved: \n";
    $message .= str_pad('', 78, '-') . "\n";

    foreach ($t_open as $issue) {
      $message .= str_pad( $issue['id'], $t_padding, ' ', STR_PAD_LEFT ) . " ";
      $message .= $issue['summary'];
      $message .= "\n";
    }
    $message .= "\n\n";
  }



  if ($resolved_count > 0) {
    $message .= "The following resolved issues need to be closed: \n";
    $message .= str_pad('', 78, '-') . "\n";

    foreach ($t_resolved as $issue) {
      $message .= str_pad( $issue['id'], $t_padding, ' ', STR_PAD_LEFT ) . " ";
      $message .= $issue['summary'];
      $message .= "\n";
    }
    $message .= "\n\n";
  }



  if ($new_count > 0) {
    $message .= "The following NEW issues need to be assigned: \n";
    $message .= str_pad('', 78, '-') . "\n";

    foreach ($t_new as $issue) {
      $message .= str_pad( $issue['id'], $t_padding, ' ', STR_PAD_LEFT ) . " ";
      $message .= $issue['summary'];
      $message .= "\n";
    }
    $message .= "\n\n";
  }
  
  if ($g_debug) {  
    echo $message;
  } else {
    email_send( $p_user['email'], $subject, $message, "", "", false);
  }

} # user_nag_message

?>
nag_email.php (6,890 bytes)   

Relationships

related to 0005887 new How about a daily report send by email to managers and developers? 
has duplicate 0006645 closedthraxisp Weekly nag email script 
has duplicate 0006465 closedgrangeway Feature request for daily mail report 
has duplicate 0006528 closedgrangeway Whinning feature, similar to bugzilla 
has duplicate 0005499 closedgrangeway Can Mantis send "Nag" Reminders to Developer/Manager when bug is old 
has duplicate 0004221 closedgrangeway Automatic Email Reminder of unresolved issues. 

Activities

vboctor

vboctor

2008-07-05 21:28

manager   ~0018316

mlovell, would it be possible to re-attach the script since we have lost the attachment.

mlovell

mlovell

2008-07-05 23:02

reporter   ~0018317

Re-attaching nag_email script.

prabhurangan

prabhurangan

2009-02-17 05:39

reporter   ~0020868

Dear Mlovell,

In the above issue, you have mentioned that this nag_email.php will send email for every week to managers, regarding the new issues created or modified or unresolved. however i need to send a reminder for deadlines of task which is still in un-resolved status, after the deadline period.

Also i need to email the daily status report of the user to the concerned user and also to the managers.

Regards,
Prabhu.

janderson@carsley.com

janderson@carsley.com

2018-04-20 17:09

reporter   ~0059624

Here's an updated version that works in Mantis 2.x

nag_email-2.php (8,059 bytes)   
<?php

##############################################################################
#
# reminder_email.php -- 
#    email nag-o-grams as needed, presumably once per week.
#


require_once('core.php');

$t_core_path = config_get('core_path');

require_api('current_user_api.php');
require_api('database_api.php');
require_api('email_api.php');
require_api('history_api.php');
require_api('bug_api.php');

$is_cli = php_sapi_name() === "cli";

# If running from the web, force authentication and render the layout
if ( !$is_cli ) {
    auth_reauthenticate();
    access_ensure_global_level( config_get( 'manage_site_threshold' ) );

    layout_page_header( lang_get( 'manage_link' ) );

    layout_page_begin();
}

$g_debug = 0;

if ($argv[1] == "-d" || $argv[1] == "--debug") {
    $g_debug = 1;
}

# Get list of all enabled projects.  Eventually, we will need a way to
# turn off email for projects which are considered "done".  Can
# probably use project status for that function.
$g_all_projects = project_get_all_rows();
$t_project_ids = array();
foreach ($g_all_projects as $t_project) {
    if ($t_project['enabled'])
        $t_project_ids[] = $t_project['id'];
}

#var_dump($g_all_projects);
#var_dump($t_project_ids);

# Get all users in current installation
$t_all_users = user_get_all_rows();

#var_dump($t_all_users);

# Loop through each user, looking for open and resolved issues.
foreach ($t_all_users as $t_user) {

    # skip adminstrative accounts
    if ($t_user['username'] == "administrator") {
        continue;
    }
    # if ($t_user['access_level'] >= ADMINISTRATOR) { continue; }

    # Decide if this user is a manager.  Collect all Project IDs for
    # which they are a manager
    $t_manage_ids = array();
    if ($t_user['access_level'] >= MANAGER) {
        $t_manage_ids = $t_project_ids;
    } else {

        db_param_push();
        $query =
            "SELECT DISTINCT project_id FROM {project_user_list} WHERE " .
            "user_id = " . db_param() . " AND " .
            "access_level > " . db_param();

    $result = db_query($query, array($t_user['id'], MANAGER));
    $count = db_num_rows($result);
    for ($i = 0; $i < $count; $i++) {
        $row = db_fetch_array($result);
        $t_manage_ids[] = (int)$row['project_id'];
    }

  }

    user_nag_message($t_user, $t_project_ids, $t_manage_ids);
}

if ( !$is_cli ) {
    layout_page_end();
}

##############################################################################
#                         F U N C T I O N S
##############################################################################


# Return all info on all users
function user_get_all_rows()
{

    db_param_push();

    $query = "SELECT * FROM {user} WHERE enabled = " . db_param();

    $result = db_query($query, array(1));
    $count = db_num_rows($result);
    for ($i = 0; $i < $count; $i++) {
        $row = db_fetch_array($result);
        $t_users[(int)$row['id']] = $row;
    }
    return $t_users;

} # user_get_all_rows


# Given a user, look through all issues in enabled projects
# for three lists:
#
#   1.  Issues owned (Handled By) this user, which need to
#       be resolved.
#
#   2.  Issues reported by this user which have been resolved. 
#       The user needs to close these issues.
#
#   3.  If the user is a manager for any project, look for
#       unassigned new issues.  Remind manager to find
#       an owner for these.
#
function user_nag_message($p_user, $p_proj_ids, $p_manage_ids)
{
    global $g_all_projects;
    global $g_debug;
    global $is_cli;

    $open_count = 0;
    $resolved_count = 0;
    $new_count = 0;

    echo "Checking issues for " . $p_user['realname'] . ($is_cli ? "\n" : "<br>");

    # Open issues which need to be resolved
    db_param_push();
    $query =
        "SELECT id, summary " .
        "FROM {bug} WHERE status < " . db_param() . " AND " .
        "handler_id = " . db_param() . " AND " .
        "project_id in (" . implode(",", $p_proj_ids) . ") " .
        "ORDER BY priority DESC, id";

    $result = db_query($query, array(RESOLVED, $p_user['id']));
    $open_count = db_num_rows($result);
    for ($i = 0; $i < $open_count; $i++) {
        $row = db_fetch_array($result);
        $t_open[(int)$row['id']] = $row;
        if ($g_debug) {
            echo "  Open issue " . $row['id'] . "\n";
        }
    }

    # Resolved issues which need to be closed
    db_param_push();
    $query =
        "SELECT id, summary " .
        "FROM {bug} WHERE status IN (" . db_param() . ") AND " .
        "reporter_id = " . db_param() . " AND " .
        "project_id in (" . implode(",", $p_proj_ids) . ") " .
        "ORDER BY priority DESC, id";

    $result = db_query($query, array(RESOLVED, $p_user['id']));
    $resolved_count = db_num_rows($result);
    for ($i = 0; $i < $resolved_count; $i++) {
        $row = db_fetch_array($result);
        $t_resolved[(int)$row['id']] = $row;
        if ($g_debug) {
            echo "  Resolved issue " . $row['id'] . "\n";
        }
    }

    # New issues which need to be assigned
    if (count($p_manage_ids) > 0) {

        $query =
            "SELECT id, summary " .
            "FROM {bug} WHERE status IN (" . db_param() . ") AND " .
            "project_id in (" . implode(",", $p_manage_ids) . ") " .
            "ORDER BY priority DESC, id";

        $result = db_query($query, array( NEW_ ));
        $new_count = db_num_rows($result);
        for ($i = 0; $i < $new_count; $i++) {
            $row = db_fetch_array($result);
            $t_new[(int)$row['id']] = $row;
            if ($g_debug) {
                echo "  New issue " . $row['id'] . "\n";
            }
        }
    }


    # If nothing worth nagging about has been found, just return
    if ($open_count == 0 &&
        $resolved_count == 0 &&
        $new_count == 0) {
        return;
    }

    #
    # ...otherwise, construct the nag message !!
    #

    $t_padding = config_get('display_bug_padding');
    $t_host = getenv('HOSTNAME');

    $subject = "Mantis reminder";

    $message = "This message is a reminder from Mantis.\n\n";

    $t_url = config_get_global( 'path' ) . config_get_global( 'default_home_page' );
    $message .= "    $t_url";
    $message .= "\n\n\n";

    $message .= "The issues listed below are sorted in priority order.\n\n\n";

    if ($open_count > 0) {
        $message .= "The following open issues need to be resolved: \n";
        $message .= str_pad('', 78, '-') . "\n";

        foreach ($t_open as $issue) {
            $message .= str_pad($issue['id'], $t_padding, ' ', STR_PAD_LEFT) . " ";
            $message .= $issue['summary'] . " ";
            $message .= "(" . string_get_bug_view_url_with_fqdn($issue['id']) . ")";
            $message .= "\n";
        }
        $message .= "\n\n";
    }


    if ($resolved_count > 0) {
        $message .= "The following resolved issues need to be closed: \n";
        $message .= str_pad('', 78, '-') . "\n";

        foreach ($t_resolved as $issue) {
            $message .= str_pad($issue['id'], $t_padding, ' ', STR_PAD_LEFT) . " ";
            $message .= $issue['summary'] . " ";
            $message .= "(" . string_get_bug_view_url_with_fqdn($issue['id']) . ")";
            $message .= "\n";
        }
        $message .= "\n\n";
    }


    if ($new_count > 0) {
        $message .= "The following NEW issues need to be assigned: \n";
        $message .= str_pad('', 78, '-') . "\n";

        foreach ($t_new as $issue) {
            $message .= str_pad($issue['id'], $t_padding, ' ', STR_PAD_LEFT) . " ";
            $message .= $issue['summary'] . " ";
            $message .= "(" . string_get_bug_view_url_with_fqdn($issue['id']) . ")";
            $message .= "\n";
        }
        $message .= "\n\n";
    }

    if ($g_debug) {
        echo $message;
    } else {
        $emailData = new EmailData();
        $emailData->email = $p_user['email'];
        $emailData->subject = $subject;
        $emailData->body = $message;

        email_send($emailData);
    }

} # user_nag_message

?>
nag_email-2.php (8,059 bytes)