[rt-devel] [PATCH] Look in the message body for ticket ids
Andrew J. Korty
ajk at iu.edu
Mon Feb 2 10:01:22 EST 2004
This patch makes RT's e-mail interface look for ticket ids in the body
of a message if it didn't find one in the subject. It only looks in
the first MIME part and only if it's of type text/plain. The
configuration variable $RT::CheckBodyLinesForTicketId enables this
code and also limits the number of lines to look at before giving up.
We set it to 50.
The patch is against 3.0.7_01 but should apply cleanly against 3.0.9
pre 2. Use -p0 when applying. Does anyone see any problems with this
code or have any ideas how it can be improved?
--- etc/RT_Config.pm~ 2004-01-26 15:04:39.000000000 -0500
+++ etc/RT_Config.pm 2004-01-26 16:11:27.000000000 -0500
@@ -159,6 +159,13 @@
# RT is designed such that any mail which already has a ticket-id associated
# with it will get to the right place automatically.
+# If $CheckBodyLinesForTicketId is nonzero, RT will look that many lines
+# into the message body for a ticket id. If it finds one, the message
+# will be appended to the indicated ticket. This only works for text/plain
+# messages.
+
+Set($CheckBodyLinesForTicketId , undef);
+
# $CorrespondAddress and $CommentAddress are the default addresses
# that will be listed in From: and Reply-To: headers of correspondence
# and comment mail tracked by RT, unless overridden by a queue-specific
--- lib/RT/Interface/Email.pm~ 2004-01-28 07:39:14.000000000 -0500
+++ lib/RT/Interface/Email.pm 2004-01-27 15:23:54.000000000 -0500
@@ -479,7 +479,47 @@
my $Subject = $head->get('Subject') || '';
chomp $Subject;
- $args{'ticket'} ||= $parser->ParseTicketId($Subject);
+ $RT::Logger->debug('reached new e-mail parsing code');
+ unless ($args{'ticket'}) {
+
+ # Try the subject first
+ my $id = $parser->ParseTicketId($Subject);
+
+ # Else look in the body if text/plain and
+ # $RT::CheckBodyLinesForTicketId is nonzero (zero by default)
+ my $lines = $RT::CheckBodyLinesForTicketId;
+ if ($lines && !defined $id) {
+
+ # Find the first part
+ my $first_part = $Message;
+ while (1) {
+ if (my @parts = $first_part->parts) {
+ $RT::Logger->debug('exploding multipart');
+ $first_part = $parts[0];
+ next;
+ }
+ last;
+ }
+
+ # If it's text/plain, look for the ticket id
+ my $type = $first_part->effective_type;
+ $RT::Logger->debug("type of first part: $type");
+ if ($type eq 'text/plain'
+ && (my $io = $first_part->open('r'))) {
+
+ # search the unencoded body line by line
+ while ($lines-- && (my $line = $io->getline)) {
+ chomp $line;
+ $id = $parser->ParseTicketId($line);
+ last if $id;
+ }
+
+ $io->close;
+ }
+ }
+
+ $args{'ticket'} = $id;
+ }
my $SystemTicket;
if ( $args{'ticket'} ) {
--
Andrew J. Korty, Principal Security Engineer, GCIA, GCFA
Office of the Vice President for Information Technology
Indiana University
More information about the Rt-devel
mailing list