[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