DueDateRemindersByEmail
Jump to navigation
Jump to search
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 <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
####################### 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";
}
# 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(); }; }