<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://rt-wiki.bestpractical.com/index.php?action=history&amp;feed=atom&amp;title=ParseFollowupMessageForTicketCcs</id>
	<title>ParseFollowupMessageForTicketCcs - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://rt-wiki.bestpractical.com/index.php?action=history&amp;feed=atom&amp;title=ParseFollowupMessageForTicketCcs"/>
	<link rel="alternate" type="text/html" href="https://rt-wiki.bestpractical.com/index.php?title=ParseFollowupMessageForTicketCcs&amp;action=history"/>
	<updated>2026-08-22T14:11:42Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://rt-wiki.bestpractical.com/index.php?title=ParseFollowupMessageForTicketCcs&amp;diff=2544&amp;oldid=prev</id>
		<title>Admin: 2 revisions imported</title>
		<link rel="alternate" type="text/html" href="https://rt-wiki.bestpractical.com/index.php?title=ParseFollowupMessageForTicketCcs&amp;diff=2544&amp;oldid=prev"/>
		<updated>2016-04-06T20:20:26Z</updated>

		<summary type="html">&lt;p&gt;2 revisions imported&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= ParseFollowupMessageForTicketCcs =&lt;br /&gt;
&lt;br /&gt;
After becoming more proficient in writing RT scrips, I decided to convert the patch below into a scrip so we wouldn&amp;#039;t have to worry about patching after upgrading. It also works with correspondences made via the web instead of only via email like the patch below. See [[AddWatchersOnCorrespond]] for more information on the scrip version.&lt;br /&gt;
&lt;br /&gt;
=== Automatically add ticket [CC]s from followup emails ===&lt;br /&gt;
&lt;br /&gt;
The [[ParseNewMessageForTicketCcs]] option in [[SiteConfig]] will automatically add [[CC]] [[Watcher]]s to a ticket during new ticket creation. We wanted the same behavior for email followups to existing tickets, so I patched the RT/Interface/Email.pm module to do this if the [[ParseFollowupMessageForTicketCcs]] option is also set in your [[SiteConfig]].&lt;br /&gt;
&lt;br /&gt;
Note: Both options use the [[RTAddressRegexp]] variable to avoid problems.&lt;br /&gt;
&lt;br /&gt;
Patch written for and tested with RT version 3.4.5.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== RT/Interface/Email.pm ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;diff -urN /usr/lib/rt/RT/Interface/Email.pm-dist /usr/lib/rt/RT/Interface/Email.pm&lt;br /&gt;
 --- /usr/lib/rt/RT/Interface/Email.pm-dist      2005-11-14 17:35:40.000000000 -0500&lt;br /&gt;
 +++ /usr/lib/rt/RT/Interface/Email.pm   2006-07-21 13:30:02.000000000 -0400&lt;br /&gt;
 @@ -746,6 +746,7 @@&lt;br /&gt;
      my $Ticket = RT::Ticket-&amp;amp;gt;new($CurrentUser);&lt;br /&gt;
 &lt;br /&gt;
      # {{{ If we don&amp;#039;t have a ticket Id, we&amp;#039;re creating a new ticket&lt;br /&gt;
 +    my $new_ticket = 1;&lt;br /&gt;
      if ( (!$SystemTicket || !$SystemTicket-&amp;amp;gt;Id) &amp;amp;amp;&amp;amp;amp;&lt;br /&gt;
             grep /^(comment|correspond)$/, @actions ) {&lt;br /&gt;
 &lt;br /&gt;
 @@ -784,6 +785,8 @@&lt;br /&gt;
         $args{&amp;#039;ticket&amp;#039;} = $id;&lt;br /&gt;
 &lt;br /&gt;
          # }}}&lt;br /&gt;
 +    } else {&lt;br /&gt;
 +      $new_ticket = 0;&lt;br /&gt;
      }&lt;br /&gt;
 &lt;br /&gt;
      $Ticket-&amp;amp;gt;Load( $args{&amp;#039;ticket&amp;#039;} );&lt;br /&gt;
 @@ -799,6 +802,21 @@&lt;br /&gt;
          return ( 0, $message );&lt;br /&gt;
      }&lt;br /&gt;
 &lt;br /&gt;
 +    # JAS - Add Ticket CCs for followups to current tickets also:&lt;br /&gt;
 +    if (not $new_ticket and $RT::ParseFollowupMessageForTicketCcs) {&lt;br /&gt;
 +      my @Cc = ParseCcAddressesFromHead(&lt;br /&gt;
 +                                       Head        =&amp;amp;gt; $head,&lt;br /&gt;
 +                                       CurrentUser =&amp;amp;gt; $CurrentUser,&lt;br /&gt;
 +                                       QueueObj    =&amp;amp;gt; $SystemQueueObj&lt;br /&gt;
 +                                      );&lt;br /&gt;
 +      foreach (@Cc) {&lt;br /&gt;
 +       $Ticket-&amp;amp;gt;AddWatcher(&lt;br /&gt;
 +                           Type =&amp;amp;gt; &amp;#039;Cc&amp;#039;,&lt;br /&gt;
 +                           Email =&amp;amp;gt; $_,&lt;br /&gt;
 +                          );&lt;br /&gt;
 +      }&lt;br /&gt;
 +    }&lt;br /&gt;
 +&lt;br /&gt;
      # }}}&lt;br /&gt;
      foreach my $action( @actions ) {&lt;br /&gt;
          #   If the action is comment, add a comment.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Later we decided to make RT also add senders as Cc watchers, so I created a new version of the patch. This version also verifies that the email address is not already a watcher of the ticket or queue before it is added.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Note:&amp;#039;&amp;#039;&amp;#039; The person being added needs to have permission to see the ticket, which means you will probably have to grant the System group [[Everyone]], [[Watch]] rights (globally or for the necessary [[Queue]]s) for this to work.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Warning:&amp;#039;&amp;#039;&amp;#039; &amp;quot;It&amp;#039;s worth noting that this patch opens up a potentially dangerous hole. A malicious user could easily make themselves CC of ...all your tickets. In some organizations, this may not matter. But it&amp;#039;s a showstopper here.&amp;quot; --JV (from rt-users mailing list). Therefore, be aware and take appropriate precautions if you use this.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;diff -urN /usr/lib/rt/RT/Interface/Email.pm-dist /usr/lib/rt/RT/Interface/Email.pm&lt;br /&gt;
 --- /usr/lib/rt/RT/Interface/Email.pm-dist      2005-11-14 17:35:40.000000000 -0500&lt;br /&gt;
 +++ /usr/lib/rt/RT/Interface/Email.pm   2007-02-07 14:52:44.000000000 -0500&lt;br /&gt;
 @@ -346,13 +346,17 @@&lt;br /&gt;
 &lt;br /&gt;
      my (@Addresses);&lt;br /&gt;
 &lt;br /&gt;
 +    # JAS - Add new From addresses in case the ticket was privately forwarded&lt;br /&gt;
 +    # to a new interested third party who then replies to the ticket.&lt;br /&gt;
 +    my $From = $args{&amp;#039;Head&amp;#039;}-&amp;amp;gt;get(&amp;#039;Reply-To&amp;#039;) || $args{&amp;#039;Head&amp;#039;}-&amp;amp;gt;get(&amp;#039;From&amp;#039;) || $args{&amp;#039;Head&amp;#039;}-&amp;amp;gt;get(&amp;#039;Sender&amp;#039;);&lt;br /&gt;
 +    my @FromObjs = Mail::Address-&amp;amp;gt;parse($From);&lt;br /&gt;
      my @ToObjs = Mail::Address-&amp;amp;gt;parse($args{&amp;#039;Head&amp;#039;}-&amp;amp;gt;get(&amp;#039;To&amp;#039;));&lt;br /&gt;
      my @CcObjs = Mail::Address-&amp;amp;gt;parse($args{&amp;#039;Head&amp;#039;}-&amp;amp;gt;get(&amp;#039;Cc&amp;#039;));&lt;br /&gt;
 &lt;br /&gt;
 -    foreach my $AddrObj (@ToObjs, @CcObjs) {&lt;br /&gt;
 +    foreach my $AddrObj (@FromObjs, @ToObjs, @CcObjs) {&lt;br /&gt;
         my $Address = $AddrObj-&amp;amp;gt;address;&lt;br /&gt;
         $Address = $args{&amp;#039;CurrentUser&amp;#039;}-&amp;amp;gt;UserObj-&amp;amp;gt;CanonicalizeEmailAddress($Address);&lt;br /&gt;
 -       next if ($args{&amp;#039;CurrentUser&amp;#039;}-&amp;amp;gt;EmailAddress =~ /^\Q$Address\E$/i);&lt;br /&gt;
 +       next if ($args{&amp;#039;CurrentUser&amp;#039;}-&amp;amp;gt;EmailAddress and $args{&amp;#039;CurrentUser&amp;#039;}-&amp;amp;gt;EmailAddress =~ /^\Q$Address\E$/i);&lt;br /&gt;
         next if ($args{&amp;#039;QueueObj&amp;#039;}-&amp;amp;gt;CorrespondAddress =~ /^\Q$Address\E$/i);&lt;br /&gt;
         next if ($args{&amp;#039;QueueObj&amp;#039;}-&amp;amp;gt;CommentAddress =~ /^\Q$Address\E$/i);&lt;br /&gt;
         next if (RT::EmailParser-&amp;amp;gt;IsRTAddress($Address));&lt;br /&gt;
 @@ -746,6 +750,7 @@&lt;br /&gt;
      my $Ticket = RT::Ticket-&amp;amp;gt;new($CurrentUser);&lt;br /&gt;
 &lt;br /&gt;
      # {{{ If we don&amp;#039;t have a ticket Id, we&amp;#039;re creating a new ticket&lt;br /&gt;
 +    my $new_ticket = 1;&lt;br /&gt;
      if ( (!$SystemTicket || !$SystemTicket-&amp;amp;gt;Id) &amp;amp;amp;&amp;amp;amp;&lt;br /&gt;
             grep /^(comment|correspond)$/, @actions ) {&lt;br /&gt;
 &lt;br /&gt;
 @@ -784,6 +789,8 @@&lt;br /&gt;
         $args{&amp;#039;ticket&amp;#039;} = $id;&lt;br /&gt;
 &lt;br /&gt;
          # }}}&lt;br /&gt;
 +    } else {&lt;br /&gt;
 +      $new_ticket = 0;&lt;br /&gt;
      }&lt;br /&gt;
 &lt;br /&gt;
      $Ticket-&amp;amp;gt;Load( $args{&amp;#039;ticket&amp;#039;} );&lt;br /&gt;
 @@ -799,6 +806,41 @@&lt;br /&gt;
          return ( 0, $message );&lt;br /&gt;
      }&lt;br /&gt;
 &lt;br /&gt;
 +    # JAS - Add Ticket CCs for followups to current tickets also:&lt;br /&gt;
 +    #     - Allow the CurrentUser to be added if they are not already on this ticket list.&lt;br /&gt;
 +    if (not $new_ticket and $RT::ParseFollowupMessageForTicketCcs) {&lt;br /&gt;
 +      my @Cc = ParseCcAddressesFromHead(Head        =&amp;amp;gt; $head,&lt;br /&gt;
 +                                       CurrentUser =&amp;amp;gt; $RT::SystemUser,  # Don&amp;#039;t ignore the CurrentUser.&lt;br /&gt;
 +                                       QueueObj    =&amp;amp;gt; $SystemQueueObj,&lt;br /&gt;
 +                                      );&lt;br /&gt;
 +      foreach (@Cc) {&lt;br /&gt;
 +       my $user = RT::User-&amp;amp;gt;new($RT::SystemUser);&lt;br /&gt;
 +       $user-&amp;amp;gt;LoadByEmail($_);&lt;br /&gt;
 +       my $principal;&lt;br /&gt;
 +       $principal = $user-&amp;amp;gt;PrincipalId if $user-&amp;amp;gt;Id;&lt;br /&gt;
 +       # Only add people to this ticket if they are not already a watcher of the ticket or queue:&lt;br /&gt;
 +       if (not ($Ticket-&amp;amp;gt;IsWatcher(Type =&amp;amp;gt; &amp;#039;Requestor&amp;#039;, Email =&amp;amp;gt; $_)&lt;br /&gt;
 +                or $Ticket-&amp;amp;gt;IsWatcher(Type =&amp;amp;gt; &amp;#039;Cc&amp;#039;, Email =&amp;amp;gt; $_)&lt;br /&gt;
 +                or $Ticket-&amp;amp;gt;IsWatcher(Type =&amp;amp;gt; &amp;#039;AdminCc&amp;#039;, Email =&amp;amp;gt; $_)&lt;br /&gt;
 +                or $Ticket-&amp;amp;gt;QueueObj-&amp;amp;gt;IsWatcher(Type =&amp;amp;gt; &amp;#039;Cc&amp;#039;, PrincipalId =&amp;amp;gt; $principal)&lt;br /&gt;
 +                or $Ticket-&amp;amp;gt;QueueObj-&amp;amp;gt;IsWatcher(Type =&amp;amp;gt; &amp;#039;AdminCc&amp;#039;, PrincipalId =&amp;amp;gt; $principal))) {&lt;br /&gt;
 +         # NOTE: Passing both the Email address &amp;amp;amp; PrincipalId for that address to the RT::Ticket:AddWatcher&lt;br /&gt;
 +         #       function will allow it to pass the ACL checks with only Watch rights, otherwise ModifyTicket&lt;br /&gt;
 +         #       rights will be needed since it assumes that someone is trying to add another person.&lt;br /&gt;
 +         #       See: RT/Ticket_Overlay.pm:AddWatcher for more info.&lt;br /&gt;
 +         my ($ret, $msg) = $Ticket-&amp;amp;gt;AddWatcher(Type  =&amp;amp;gt; &amp;#039;Cc&amp;#039;,&lt;br /&gt;
 +                                               Email =&amp;amp;gt; $_,&lt;br /&gt;
 +                                               PrincipalId =&amp;amp;gt; $principal,&lt;br /&gt;
 +                                              );&lt;br /&gt;
 +         if ($ret) {&lt;br /&gt;
 +           $RT::Logger-&amp;amp;gt;info(&amp;quot;New Cc watcher added to ticket #&amp;quot;. $Ticket-&amp;amp;gt;Id .&amp;quot;: &amp;quot;. $_);&lt;br /&gt;
 +         } else {&lt;br /&gt;
 +           $RT::Logger-&amp;amp;gt;error(&amp;quot;Failed to add new Cc watcher to ticket #&amp;quot;. $Ticket-&amp;amp;gt;Id .&amp;quot;: &amp;quot;. $_ .&amp;quot; - &amp;quot;. $msg);&lt;br /&gt;
 +         }&lt;br /&gt;
 +       }&lt;br /&gt;
 +      }&lt;br /&gt;
 +    }&lt;br /&gt;
 +&lt;br /&gt;
      # }}}&lt;br /&gt;
      foreach my $action( @actions ) {&lt;br /&gt;
          #   If the action is comment, add a comment.&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>