DueDateRemindersByEmail

From Request Tracker Wiki
Revision as of 16:43, 8 January 2017 by Barton (talk | contribs)
Jump to navigation Jump to search

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

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

Notes by Barton: I ran this page through a sed script that fixed the formatting of the nowiki formatted code blocks. You are encouraged to check the history of this page and make sure that I didn't mess anything up.

New version ( 3.1 )

New version ( 3.1 ) by Vaclav Vobornik added at 4.7.2008

i made a cleaned version be subsituting < and > to < and >. this apperently got lost while moving from wikia to here.

also the preformatted text block syntax nowiki used below does not work here yet :(

find it here: http://pastebin.com/gj5R7wm2

   ####################### 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       : Send reminders to tickets due in  or less days.
   ####                      : Includes overdue tickets.
   ####          -q   : Only send reminder for tickets in 
   ####          -o   : Only send reminders for tickets owned by 
   ####          -c   : Email in Cc
   ####          -b   : 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
   ####################### 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       : Send reminders to tickets due in  or less days.
   ####                      : Includes overdue tickets.
   ####          -q   : Only send reminder for tickets in 
   ####          -o   : Only send reminders for tickets owned by 
   ####
   #### ======================================================================
   ####
   ####  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";
       }
       # 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
   ####################### 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)

   ####################### 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();
   };
   }