This commit was generated by cvs2svn to compensate for changes in r2526,
[freeside.git] / rt / lib / RT / Action / SendEmail.pm
index dac8fc8..e3abb11 100755 (executable)
@@ -1,44 +1,20 @@
-# BEGIN LICENSE BLOCK
-# 
-# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
-# 
-# (Except where explictly superceded by other copyright notices)
-# 
-# This work is made available to you under the terms of Version 2 of
-# the GNU General Public License. A copy of that license should have
-# been provided with this software, but in any event can be snarfed
-# from www.gnu.org.
-# 
-# This work is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-# 
-# Unless otherwise specified, all modifications, corrections or
-# extensions to this work which alter its source code become the
-# property of Best Practical Solutions, LLC when submitted for
-# inclusion in the work.
-# 
-# 
-# END LICENSE BLOCK
+# $Header: /home/cvs/cvsroot/freeside/rt/lib/RT/Action/SendEmail.pm,v 1.1 2002-08-12 06:17:07 ivan Exp $
+# Copyright 1996-2002  Jesse Vincent <jesse@bestpractical.com> 
 # Portions Copyright 2000 Tobias Brox <tobix@cpan.org>
+# Released under the terms of version 2 of the GNU Public License
 
 package RT::Action::SendEmail;
 require RT::Action::Generic;
 
-use strict;
-use vars qw/@ISA/;
 @ISA = qw(RT::Action::Generic);
 
-use MIME::Words qw(encode_mimeword);
-
-use RT::EmailParser;
 
 =head1 NAME
 
-RT::Action::SendEmail - An Action which users can use to send mail 
-or can subclassed for more specialized mail sending behavior. 
-RT::Action::AutoReply is a good example subclass.
+  RT::Action::SendEmail - An Action which users can use to send mail 
+  or can subclassed for more specialized mail sending behavior. 
+  RT::Action::AutoReply is a good example subclass.
+
 
 =head1 SYNOPSIS
 
@@ -60,6 +36,7 @@ the comments for the SetRecipients sub).
 
 =begin testing
 
+ok (require RT::TestHarness);
 ok (require RT::Action::SendEmail);
 
 =end testing
@@ -77,266 +54,158 @@ perl(1).
 
 # {{{ Scrip methods (_Init, Commit, Prepare, IsApplicable)
 
-# {{{ sub _Init
+# {{{ sub _Init 
 # We use _Init from RT::Action
 # }}}
 
-# {{{ sub Commit
+# {{{ sub Commit 
 #Do what we need to do and send it out.
