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