DueDateRemindersByEmail: Difference between revisions

From Request Tracker Wiki
Jump to navigation Jump to search
m (2 revisions imported)
(No difference)

Revision as of 15:08, 6 April 2016

The following script will send email notifications on Tickets that are over due.

New version ( 3.1 )

New version ( 3.1 ) by Vaclav Vobornik added at 4.7.2008
#!/usr/bin/perl
 ####################### RT Email Notification Script ####################
 ####
 #### Author: Daniely Yoav / Qball Technologies Ltd.
 #### Email: yoavd@qballtech.net
 #### Date: 05/06/05
 ####
 #### Modified by: Tomas Borland Valenta
 #### Email: tomas at trustica dot cz
 #### Date: 2007/03/12
 ####
 #### Modified by: Tim Schaller
 #### Email: tim-rt@torzo.com
 #### Date: 2008/06/17
 ####
 #### Modified by: Vaclav Vobornik
 #### Email: vaclav dot vobornik at commerzbank dot com
 #### Date: 2008/07/04
 ####
 #### Purpose: Send Email Notification on all open/new tickets in RT that have their due date expired
 ####
 #### Version: 3.1
 ####
 #### Changes from 3 ( Vaclav Vobornik )
 #### - Added Cc and Bcc possibilities.
 ####
 #### Changes from 2 ( Tim Schaller )
 #### - Added multiple command line options.
 #### - Adaptive subject line.
 #### - Sending Admin CC emails optional.
 ####
 #### Changes from 1.2 ( Tomas Borland Valenta )
 #### - rewriten mail subsystem
 #### - code cleanup
 #### - adopted for RT 3.6.x
 #### - used some global RT config variables
 ####
 #### ======================================================================
 ####
 #### Command line options
 ####          -d          : turns dubugging on
 ####          -A          : Send to AdminCC ( made default not to )
 ####          -a <n>      : Send reminders to tickets due in <n> or less days.
 ####                      : Includes overdue tickets.
 ####          -q <queue>  : Only send reminder for tickets in <queue>
 ####          -o <owner>  : Only send reminders for tickets owned by <owner>
 ####          -c <email>  : Email in Cc
 ####          -b <email>  : Email in Bcc
 ####
 #### ======================================================================
 ####
 ####  Usage: Invoke via cron every working day at 8 morning
 ####  0 8 * * 1-5 /path/to/script/remind_email_due.pl -A
 ####
 ####  Usage: Invoke via cron every working day at 8 morning
 ####       : and send notices to everyone in the SysAdmin Queue
 ####  0 8 * * 1-5 /path/to/script/remind_email_due.pl -q SysAdmin
 ####
 ####  Usage: Invoke via cron every working day at 8 morning
 ####       : and send notices to everyone in the SysAdmin Queue
 ####       : Remind them about tickets due in less then 5 days.
 ####  0 8 * * 1-5 /path/to/script/remind_email_due.pl -a 5 -q SysAdmin
 ####
 ####  Usage: Invoke via cron every working day at 8 morning
 ####       : and send notices to everyone in the SysAdmin Queue.
 ####       : Send copies to all AdminCC on the tickest.
 ####  0 8 * * 1-5 /path/to/script/remind_email_due.pl -A -q SysAdmin
 
 ### External libraries ###
 use strict;
 use Getopt::Std;
 
 use lib ("/opt/rt3/lib");  # Change this to your RT lib path!
 package RT;
 use RT::Interface::CLI qw(CleanEnv GetCurrentUser GetMessageContent loc);
 use RT::Date;
 use RT::Queue;
 use RT::Queues;
 use RT::Tickets;
 
 ################## Init ##################
 # Clean our environment
 CleanEnv();
 # Load the RT configuration
 RT::LoadConfig();
 RT::Init();
 # Set config variables
 my $debug=0;
 my $from_address = $RT::CorrespondAddress; #From: address used in reports
 my $rt_url = $RT::WebURL;
 my $sendmail = "$RT::SendmailPath $RT::SendmailArguments";
 
 ################## Args ##################
 my $queue         = '';
 my $owner         = '';
 my $advDate       = 0;
 my $secInDay      = 60*60*24;
 my $sendToAdminCC = 0;
 my $cc            = '';
 my $bcc           = '';
 
 my %options=();
 Getopt::Std::getopts("Ada:q:o:c:b:",\%options);
 
 $queue         = $options{q} if defined $options{q};
 $owner         = $options{o} if defined $options{o};
 $advDate       = ( $options{a} * $secInDay ) if defined $options{a};
 $debug         = $options{d} if defined $options{d};
 $sendToAdminCC =  $options{A} if defined $options{A};
 $cc            = $options{c} if defined $options{c};
 $bcc           = $options{b} if defined $options{b};
 
 
 ################## Variables Init ##################
 my $User = new RT::User($RT::SystemUser); # Define an RT User variable
 my $date = new RT::Date($RT::SystemUser); # Define a date variable (used for comparisions)
 my $tickets = new RT::Tickets($RT::SystemUser); # Used to store Ticket search results
 my $now = new RT::Date($RT::SystemUser); # get current time
 $now->SetToNow();
 my $report; # Used for output
 my $subject; # Used as subject line
 
 ################## Main Program ##################
 # Limit the ticket search to new and open only.
 $tickets->LimitStatus(VALUE => 'new');
 $tickets->LimitStatus(VALUE => 'open');
 
 # Loop through new/open tickets
 while (my $Ticket = $tickets->Next) {
     # Construct POP-Up Message
     $User->Load($Ticket->Owner);
 
     # Compare Dates to check whether the ticket's due date is in the past + Due date exists
     $date->Set(Format => "ISO",Value => $Ticket->Due);
     if ($now->Unix - $date->Unix < (1 - $advDate ) or $date->Unix == -1 or $date->Unix == 0) { next; }
 
     # Compare owner and queue if given. Skip current ticket if invalid.
     if ($owner) { if ( lc($User->Name) ne lc($owner) ) { next; } }
     if ($queue) { if ( lc($Ticket->QueueObj->Name) ne lc($queue) ) { next; } }
 
     # Generate a report
     $report = "";
     $report .= "Ticket #: " . $Ticket->id . "\n";
     $report .= "Subject:  " . $Ticket->Subject . "\n";
     $report .= "Queue:    " . $Ticket->QueueObj->Name . " (". $Ticket->QueueObj->AdminCcAddresses .") \n";
     $report .= "Owner:    " . $User->Name ."\n";
     $report .= "Due date: " . $date->ISO . "\n";
     $report .= "URL:      " . $rt_url . "Ticket/Display.html?id=" . $Ticket->id . "\n";
 
     # Set the subject based on the due date.
     if( ($now->Unix - $date->Unix < 0  ) or $date->Unix == -1 ) {
         $subject =  "Ticket #". $Ticket->id . " with owner " . $User->Name ." is due on " . $date->ISO;
     } else {
         $subject =  "Ticket #". $Ticket->id . " with owner " . $User->Name ." is overdue";
     }
 
     # Get Queue Admin CC
     # Do we send to Admin CC as well as to owner?
     my @emails = ();
     if ( $sendToAdminCC ) {
         @emails = ($User->EmailAddress, split(/,/, $Ticket->AdminCcAddresses), split(/,/ , $Ticket->QueueObj->AdminCcAddresses));
     } else {
         @emails = ($User->EmailAddress);
     }
 
     # remove duplicates
     my %temp = (); @emails = grep ++$temp{$_} < 2, @emails;
     send_report(@emails);
 }
 
 # Close RT Handle
 $RT::Handle->Disconnect();
 exit 0;
 
 # This procedure will send a report by mail to the owner
 #  parameter 1 - email addresses to send to
 # Global variables refered to:
 #  $subject - Subject line
 #  @report - Message content
 #  $from_address - address to send from
 #  $cc - CarbonCoby email address
 #  $bcc - BlindCarbonCopy email address
 sub send_report {
     my @tos = @_;
     my $addr;
 
     foreach $addr (@tos) {
         next if (length($addr) == 0);
         my $msg = "";
         $msg .= "From: $from_address\n";
         $msg .= "To: $addr\n";
         $msg .= "Cc: $cc\n" if $cc;
         $msg .= "Bcc: $bcc\n" if $bcc;
         $msg .= "Subject: $subject\n";
         $msg .= "\n";
         $msg .= $report;
 
         if ($debug) {
             print "====== Would call '$sendmail' with this input:\n";
             print "$msg\n\n";
         } else {
             open(SENDMAIL, "|$sendmail") || die "Error sending mail: $!";
             print SENDMAIL $msg;
             close(SENDMAIL);
         }
     }
 }
 
 
 
 