-sub Commit {
+sub Commit  {
     my $self = shift;
-
-    my $MIMEObj = $self->TemplateObj->MIMEObj;
-    my $msgid = $MIMEObj->head->get('Message-Id');
-    chomp $msgid;
-    $RT::Logger->info($msgid." #".$self->TicketObj->id."/".$self->TransactionObj->id." - Scrip ". $self->ScripObj->id ." ".$self->ScripObj->Description);
     #send the email
-
-        # Weed out any RT addresses. We really don't want to talk to ourselves!
-        @{$self->{'To'}} = RT::EmailParser::CullRTAddresses("", @{$self->{'To'}});
-        @{$self->{'Cc'}} = RT::EmailParser::CullRTAddresses("", @{$self->{'Cc'}});
-        @{$self->{'Bcc'}} = RT::EmailParser::CullRTAddresses("", @{$self->{'Bcc'}});
+    
     # If there are no recipients, don't try to send the message.
     # If the transaction has content and has the header RT-Squelch-Replies-To
-
-    if ( defined $self->TransactionObj->Attachments->First() ) {
-
-        my $squelch = $self->TransactionObj->Attachments->First->GetHeader( 'RT-Squelch-Replies-To');
-
-        if ($squelch) {
-            my @blacklist = split ( /,/, $squelch );
-
-            # Cycle through the people we're sending to and pull out anyone on the
-            # system blacklist
-
-            foreach my $person_to_yank (@blacklist) {
-                $person_to_yank =~ s/\s//g;
-                @{ $self->{'To'} } =
-                  grep ( !/^$person_to_yank$/, @{ $self->{'To'} } );
-                @{ $self->{'Cc'} } =
-                  grep ( !/^$person_to_yank$/, @{ $self->{'Cc'} } );
-                @{ $self->{'Bcc'} } =
-                  grep ( !/^$person_to_yank$/, @{ $self->{'Bcc'} } );
-            }
-        }
+    
+    if (defined $self->TransactionObj->Message->First()) { 
+       my $headers = $self->TransactionObj->Message->First->Headers();
+       
+       if ($headers =~ /^RT-Squelch-Replies-To: (.*?)$/si) {
+           my @blacklist = split(/,/,$1);
+           
+           # Cycle through the people we're sending to and pull out anyone on the
+           # system blacklist
+           
+           foreach my $person_to_yank (@blacklist) {
+               $person_to_yank =~ s/\s//g;
+               @{$self->{'To'}} = grep (!/^$person_to_yank$/, @{$self->{'To'}});
+               @{$self->{'Cc'}} = grep (!/^$person_to_yank$/, @{$self->{'Cc'}});
+               @{$self->{'Bcc'}} = grep (!/^$person_to_yank$/, @{$self->{'Bcc'}});
+           }
+       }
     }
-
-    # Go add all the Tos, Ccs and Bccs that we need to to the message to
+    
+    # Go add all the Tos, Ccs and Bccs that we need to to the message to 
     # make it happy, but only if we actually have values in those arrays.
+    
+    $self->SetHeader('To', join(',', @{$self->{'To'}})) 
+      if (@{$self->{'To'}});
+    $self->SetHeader('Cc', join(',' , @{$self->{'Cc'}})) 
+      if (@{$self->{'Cc'}});
+       $self->SetHeader('Bcc', join(',', @{$self->{'Bcc'}})) 
+         if (@{$self->{'Bcc'}});;
+    
+    my $MIMEObj = $self->TemplateObj->MIMEObj;
+    
 
-    $self->SetHeader( 'To', join ( ',', @{ $self->{'To'} } ) )
-      if ( $self->{'To'} && @{ $self->{'To'} } );
-    $self->SetHeader( 'Cc', join ( ',', @{ $self->{'Cc'} } ) )
-      if ( $self->{'Cc'} && @{ $self->{'Cc'} } );
-    $self->SetHeader( 'Bcc', join ( ',', @{ $self->{'Bcc'} } ) )
-      if ( $self->{'Cc'} && @{ $self->{'Bcc'} } );
-
-
-    $self->SetHeader('MIME-Version', '1.0');
-
-    # try to convert message body from utf-8 to $RT::EmailOutputEncoding
-    $self->SetHeader( 'Content-Type', 'text/plain; charset="utf-8"' );
-
-    RT::I18N::SetMIMEEntityToEncoding( $MIMEObj, $RT::EmailOutputEncoding, 'mime_words_ok' );
-    $self->SetHeader( 'Content-Type', 'text/plain; charset="' . $RT::EmailOutputEncoding . '"' );
-
-
-    # Build up a MIME::Entity that looks like the original message.
-
-    my $do_attach = $self->TemplateObj->MIMEObj->head->get('RT-Attach-Message');
-
-    if ($do_attach) {
-        $self->TemplateObj->MIMEObj->head->delete('RT-Attach-Message');
-
-        my $attachments = RT::Attachments->new($RT::SystemUser);
-        $attachments->Limit( FIELD => 'TransactionId',
-                             VALUE => $self->TransactionObj->Id );
-        $attachments->OrderBy('id');
-
-        my $transaction_content_obj = $self->TransactionObj->ContentObj;
-
-        # attach any of this transaction's attachments
-        while ( my $attach = $attachments->Next ) {
-
-            # Don't attach anything blank
-            next unless ( $attach->ContentLength );
-
-            # We want to make sure that we don't include the attachment that's being sued as the "Content" of this message"
-            next
-              if (    $transaction_content_obj
-                   && $transaction_content_obj->Id == $attach->Id 
-                   && $transaction_content_obj->ContentType =~ qr{text/plain}i
-                );
-            $MIMEObj->make_multipart('mixed');
-            $MIMEObj->attach( Type => $attach->ContentType,
-                              Charset => $attach->OriginalEncoding,
-                              Data => $attach->OriginalContent,
-                              Filename => $self->MIMEEncodeString( $attach->Filename, $RT::EmailOutputEncoding ),
-                              Encoding    => '-SUGGEST');
-        }
-
-    }
-
-
-    my $retval = $self->SendMessage($MIMEObj);
-
-
-    return ($retval);
-}
-
-# }}}
-
-# {{{ sub Prepare
-
-sub Prepare {
-    my $self = shift;
-
-    # This actually populates the MIME::Entity fields in the Template Object
-
-    unless ( $self->TemplateObj ) {
-        $RT::Logger->warning("No template object handed to $self\n");
-    }
-
-    unless ( $self->TransactionObj ) {
-        $RT::Logger->warning("No transaction object handed to $self\n");
-
-    }
-
-    unless ( $self->TicketObj ) {
-        $RT::Logger->warning("No ticket object handed to $self\n");
-
-    }
-
-    my ( $result, $message ) = $self->TemplateObj->Parse(
-                                         Argument       => $self->Argument,
-                                         TicketObj      => $self->TicketObj,
-                                         TransactionObj => $self->TransactionObj
-    );
-    if ($result) {
-
-        # Header
-        $self->SetSubject();
-        $self->SetSubjectToken();
-        $self->SetRecipients();
-        $self->SetReturnAddress();
-        $self->SetRTSpecialHeaders();
-        if ($RT::EmailOutputEncoding) {
-
-            # l10n related header
-            $self->SetHeaderAsEncoding( 'Subject', $RT::EmailOutputEncoding );
-        }
-    }
-
-    return $result;
-
-}
-
-# }}}
-
-# }}}
-
-# {{{ SendMessage
-=head2 SendMessage MIMEObj
-
-sends the message using RT's preferred API.
-TODO: Break this out to a seperate module
-
-=cut
-
-sub SendMessage {
-    my $self = shift;
-    my $MIMEObj = shift;
-
-    my $msgid = $MIMEObj->head->get('Message-Id');
-
-
+    $MIMEObj->make_singlepart;
+    
+    
     #If we don't have any recipients to send to, don't send a message;
-    unless (    $MIMEObj->head->get('To')
-             || $MIMEObj->head->get('Cc')
-             || $MIMEObj->head->get('Bcc') ) {
-        $RT::Logger->info($msgid.  " No recipients found. Not sending.\n");
-        return (1);
+    unless ($MIMEObj->head->get('To') ||
+           $MIMEObj->head->get('Cc') || 
+           $MIMEObj->head->get('Bcc') ) {
+       $RT::Logger->debug("$self: No recipients found. Not sending.\n");
+       return(1);
     }
 
     # PseudoTo (fake to headers) shouldn't get matched for message recipients.
     # If we don't have any 'To' header, drop in the pseudo-to header.
 
-    $self->SetHeader( 'To', join ( ',', @{ $self->{'PseudoTo'} } ) )
-      if ( $self->{'PseudoTo'} && ( @{ $self->{'PseudoTo'} } )
-           and ( !$MIMEObj->head->get('To') ) );
-    if ( $RT::MailCommand eq 'sendmailpipe' ) {
-        eval {
-            open( MAIL, "|$RT::SendmailPath $RT::SendmailArguments" );
-            print MAIL $MIMEObj->as_string;
-            close(MAIL);
-          };
-          if ($@) {
-            $RT::Logger->crit($msgid.  "Could not send mail. -".$@ );
-        }
+    $self->SetHeader('To', join(',', @{$self->{'PseudoTo'}}))
+      if ( (@{$self->{'PseudoTo'}}) and (! $MIMEObj->head->get('To')));
+    
+    if ($RT::MailCommand eq 'sendmailpipe') {
+       open (MAIL, "|$RT::SendmailPath $RT::SendmailArguments") || return(0);
+       print MAIL $MIMEObj->as_string;
+       close(MAIL);
     }
     else {
-       my @mailer_args = ($RT::MailCommand);
-       local $ENV{MAILADDRESS};
-
-        if ( $RT::MailCommand eq 'sendmail' ) {
-           push @mailer_args, $RT::SendmailArguments;
-        }
-        elsif ( $RT::MailCommand eq 'smtp' ) {
-           $ENV{MAILADDRESS} = $RT::SMTPFrom || $MIMEObj->head->get('From');
-           push @mailer_args, (Server => $RT::SMTPServer);
-           push @mailer_args, (Debug => $RT::SMTPDebug);
-        }
-       else {
-           push @mailer_args, $RT::MailParams;
+       unless ($MIMEObj->send($RT::MailCommand, $RT::MailParams)) {
+           $RT::Logger->crit("$self: Could not send mail for ".
+                             $self->TransactionObj . "\n");
+           return(0);
        }
-
-        unless ( $MIMEObj->send( @mailer_args ) ) {
-            $RT::Logger->crit($msgid.  "Could not send mail." );
-            return (0);
-        }
     }
+    
+    return (1);
+    
+}
+# }}}
 
+# {{{ sub Prepare 
 
-     my $success = ($msgid. " sent To: ".$MIMEObj->head->get('To') . " Cc: ".$MIMEObj->head->get('Cc') . " Bcc: ".$MIMEObj->head->get('Bcc'));
-    $success =~ s/\n//gi;
-    $RT::Logger->info($success);
+sub Prepare  {
+  my $self = shift;
+  
+  # This actually populates the MIME::Entity fields in the Template Object
+  
+  unless ($self->TemplateObj) {
+    $RT::Logger->warning("No template object handed to $self\n");
+  }
+  
+  unless ($self->TransactionObj) {
+    $RT::Logger->warning("No transaction object handed to $self\n");
+    
+  }
+  
+  unless ($self->TicketObj) {
+    $RT::Logger->warning("No ticket object handed to $self\n");
+      
+  }
+  
+  
+  $self->TemplateObj->Parse(Argument => $self->Argument,
+                           TicketObj => $self->TicketObj, 
+                           TransactionObj => $self->TransactionObj);
+  
+  # Header
+  
+  $self->SetSubject();
+  
+  $self->SetSubjectToken();
+  
+  $self->SetRecipients();  
+  
+  $self->SetReturnAddress();
 
-    return (1);
+  $self->SetRTSpecialHeaders();
+  
+  return 1;
+  
 }
 
 # }}}
 
+# }}}
+
 # {{{ Deal with message headers (Set* subs, designed for  easy overriding)
 
 # {{{ sub SetRTSpecialHeaders
 
-=head2 SetRTSpecialHeaders 
-
-This routine adds all the random headers that RT wants in a mail message
-that don't matter much to anybody else.
-
-=cut
+# This routine adds all the random headers that RT wants in a mail message
+# that don't matter much to anybody else.
 
 sub SetRTSpecialHeaders {
     my $self = shift;
-
+    
     $self->SetReferences();
 
     $self->SetMessageID();
-
+    
     $self->SetPrecedence();
 
-    $self->SetHeader( 'X-RT-Loop-Prevention', $RT::rtname );
-    $self->SetHeader( 'RT-Ticket',
-                      $RT::rtname . " #" . $self->TicketObj->id() );
-    $self->SetHeader( 'Managed-by',
-                      "RT $RT::VERSION (http://www.bestpractical.com/rt/)" );
+    $self->SetHeader('X-RT-Loop-Prevention', $RT::rtname); 
+    $self->SetHeader('RT-Ticket', $RT::rtname. " #".$self->TicketObj->id());
+    $self->SetHeader
+      ('Managed-by',"RT $RT::VERSION (http://bestpractical.com/rt/)");
+    
+    $self->SetHeader('RT-Originator', $self->TransactionObj->CreatorObj->EmailAddress);
+    return();
+    
+}
 
-    $self->SetHeader( 'RT-Originator',
-                      $self->TransactionObj->CreatorObj->EmailAddress );
-    return ();
 
-}
 
 # {{{ sub SetReferences
 
@@ -349,126 +218,105 @@ sub SetRTSpecialHeaders {
 =cut
 
 sub SetReferences {
-    my $self = shift;
+  my $self = shift;
+  
+  # TODO: this one is broken.  What is this email really a reply to?
+  # If it's a reply to an incoming message, we'll need to use the
+  # actual message-id from the appropriate Attachment object.  For
+  # incoming mails, we would like to preserve the In-Reply-To and/or
+  # References.
 
-    # TODO: this one is broken.  What is this email really a reply to?
-    # If it's a reply to an incoming message, we'll need to use the
-    # actual message-id from the appropriate Attachment object.  For
-    # incoming mails, we would like to preserve the In-Reply-To and/or
-    # References.
+  $self->SetHeader
+    ('In-Reply-To', "<rt-".$self->TicketObj->id().
+     "\@".$RT::rtname.">");
 
-    $self->SetHeader( 'In-Reply-To',
-                   "<rt-" . $self->TicketObj->id() . "\@" . $RT::rtname . ">" );
 
-    # TODO We should always add References headers for all message-ids
-    # of previous messages related to this ticket.
+  # TODO We should always add References headers for all message-ids
+  # of previous messages related to this ticket.
 }
 
 # }}}
 
 # {{{ sub SetMessageID
 
-=head2 SetMessageID 
-
-Without this one, threading won't work very nice in email agents.
-Anyway, I'm not really sure it's that healthy if we need to send
-several separate/different emails about the same transaction.
-
-=cut
+# Without this one, threading won't work very nice in email agents.
+# Anyway, I'm not really sure it's that healthy if we need to send
+# several separate/different emails about the same transaction.
 
 sub SetMessageID {
-    my $self = shift;
+  my $self = shift;
 
-    # TODO this one might be sort of broken.  If we have several scrips +++
-    # sending several emails to several different persons, we need to
-    # pull out different message-ids.  I'd suggest message ids like
-    # "rt-ticket#-transaction#-scrip#-receipient#"
-
-    $self->SetHeader( 'Message-ID',
-                      "<rt-"
-                        . $RT::VERSION ."-"
-                        . $self->TicketObj->id() . "-"
-                        . $self->TransactionObj->id() . "."
-                        . rand(20) . "\@"
-                        . $RT::Organization . ">" )
+  # TODO this one might be sort of broken.  If we have several scrips +++
+  # sending several emails to several different persons, we need to
+  # pull out different message-ids.  I'd suggest message ids like
+  # "rt-ticket#-transaction#-scrip#-receipient#"
+
+  $self->SetHeader
+    ('Message-ID', "<rt-".$self->TicketObj->id().
+     "-".
+     $self->TransactionObj->id()."." .rand(20) . "\@".$RT::Organization.">")
       unless $self->TemplateObj->MIMEObj->head->get('Message-ID');
 }
 
-# }}}
 
 # }}}
 
-# {{{ sub SetReturnAddress
-
-=head2 SetReturnAddress is_comment => BOOLEAN
-
-Calculate and set From and Reply-To headers based on the is_comment flag.
+# }}}
 
-=cut
+# {{{ sub SetReturnAddress 
 
 sub SetReturnAddress {
 
-    my $self = shift;
-    my %args = ( is_comment => 0,
-                 @_ );
-
-    # From and Reply-To
-    # $args{is_comment} should be set if the comment address is to be used.
-    my $replyto;
-
-    if ( $args{'is_comment'} ) {
-        $replyto = $self->TicketObj->QueueObj->CommentAddress
-          || $RT::CommentAddress;
-    }
-    else {
-        $replyto = $self->TicketObj->QueueObj->CorrespondAddress
-          || $RT::CorrespondAddress;
-    }
-
-    unless ( $self->TemplateObj->MIMEObj->head->get('From') ) {
-       if ($RT::UseFriendlyFromLine) {
-           my $friendly_name = $self->TransactionObj->CreatorObj->RealName;
-           if ( $friendly_name =~ /^"(.*)"$/ ) {    # a quoted string
-               $friendly_name = $1;
-           }
-
-           $friendly_name =~ s/"/\\"/g;
-           $self->SetHeader( 'From',
-                       sprintf($RT::FriendlyFromLineFormat, 
-                $self->MIMEEncodeString( $friendly_name, $RT::EmailOutputEncoding ), $replyto),
-           );
-       }
-       else {
-           $self->SetHeader( 'From', $replyto );
-       }
-    }
-
-    unless ( $self->TemplateObj->MIMEObj->head->get('Reply-To') ) {
-        $self->SetHeader( 'Reply-To', "$replyto" );
-    }
-
+  my $self = shift;
+  my %args = ( is_comment => 0,
+              @_ );
+
+  # From and Reply-To
+  # $args{is_comment} should be set if the comment address is to be used.
+  my $replyto;
+
+  if ($args{'is_comment'}) { 
+      $replyto = $self->TicketObj->QueueObj->CommentAddress || 
+                 $RT::CommentAddress;
+  }
+  else {
+      $replyto = $self->TicketObj->QueueObj->CorrespondAddress ||
+                 $RT::CorrespondAddress;
+  }
+    
+  unless ($self->TemplateObj->MIMEObj->head->get('From')) {
+      my $friendly_name=$self->TransactionObj->CreatorObj->RealName;
+
+      if ($friendly_name =~ /^\S+\@\S+$/) { # A "bare" mail address
+          $friendly_name =~ s/"/\\"/g;
+          $friendly_name = qq|"$friendly_name"|;
+      }
+
+
+      # TODO: this "via RT" should really be site-configurable.
+      $self->SetHeader('From', "\"$friendly_name via RT\" <$replyto>");
+  }
+  
+  unless ($self->TemplateObj->MIMEObj->head->get('Reply-To')) {
+      $self->SetHeader('Reply-To', "$replyto");
+  }
+  
 }
 
 # }}}
 
 # {{{ sub SetHeader
 
-=head2 SetHeader FIELD, VALUE
-
-Set the FIELD of the current MIME object into VALUE.
-
-=cut
-
 sub SetHeader {
-    my $self  = shift;
-    my $field = shift;
-    my $val   = shift;
-
-    chomp $val;
-    chomp $field;
-    $self->TemplateObj->MIMEObj->head->fold_length( $field, 10000 );
-    $self->TemplateObj->MIMEObj->head->replace( $field,     $val );
-    return $self->TemplateObj->MIMEObj->head->get($field);
+  my $self = shift;
+  my $field = shift;
+  my $val = shift;
+
+  chomp $val;                                                                  
+  chomp $field;                                                                
+  $self->TemplateObj->MIMEObj->head->fold_length($field,10000);     
+  $self->TemplateObj->MIMEObj->head->add($field, $val);
+  return $self->TemplateObj->MIMEObj->head->get($field);
 }
 
 # }}}
@@ -483,29 +331,21 @@ Dummy method to be overriden by subclasses which want to set the recipients.
 
 sub SetRecipients {
     my $self = shift;
-    return ();
+    return();
 }
 
 # }}}
 
 # {{{ sub SetTo
 
-=head2 SetTo
-
-Takes a string that is the addresses you want to send mail to
-
-=cut
-
 sub SetTo {
-    my $self      = shift;
+    my $self=shift;
     my $addresses = shift;
-    return $self->SetHeader( 'To', $addresses );
+    return $self->SetHeader('To',$addresses);
 }
-
 # }}}
 
 # {{{ sub SetCc
-
 =head2 SetCc
 
 Takes a string that is the addresses you want to Cc
@@ -513,12 +353,11 @@ Takes a string that is the addresses you want to Cc
 =cut
 
 sub SetCc {
-    my $self      = shift;
+    my $self=shift;
     my $addresses = shift;
 
-    return $self->SetHeader( 'Cc', $addresses );
+    return $self->SetHeader('Cc', $addresses);
 }
-
 # }}}
 
 # {{{ sub SetBcc
@@ -528,24 +367,23 @@ sub SetCc {
 Takes a string that is the addresses you want to Bcc
 
 =cut
-
 sub SetBcc {
-    my $self      = shift;
+    my $self=shift;
     my $addresses = shift;
 
-    return $self->SetHeader( 'Bcc', $addresses );
+    return $self->SetHeader('Bcc', $addresses);
 }
 
 # }}}
 
-# {{{ sub SetPrecedence
+# {{{ sub SetPrecedence 
 
 sub SetPrecedence {
-    my $self = shift;
+  my $self = shift;
 
-    unless ( $self->TemplateObj->MIMEObj->head->get("Precedence") ) {
-        $self->SetHeader( 'Precedence', "bulk" );
-    }
+  unless ($self->TemplateObj->MIMEObj->head->get("Precedence")) { 
+    $self->SetHeader('Precedence', "bulk");
+   }
 }
 
 # }}}
@@ -561,125 +399,70 @@ the transaction's subject.
 =cut 
 
 sub SetSubject {
-    my $self = shift;
+  my $self = shift;
+  unless ($self->TemplateObj->MIMEObj->head->get('Subject')) {
+    my $message=$self->TransactionObj->Message;
+    my $ticket=$self->TicketObj->Id;
+    
     my $subject;
+    
+    if ($self->{'Subject'}) {
+      $subject = $self->{'Subject'};
+    }
+    elsif (($message->First()) &&
+          ($message->First->Headers)) {
+      $header = $message->First->Headers();
+      $header =~ s/\n\s+/ /g; 
+      if ( $header =~ /^Subject: (.*?)$/m ) {
+       $subject = $1;
+      }
+      else {
+       $subject = $self->TicketObj->Subject();
+      }
+      
+    }
+    else {
+      $subject = $self->TicketObj->Subject();
+    }
+    
+    $subject =~ s/(\r\n|\n|\s)/ /gi;
 
-    unless ( $self->TemplateObj->MIMEObj->head->get('Subject') ) {
-        my $message = $self->TransactionObj->Attachments;
-        my $ticket  = $self->TicketObj->Id;
-
-        if ( $self->{'Subject'} ) {
-            $subject = $self->{'Subject'};
-        }
-        elsif (    ( $message->First() )
-                && ( $message->First->Headers ) ) {
-            my $header = $message->First->Headers();
-            $header =~ s/\n\s+/ /g;
-            if ( $header =~ /^Subject: (.*?)$/m ) {
-                $subject = $1;
-            }
-            else {
-                $subject = $self->TicketObj->Subject();
-            }
-
-        }
-        else {
-            $subject = $self->TicketObj->Subject();
-        }
-
-        $subject =~ s/(\r\n|\n|\s)/ /gi;
-
-        chomp $subject;
-        $self->SetHeader( 'Subject', $subject );
-
+    chomp $subject;
+    $self->SetHeader('Subject',$subject);
+    
     }
-    return ($subject);
+  return($subject);
 }
-
 # }}}
 
 # {{{ sub SetSubjectToken
 
 =head2 SetSubjectToken
 
-This routine fixes the RT tag in the subject. It's unlikely that you want to overwrite this.
+ This routine fixes the RT tag in the subject. It's unlikely that you want to overwrite this.
 
 =cut
 
 sub SetSubjectToken {
-    my $self = shift;
-    my $tag  = "[$RT::rtname #" . $self->TicketObj->id . "]";
-    my $sub  = $self->TemplateObj->MIMEObj->head->get('Subject');
-    unless ( $sub =~ /\Q$tag\E/ ) {
-        $sub =~ s/(\r\n|\n|\s)/ /gi;
-        chomp $sub;
-        $self->TemplateObj->MIMEObj->head->replace( 'Subject', "$tag $sub" );
-    }
+  my $self=shift;
+  my $tag = "[$RT::rtname #".$self->TicketObj->id."]";
+  my $sub = $self->TemplateObj->MIMEObj->head->get('Subject');
+  unless ($sub =~ /\Q$tag\E/) {
+    $sub =~ s/(\r\n|\n|\s)/ /gi;
+    chomp $sub;
+    $self->TemplateObj->MIMEObj->head->replace('Subject', "$tag $sub");
+  }
 }
 
 # }}}
 
 # }}}
 
-# {{{
-
-=head2 SetHeaderAsEncoding($field_name, $charset_encoding)
-
-This routine converts the field into specified charset encoding.
-
-=cut
-
-sub SetHeaderAsEncoding {
-    my $self = shift;
-    my ( $field, $enc ) = ( shift, shift );
-
-    if ($field eq 'From' and $RT::SMTPFrom) {
-        $self->TemplateObj->MIMEObj->head->replace( $field, $RT::SMTPFrom );
-       return;
-    }
-
-    my $value = $self->TemplateObj->MIMEObj->head->get($field);
-
-    # don't bother if it's us-ascii
-
-    # See RT::I18N, 'NOTES:  Why Encode::_utf8_off before Encode::from_to'
-
-    $value =  $self->MIMEEncodeString($value, $enc);
-
-    $self->TemplateObj->MIMEObj->head->replace( $field, $value );
-
-
-} 
-# }}}
-
-# {{{ MIMENcodeString
-
-=head2 MIMEEncodeString STRING ENCODING
-
-Takes a string and a possible encoding and returns the string wrapped in MIME goo.
-
-=cut
-
-sub MIMEEncodeString {
-    my  $self = shift;
-    my $value = shift;
-    my $enc = shift;
+__END__
 
-    chomp $value;
-    return ($value) unless $value =~ /[^\x20-\x7e]/;
-
-    $value =~ s/\s*$//;
-    Encode::_utf8_off($value);
-    my $res = Encode::from_to( $value, "utf-8", $enc );
-    $value = encode_mimeword( $value,  'B', $enc );
-}
+# {{{ POD
 
 # }}}
 
-eval "require RT::Action::SendEmail_Vendor";
-die $@ if ($@ && $@ !~ qr{^Can't locate RT/Action/SendEmail_Vendor.pm});
-eval "require RT::Action::SendEmail_Local";
-die $@ if ($@ && $@ !~ qr{^Can't locate RT/Action/SendEmail_Local.pm});
-
 1;