DueDateRemindersByEmail

From Request Tracker Wiki
Revision as of 04:21, 25 February 2009 by Lr1980 (talk)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

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<em>60</em>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); <code><pre> # Compare Dates to check whether the ticket's due date is in the past + Due date exists $date-&gt;Set(Format =&gt; "ISO",Value =&gt; $Ticket-&gt;Due); if ($now-&gt;Unix - $date-&gt;Unix &lt; (1 - $advDate ) or $date-&gt;Unix == -1 or $date-&gt;Unix == 0) { next; } # Compare owner and queue if given. Skip current ticket if invalid. if ($owner) { if ( lc($User-&gt;Name) ne lc($owner) ) { next; } } if ($queue) { if ( lc($Ticket-&gt;QueueObj-&gt;Name) ne lc($queue) ) { next; } } # Generate a report $report = ""; $report .= "Ticket #: " . $Ticket-&gt;id . "\n"; $report .= "Subject: " . $Ticket-&gt;Subject . "\n"; $report .= "Queue: " . $Ticket-&gt;QueueObj-&gt;Name . " (". $Ticket-&gt;QueueObj-&gt;AdminCcAddresses .") \n"; $report .= "Owner: " . $User-&gt;Name ."\n"; $report .= "Due date: " . $date-&gt;ISO . "\n"; $report .= "URL: " . $rt_url . "Ticket/Display.html?id=" . $Ticket-&gt;id . "\n"; # Set the subject based on the due date. if( ($now-&gt;Unix - $date-&gt;Unix &lt; 0 ) or $date-&gt;Unix == -1 ) { $subject = "Ticket #". $Ticket-&gt;id . " with owner " . $User-&gt;Name ." is due on " . $date-&gt;ISO; } else { $subject = "Ticket #". $Ticket-&gt;id . " with owner " . $User-&gt;Name ." is overdue"; } # Get Queue Admin CC # Do we send to Admin CC as well as to owner? my @emails = (); if ( $sendToAdminCC ) { @emails = ($User-&gt;EmailAddress, split(/,/, $Ticket-&gt;AdminCcAddresses), split(/,/ , $Ticket-&gt;QueueObj-&gt;AdminCcAddresses)); } else { @emails = ($User-&gt;EmailAddress); } # remove duplicates my %temp = (); @emails = grep ++$temp{$_} &lt; 2, @emails; send_report(@emails); </pre></code> } # 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; <code><pre> 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); } } </pre></code> }

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<em>60</em>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); <code><pre> # Compare Dates to check whether the ticket's due date is in the past + Due date exists $date-&gt;Set(Format =&gt; "ISO",Value =&gt; $Ticket-&gt;Due); if ($now-&gt;Unix - $date-&gt;Unix &lt; (1 - $advDate ) or $date-&gt;Unix == -1) { next; } # Compare owner and queue if given. Skip current ticket if invalid. if ($owner) { if ( lc($User-&gt;Name) ne lc($owner) ) { next; } } if ($queue) { if ( lc($Ticket-&gt;QueueObj-&gt;Name) ne lc($queue) ) { next; } } # Generate a report $report = ""; $report .= "Ticket #: " . $Ticket-&gt;id . "\n"; $report .= "Subject: " . $Ticket-&gt;Subject . "\n"; $report .= "Queue: " . $Ticket-&gt;QueueObj-&gt;Name . " (". $Ticket-&gt;QueueObj-&gt;AdminCcAddresses .") \n"; $report .= "Owner: " . $User-&gt;Name ."\n"; $report .= "Due date: " . $date-&gt;ISO . "\n"; $report .= "URL: " . $rt_url . "Ticket/Display.html?id=" . $Ticket-&gt;id . "\n"; # Set the subject based on the due date. if( ($now-&gt;Unix - $date-&gt;Unix &lt; 0 ) or $date-&gt;Unix == -1 ) { $subject = "Ticket #". $Ticket-&gt;id . " with owner " . $User-&gt;Name ." is due on " . $date-&gt;ISO; } else { $subject = "Ticket #". $Ticket-&gt;id . " with owner " . $User-&gt;Name ." is overdue"; } </pre></code>

# 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); } <code><pre> # remove duplicates my %temp = (); @emails = grep ++$temp{$_} &lt; 2, @emails; send_report(@emails); </pre></code> } # 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; <code><pre> 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); } } </pre></code> }

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; <code><pre> 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); } </pre></code> } }

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