Old version ( 3.0 )

Version ( 3.0 ) by Tim Schaller added at 17.6.2008
#!/usr/bin/perl
 ####################### RT Email Notification Script ####################
 ####
 #### Author: Daniely Yoav / Qball Technologies Ltd.
 #### Email: yoavd@qballtech.net
 #### Date: 05/06/05
 ####
 #### Modified by: Tomas Borland Valenta
 #### Email: tomas at trustica dot cz
 #### Date: 2007/03/12
 ####
 #### Modified by: Tim Schaller
 #### Email: tim-rt@torzo.com
 #### Date: 2008/06/17
 ####
 #### Purpose: Send Email Notification on all open/new tickets in RT that have their due date expired
 ####
 #### Version: 3
 ####
 #### Changes from 2 ( Tim Schaller )
 #### - Added multiple command line options.
 #### - Adaptive subject line.
 #### - Sending Admin CC emails optional.
 ####
 #### Changes from 1.2 ( Tomas Borland Valenta )
 #### - rewriten mail subsystem
 #### - code cleanup
 #### - adopted for RT 3.6.x
 #### - used some global RT config variables
 ####
 #### ======================================================================
 ####
 #### Command line options
 ####          -d          : turns dubugging on
 ####          -A          : Send to AdminCC ( made default not to )
 ####          -a <n>      : Send reminders to tickets due in <n> or less days.
 ####                      : Includes overdue tickets.
 ####          -q <queue>  : Only send reminder for tickets in <queue>
 ####          -o <owner>  : Only send reminders for tickets owned by <owner>
 ####
 #### ======================================================================
 ####
 ####  Usage: Invoke via cron every working day at 8 morning
 ####  0 8 * * 1-5 /path/to/script/remind_email_due.pl -A
 ####
 ####  Usage: Invoke via cron every working day at 8 morning
 ####       : and send notices to everyone in the SysAdmin Queue
 ####  0 8 * * 1-5 /path/to/script/remind_email_due.pl -q SysAdmin
 ####
 ####  Usage: Invoke via cron every working day at 8 morning
 ####       : and send notices to everyone in the SysAdmin Queue
 ####       : Remind them about tickets due in less then 5 days.
 ####  0 8 * * 1-5 /path/to/script/remind_email_due.pl -a 5 -q SysAdmin
 ####
 ####  Usage: Invoke via cron every working day at 8 morning
 ####       : and send notices to everyone in the SysAdmin Queue.
 ####       : Send copies to all AdminCC on the tickest.
 ####  0 8 * * 1-5 /path/to/script/remind_email_due.pl -A -q SysAdmin
 
 ### External libraries ###
 use strict;
 use Getopt::Std;
 
 use lib ("/usr/local/rt/lib");  # Change this to your RT lib path!
 package RT;
 use RT::Interface::CLI qw(CleanEnv GetCurrentUser GetMessageContent loc);
 use RT::Date;
 use RT::Queue;
 use RT::Queues;
 use RT::Tickets;
 
 ################## Init ##################
 # Clean our environment
 CleanEnv();
 # Load the RT configuration
 RT::LoadConfig();
 RT::Init();
 # Set config variables
 my $debug=0;
 my $from_address = $RT::CorrespondAddress; #From: address used in reports
 my $rt_url = $RT::WebURL;
 my $sendmail = "$RT::SendmailPath $RT::SendmailArguments";
 
 ################## Args ##################
 my $queue         = '';
 my $owner         = '';
 my $advDate       = 0;
 my $secInDay      = 60*60*24;
 my $sendToAdminCC = 0;
 
 my %options=();
 Getopt::Std::getopts("Ada:q:o:",\%options);
 
 $queue         = $options{q} if defined $options{q};
 $owner         = $options{o} if defined $options{o};
 $advDate       = ( $options{a} * $secInDay ) if defined $options{a};
 $debug         = $options{d} if defined $options{d};
 $sendToAdminCC =  $options{A} if defined $options{A};
 
 ################## Variables Init ##################
 my $User = new RT::User($RT::SystemUser); # Define an RT User variable
 my $date = new RT::Date($RT::SystemUser); # Define a date variable (used for comparisions)
 my $tickets = new RT::Tickets($RT::SystemUser); # Used to store Ticket search results
 my $now = new RT::Date($RT::SystemUser); # get current time
 $now->SetToNow();
 my $report; # Used for output
 my $subject; # Used as subject line
 
 ################## Main Program ##################
 # Limit the ticket search to new and open only.
 $tickets->LimitStatus(VALUE => 'new');
 $tickets->LimitStatus(VALUE => 'open');
 
 # Loop through new/open tickets
 while (my $Ticket = $tickets->Next) {
     # Construct POP-Up Message
     $User->Load($Ticket->Owner);
 
     # Compare Dates to check whether the ticket's due date is in the past + Due date exists
     $date->Set(Format => "ISO",Value => $Ticket->Due);
     if ($now->Unix - $date->Unix < (1 - $advDate ) or $date->Unix == -1) { next; }
 
     # Compare owner and queue if given. Skip current ticket if invalid.
     if ($owner) { if ( lc($User->Name) ne lc($owner) ) { next; } }
     if ($queue) { if ( lc($Ticket->QueueObj->Name) ne lc($queue) ) { next; } }
 
     # Generate a report
     $report = "";
     $report .= "Ticket #: " . $Ticket->id . "\n";
     $report .= "Subject:  " . $Ticket->Subject . "\n";
     $report .= "Queue:    " . $Ticket->QueueObj->Name . " (". $Ticket->QueueObj->AdminCcAddresses .") \n";
     $report .= "Owner:    " . $User->Name ."\n";
     $report .= "Due date: " . $date->ISO . "\n";
     $report .= "URL:      " . $rt_url . "Ticket/Display.html?id=" . $Ticket->id . "\n";
 
     # Set the subject based on the due date.
     if( ($now->Unix - $date->Unix < 0  ) or $date->Unix == -1 ) {
         $subject =  "Ticket #". $Ticket->id . " with owner " . $User->Name ." is due on " . $date->ISO;
     } else {
         $subject =  "Ticket #". $Ticket->id . " with owner " . $User->Name ." is overdue";
     }
 
    # Get Queue Admin CC
     # Do we send to Admin CC as well as to owner?
     my @emails = ();
     if ( $sendToAdminCC ) {
         @emails = ($User->EmailAddress, split(/,/, $Ticket->AdminCcAddresses), split(/,/ , $Ticket->QueueObj->AdminCcAddresses));
     } else {
         @emails = ($User->EmailAddress);
     }
 
     # remove duplicates
     my %temp = (); @emails = grep ++$temp{$_} < 2, @emails;
     send_report(@emails);
 }
 
 
 # Close RT Handle
 $RT::Handle->Disconnect();
 exit 0;
 
 # This procedure will send a report by mail to the owner
 #  parameter 1 - email addresses to send to
 # Global variables refered to:
 #  $subject - Subject line
 #  @report - Message content
 #  $from_address - address to send from
 sub send_report {
     my @tos = @_;
     my $addr;
 
     foreach $addr (@tos) {
         next if (length($addr) == 0);
         my $msg = "";
         $msg .= "From: $from_address\n";
         $msg .= "To: $addr\n";
         $msg .= "Subject: $subject\n";
         $msg .= "\n";
         $msg .= $report;
 
         if ($debug) {
             print "====== Would call '$sendmail' with this input:\n";
             print "$msg\n\n";
 	} else {
             open(SENDMAIL, "|$sendmail") || die "Error sending mail: $!";
             print SENDMAIL $msg;
             close(SENDMAIL);
 	}
     }
 }
 
 
 

Old version

Version by Tomas Borland Valenta added at 14.3.2007
#!/usr/bin/perl -w
 ####################### RT Email Notification Script ####################
 ####
 #### Author: Daniely Yoav / Qball Technologies Ltd.
 #### Email: yoavd@qballtech.net
 #### Date: 05/06/05
 ####
 #### Modified by: Tomas Borland Valenta
 #### Email: tomas at trustica dot cz
 #### Date: 2007/03/12
 ####
 #### Purpose: Send Email Notification on all open/new tickets in RT that have their due date expired
 ####
 #### Version: 2
 #### Changes from 1.2
 #### - rewriten mail subsystem
 #### - code cleanup
 #### - adopted for RT 3.6.x
 #### - used some global RT config variables
 ####
 ####  Usage: Invoke via cron every working day at 8 morning
 ####  0 8 * * 1-5 /path/to/script/remind_email_due.pl
 
 ### External libraries ###
 use strict;
 use lib ("/usr/share/request-tracker3.6/lib");
 package RT;
 use RT::Interface::CLI qw(CleanEnv GetCurrentUser GetMessageContent loc);
 use RT::Date;
 use RT::Queue;
 use RT::Queues;
 use RT::Tickets;
 
 ################## Init ##################
 # Clean our environment
 CleanEnv();
 # Load the RT configuration
 RT::LoadConfig();
 RT::Init();
 # Set config variables
 my $debug=0;
 my $from_address = $RT::CorrespondAddress; #From: address used in reports
 my $rt_url = $RT::WebURL;
 my $sendmail = "$RT::SendmailPath $RT::SendmailArguments";
 
 ################## Variables Init ##################
 my $User = new RT::User($RT::SystemUser); # Define an RT User variable
 my $date = new RT::Date($RT::SystemUser); # Define a date variable (used for comparisions)
 my $tickets = new RT::Tickets($RT::SystemUser); # Used to store Ticket search results
 my $now = new RT::Date($RT::SystemUser); # get current time
 $now->SetToNow();
 my $report; # Used for output
 my $subject; # Used as subject line
 
 ################## Main Program ##################
 # Limit the ticket search to new and open only.
 $tickets->LimitStatus(VALUE => 'new');
 $tickets->LimitStatus(VALUE => 'open');
 
 # Loop through new/open tickets
 while (my $Ticket = $tickets->Next) {
   # Construct POP-Up Message
   $User->Load($Ticket->Owner);
   # Compare Dates to check whether the ticket's due date is in the past + Due date exists
   $date->Set(Format => "ISO",Value => $Ticket->Due);
   if ($now->Unix - $date->Unix < 0 or $date->Unix == -1) { next; }
   # Generate a report
   $report = "";
   $report .= "Ticket #: " . $Ticket->id . "\n";
   $report .= "Subject:  " . $Ticket->Subject . "\n";
   $report .= "Queue:    " . $Ticket->QueueObj->Name . " (". $Ticket->QueueObj->AdminCcAddresses .") \n";
   $report .= "Owner:    " . $User->Name ."\n";
   $report .= "Due date: " . $date->ISO . "\n";
   $report .= "URL:      " . $rt_url . "Ticket/Display.html?id=" . $Ticket->id . "\n";
   $subject =  "Ticket #". $Ticket->id . " with owner " . $User->Name ." is overdue";
 
   # Get Queue Admin CC
   my @emails = ($User->EmailAddress, split(/,/, $Ticket->AdminCcAddresses), split(/,/ , $Ticket->QueueObj->AdminCcAddresses));
   my %temp = (); @emails = grep ++$temp{$_} < 2, @emails; # remove duplicates
   send_report(@emails);
 }
 # Close RT Handle
 $RT::Handle->Disconnect();
 exit 0;
 
 # This procedure will send a report by mail to the owner
 #  parameter 1 - email addresses to send to
 # Global variables refered to:
 #  $subject - Subject line
 #  @report - Message content
 #  $from_address - address to send from
 sub send_report {
   my @tos = @_;
   my $addr;
 
   foreach $addr (@tos) {
     next if (length($addr) == 0);
     my $msg = "";
     $msg .= "From: $from_address\n";
     $msg .= "To: $addr\n";
     $msg .= "Subject: $subject\n";
     $msg .= "\n";
     $msg .= $report;
 
     if ($debug) {
       print "====== Would call '$sendmail' with this input:\n";
       print "$msg\n\n";
     } else {
       open(SENDMAIL, "|$sendmail") || die "Error sending mail: $!";
       print SENDMAIL $msg;
       close(SENDMAIL);
     }
   }
 }
 
 

Old version

Daniely Yoav, !QBall Technologies Ltd. yoavd![at]qballtech![dot]net

You can cut/paste or download the script from Notifications script. Put the script in your daily crontab (/etc/cron.daily on Fedora Core)

#!/usr/bin/perl -w
 ####################### RT Email Notification Script ####################
 #### Author: Daniely Yoav / Qball Technologies Ltd.
 #### Email: yoavd@qballtech.net
 #### Purpose: Send Email Notification on all open/new tickets in RT that have their due date expired
 #### Version: 1.1
 ####  Usage: Invoke via cron
 ####               */5 * * * * /path/to/script/remind_email_due.pl
 #### Date: 05/06/05
 ############################################################
 my $from_address = 'reports@demo.qballtech.net'; #From: address used in reports
 my $mail_host = 'localhost'; #Mail Server used for sending mail
 my $my_host = 'demo.qballtech.net'; # My FQDN
 my $rt_url = 'https://demo.qballtech.net/rt';
 
 # Days to send notifcations on
 # Enable Debug
 my $debug=0;
 # initalize
 use lib ("/usr/local/rt3/lib", "/usr/local/rt3/local/lib");
 ############################################################
 ################## DO NOT EDIT BELOW THIS LINE ##################
 ################## External dependancies ##################
 use strict;
 use Carp;
 package RT;
 use RT::Interface::CLI qw(CleanEnv GetCurrentUser GetMessageContent loc);
 use RT::Date;
 use RT::Queue;
 use RT::Queues;
 use RT::Tickets;
 use Mail::Internet;
 use Mail::Address;
 use Net::SMTP;
 use Encode;
 use MIME::Base64;
 use MIME::QuotedPrint;
 use MIME::Words qw(:all);
 
 ################## RT Init ##################
 # Clean our environment
 CleanEnv();
 # Load the RT configuration
 RT::LoadConfig();
 RT::Init();
 ################## Variables Init ##################
  my $User = RT::User->new($RT::SystemUser); # Define an RT User variable
  my $date = new RT::Date($RT::SystemUser); # Define a date variable (used for comparisions)
  my $pipe; # Used as PIPE to transfer data to smbclient
  my $tickets = new RT::Tickets($RT::SystemUser); # Used to store Ticket search results
  my $now = new RT::Date($RT::SystemUser); # get current time
  $now->SetToNow();
  my @report; # Used for output
  my $subject; # Used as subject line
 ################## Main Program ##################
 # Limit the ticket search to new and open only.
 $tickets->LimitStatus(VALUE => 'new');
 $tickets->LimitStatus(VALUE => 'open');
 # Loop through new/open tickets
 while (my $Ticket = $tickets->Next) {
      # Construct POP-Up Message
      $User->Load($Ticket->Owner);
      # Compare Dates to check whether the ticket's due date is in the past + Due date exists
      $date->Set(Format => "ISO",Value => $Ticket->Due);
      if ($now->Unix - $date->Unix  > 0 and $date->Unix != -1) {
      # Generate a report
      @report = ();
      push (@report,"Ticket #" . $Ticket->id . " is over his due date. \n");
      push (@report,"Owner: " . $User->Name ."\n");
        push (@report,"Due date:" . $date->ISO . "\n");
      push (@report,"Subject: " . $Ticket->Subject . "\n");
      push (@report,"URL: " . $rt_url . "/Ticket/Display.html?id=" . $Ticket->id . "\n");
      push (@report,"\n\nTickets notifications script by Qball Solutions");
      push (@report,"\nplease report problems to solutions\@helpdesk.qballtech.net)");
      push(@report,"\nContact us! (info\@qballtech.net)\n");
      $subject =  "Ticket #". $Ticket->id . " with Owner: " . $User->Name ." is over his due date\n";
      #print $line .  "\n";
      #print $User->EmailAddress . "\n";
      # Send report by email
      # Get Queue Admin CC
      send_report($User->EmailAddress . "," . $Ticket->AdminCcAddresses . "," .$Ticket->QueueObj->AdminCcAddresses);
      print @report if $debug;
      }
 }
 # Close RT Handle
 $RT::Handle->Disconnect();
 exit 0;
 
 sub send_report {
 ##########################
 # Send report procedure###
 ##########################
 # This procedure will send a report by mail to the owner
 # Parameter 1) Email addresses to send to
 # Global variables refered to:
 # $subject - Subject line
 # @report - Message content
 # $mail_host - mail relay host address
 # $from_address - address to send from
 my $smtp;
 my $addr;
 my $full;
 my $to_address = "$_[0]";
 my @addrs = Mail::Address->parse("$to_address");
 my $mime_type = 'TEXT';
 my $message = @report;
 foreach $addr (@addrs)
 {
   $full=$addr->format;
   $smtp = Net::SMTP->new($mail_host,Debug=> 0);
   die "Couldn't connect to server" unless $smtp;
   $smtp->mail( $from_address );
   $smtp->to($full);
   $smtp->data();
   $smtp->datasend("Subject: $subject");
   $smtp->datasend("To: " . $full . "\n");
   $smtp->datasend("From: " . $from_address . "\n");
   $smtp->datasend("\n");
   $smtp->datasend("@report\n");
 
   $smtp->dataend();
   $smtp->quit();
 };
 }