]> git.donarmstrong.com Git - debbugs.git/blobdiff - scripts/process.in
merge changes from dla source tree
[debbugs.git] / scripts / process.in
index 21bf8af3c2883ff36b79ba9ed2aa7b9556468615..baef90c9812f12b0504bf05c7ac0a0bd32e0a9fd 100755 (executable)
@@ -1,5 +1,5 @@
 #!/usr/bin/perl
-# $Id: process.in,v 1.98 2005/07/26 04:30:53 don Exp $
+# $Id: process.in,v 1.109 2006/02/09 22:02:04 don Exp $
 #
 # Usage: process nn
 # Temps:  incoming/Pnn
@@ -8,9 +8,9 @@ use POSIX qw(strftime tzset);
 $ENV{"TZ"} = 'UTC';
 tzset();
 
-use IO::File;
 use MIME::Parser;
-use Debbugs::MIME qw(decode_rfc1522);
+use Debbugs::MIME qw(decode_rfc1522 create_mime_message);
+use Debbugs::Mail qw(send_mail_message encode_headers);
 
 $config_path = '/etc/debbugs';
 $lib_path = '/usr/lib/debbugs';
@@ -100,7 +100,10 @@ if ($entity and $entity->head->tags) {
     @bodylines = @msg[$i..$#msg];
 }
 
+my %header;
+
 for my $hdr (@headerlines) {
+    $hdr = decode_rfc1522($hdr);
     $_ = $hdr;
     s/\n\s/ /g;
     &finish if m/^x-loop: (\S+)$/i && $1 eq "$gMaintainerEmail";
@@ -111,7 +114,7 @@ for my $hdr (@headerlines) {
     if (s/^(\S+):\s*//) {
        my $v = lc $1;
        print DEBUG ">$v=$_<\n";
-       $header{$v} = decode_rfc1522($_);
+       $header{$v} = $_;
     } else {
        print DEBUG "!>$_<\n";
     }
@@ -146,6 +149,10 @@ for my $phline (@bodylines)
     print DEBUG ">$fn~$fv<\n";
 }
 
+# Allow pseudo headers to set x-debbugs- stuff [#179340]
+for my $key (grep /X-Debbugs-.*/i, keys %pheader) {
+     $header{$key} = $pheader{$key} if not exists $header{$key};
+}
 
 $fwd .= join("\n",@msg[$i..$#msg]);
 
@@ -255,12 +262,14 @@ if ($codeletter eq 'D' || $codeletter eq 'F')
     }
     $markedby= $header{'from'} eq $replyto ? $replyto :
                "$header{'from'} (reply to $replyto)";
+    my @generalcc;
     if ($codeletter eq 'F') {
         (&appendlog,&finish) if length($data->{forwarded});
         $receivedat= "forwarded\@$gEmailDomain";
         $markaswhat= 'forwarded';
         $set_forwarded= $header{'to'};
        if ( length( $gListDomain ) > 0 && length( $gForwardList ) > 0 ) {
+           push @generalcc, "$gForwardList\@$gListDomain";
            $generalcc= "$gForwardList\@$gListDomain";
        } else { 
            $generalcc=''; 
@@ -277,12 +286,14 @@ if ($codeletter eq 'D' || $codeletter eq 'F')
         $set_done= $header{'from'};
        if ( length( $gListDomain ) > 0 && length( $gDoneList ) > 0 ) {
             $generalcc= "$gDoneList\@$gListDomain";
+           push @generalcc, "$gDoneList\@$gListDomain";
        } else { 
            $generalcc=''; 
        }
     }
     if (defined $gStrongList and isstrongseverity($data->{severity})) {
         $generalcc = join ', ', $generalcc, "$gStrongList\@$gListDomain";
+       push @generalcc,"$gStrongList\@$gListDomain";
     }
     if ($ref<0) {
        &htmllog("Warning","sent",$replyto,"Message ignored.");
@@ -331,20 +342,11 @@ END
 
     &checkmaintainers;
 
-    # Add bug mailing lists as appropriate
-    my @bug_mailing_lists;
-    push @bug_mailing_lists, map {"bugs=$_\@$gListDomain"} ($ref, split (/ /, $data->{mergedwith}));
-
+    my @noticecc = grep($_ ne $replyto,@maintaddrs);
     $noticeccval.= join(', ', grep($_ ne $replyto,@maintaddrs));
     $noticeccval =~ s/\s+\n\s+/ /g; 
     $noticeccval =~ s/^\s+/ /; $noticeccval =~ s/\s+$//;
-
-    $generalcc = join(', ', $generalcc, @addsrcaddrs, @bug_mailing_lists);
-    $generalcc =~ s/\s+\n\s+/ /g;
-    $generalcc =~ s/^\s+/ /; $generalcc =~ s/\s+$//;
-
     if (length($noticeccval)) { $noticecc= "Cc: $noticeccval\n"; }
-    if (length($generalcc)) { $noticecc.= "Bcc: $generalcc\n"; }
 
     @process= ($ref,split(/ /,$data->{mergedwith}));
     $orgref= $ref;
@@ -367,6 +369,14 @@ END
             }
         }
 
+       # Add bug mailing list to $generalbcc as appropriate
+       # This array is used to specify bcc in the cases where we're using create_mime_message.
+       my @generalbcc = (@generalcc,@addsrcaddrs,"bugs=$ref\@$gListDomain");
+       my $generalbcc = join(', ', $generalcc, @addsrcaddrs,"bugs=$ref\@$gListDomain");
+       $generalbcc =~ s/\s+\n\s+/ /g;
+       $generalbcc =~ s/^\s+/ /; $generalbcc =~ s/\s+$//;
+       if (length $generalbcc) {$generalbcc = "Bcc: $generalbcc\n"};
+
        writebug($ref, $data);
 
        my $hash = get_hashname($ref);
@@ -374,18 +384,19 @@ END
         $x= join('',<O>); close(O);
         if ($codeletter eq 'F') {
            &htmllog("Reply","sent",$replyto,"You have marked $gBug as forwarded.");
-            &sendmessage(<<END."---------------------------------------\n".join( "\n", @msg ), '');
-From: $gMaintainerEmail ($gProject $gBug Tracking System)
-To: $replyto
-${noticecc}Subject: $gBug#$ref: marked as forwarded ($data->{subject})
-Message-ID: <header.$ref.$nn.ackfwdd\@$gEmailDomain>
-In-Reply-To: $header{'message-id'}
-References: $header{'message-id'} $data->{msgid}
-Precedence: bulk
-X-$gProject-PR-Message: forwarded $ref
-X-$gProject-PR-Package: $data->{package}
-X-$gProject-PR-Keywords: $data->{keywords}
-
+            &sendmessage(create_mime_message(
+            ["X-Loop"      => "$gMaintainerEmail",
+             From          => "$gMaintainerEmail ($gProject $gBug Tracking System)",
+              To            => "$replyto",
+              Subject       => "$gBug#$ref: marked as forwarded ($data->{subject})",
+              "Message-ID"  => "<header.$ref.$nn.ackfwdd\@$gEmailDomain>",
+              "In-Reply-To" => $header{'message-id'},
+              References    => "$header{'message-id'} $data->{msgid}",
+              Precedence    => 'bulk',
+              "X-$gProject-PR-Message"  => "forwarded $ref",
+              "X-$gProject-PR-Package"  => $data->{package},
+              "X-$gProject-PR-Keywords" => $data->{keywords}
+             ],<<END ,[join("\n",@msg)]),'',[$replyto,@generalbcc,@noticecc],1);
 Your message dated $header{'date'}
 with message-id $header{'message-id'}
 has caused the $gProject $gBug report #$ref,
@@ -404,18 +415,19 @@ END
 
         } else {
            &htmllog("Reply","sent",$replyto,"You have taken responsibility.");
-            &sendmessage(<<END."--------------------------------------\n".$x."---------------------------------------\n".join( "\n", @msg ), '');
-From: $gMaintainerEmail ($gProject $gBug Tracking System)
-To: $replyto
-${noticecc}Subject: $gBug#$ref: marked as done ($data->{subject})
-Message-ID: <handler.$ref.$nn.ackdone\@$gEmailDomain>
-In-Reply-To: $header{'message-id'}
-References: $header{'message-id'} $data->{msgid}
-Precedence: bulk
-X-$gProject-PR-Message: closed $ref
-X-$gProject-PR-Package: $data->{package}
-X-$gProject-PR-Keywords: $data->{keywords}
-
+            &sendmessage(create_mime_message(
+            ["X-Loop"      => "$gMaintainerEmail",
+             From          => "$gMaintainerEmail ($gProject $gBug Tracking System)",
+              To            => $replyto,
+              Subject       => "$gBug#$ref: marked as done ($data->{subject})",
+              "Message-ID"  => "<handler.$ref.$nn.ackdone\@$gEmailDomain>",
+              "In-Reply-To" => $header{'message-id'},
+              References    => "$header{'message-id'} $data->{msgid}",
+              Precedence    => 'bulk',
+              "X-$gProject-PR-Message"  => "closed $ref",
+              "X-$gProject-PR-Package"  => $data->{package},
+              "X-$gProject-PR-Keywords" => $data->{keywords}
+             ],<<END ,[$x,join("\n",@msg)]),'',[$replyto,@generalbcc,@noticecc],1);
 Your message dated $header{'date'}
 with message-id $header{'message-id'}
 and subject line $subject
@@ -435,29 +447,30 @@ $gMaintainer
 END
             &htmllog("Notification","sent",$data->{originator}, 
                "$gBug acknowledged by developer.");
-            &sendmessage(<<END.join("\n",@msg),'');
-From: $gMaintainerEmail ($gProject $gBug Tracking System)
-To: $data->{originator}
-Subject: $gBug#$ref acknowledged by developer
-         ($header{'subject'})
-Message-ID: <handler.$ref.$nn.notifdone\@$gEmailDomain>
-In-Reply-To: $data->{msgid}
-References: $header{'message-id'} $data->{msgid}
-X-$gProject-PR-Message: they-closed $ref
-X-$gProject-PR-Package: $data->{package}
-X-$gProject-PR-Keywords: $data->{keywords}
-Reply-To: $ref\@$gEmailDomain
-
+            &sendmessage(create_mime_message(
+            ["X-Loop"      => "$gMaintainerEmail",
+             From          => "$gMaintainerEmail ($gProject $gBug Tracking System)",
+              To            => "$data->{originator}",
+              Subject       => "$gBug#$ref closed by $markedby ($header{'subject'})",
+              "Message-ID"  => "<handler.$ref.$nn.notifdone\@$gEmailDomain>",
+              "In-Reply-To" => "$data->{msgid}",
+              References    => "$header{'message-id'} $data->{msgid}",
+              "X-$gProject-PR-Message"  => "they-closed $ref",
+              "X-$gProject-PR-Package"  => "$data->{package}",
+              "X-$gProject-PR-Keywords" => "$data->{keywords}",
+              "Reply-To"                => "$ref\@$gEmailDomain",
+              "Content-Type"            => 'text/plain; charset="utf-8"',
+             ],<<END ,[join("\n",@msg)]),'',undef,1);
 This is an automatic notification regarding your $gBug report
 #$ref: $data->{subject},
 which was filed against the $data->{package} package.
 
-It has been closed by one of the developers, namely
-$markedby.
+It has been closed by $markedby.
 
 Their explanation is attached below.  If this explanation is
 unsatisfactory and you have not received a better one in a separate
-message then please contact the developer, by replying to this email.
+message then please contact $markedby by replying
+to this email.
 
 $gMaintainer
 (administrator, $gProject $gBugs database)
@@ -525,16 +538,17 @@ END
         $data->{package} = $pheader{package};
     } else {
        &htmllog("Warning","sent",$replyto,"Message not forwarded.");
-        &sendmessage(<<END."---------------------------------------------------------------------------\n".join("\n", @msg), '');
-From: $gMaintainerEmail ($gProject $gBug Tracking System)
-To: $replyto
-Subject: Message with no Package: tag cannot be processed!
-         ($subject)
-Message-ID: <handler.x.$nn.nonumnosub\@$gEmailDomain>
-In-Reply-To: $header{'message-id'}
-References: $header{'message-id'} $data->{msgid}
-Precedence: bulk
-X-$gProject-PR-Message: error
+        &sendmessage(create_mime_message(
+                       ["X-Loop"      => "$gMaintainerEmail",
+                       From          => "$gMaintainerEmail ($gProject $gBug Tracking System)",
+                        To            => $replyto,
+                        Subject       => "Message with no Package: tag cannot be processed! ($subject)",
+                        "Message-ID"  => "<handler.x.$nn.nonumnosub\@$gEmailDomain>",
+                        "In-Reply-To" => $header{'message-id'},
+                        References    => "$header{'message-id'} $data->{msgid}",
+                        Precedence    => 'bulk',
+                        "X-$gProject-PR-Message" => 'error'
+                      ],<<END,[join("\n", @msg)]), '',undef,1);
 
 Your message didn't have a Package: line at the start (in the
 pseudo-header following the real mail header), or didn't have a
@@ -598,6 +612,9 @@ END
     if (defined($pheader{owner})) {
         $data->{owner}= $pheader{owner};
     }
+    if (defined($pheader{forwarded})) {
+       $data->{'forwarded-to'} = $pheader{forwarded};
+    }
     &filelock("nextnumber.lock");
     open(N,"nextnumber") || &quit("nextnumber: read: $!");
     $v=<N>; $v =~ s/\n$// || &quit("nextnumber bad format");
@@ -764,20 +781,21 @@ unless (exists $header{'x-debbugs-no-ack'}) {
                  ($veryquiet ?
                   "New $gBug report received and filed, but not forwarded." :
                   "New $gBug report received and forwarded."). $htmlbreak);
-        &sendmessage($veryquiet ? <<END : $codeletter eq 'M' ? <<END : <<END,'');
-From: $gMaintainerEmail ($gProject $gBug Tracking System)
-To: $replyto
-Subject: $gBug#$ref: Acknowledgement of QUIET report
-         ($subject)
-Message-ID: <handler.$ref.$nn.ackquiet\@$gEmailDomain>
-In-Reply-To: $header{'message-id'}
-References: $header{'message-id'}
-Precedence: bulk
-X-$gProject-PR-Message: ack-quiet $ref
-X-$gProject-PR-Package: $data->{package}
-X-$gProject-PR-Keywords: $data->{keywords}
-Reply-To: $ref-quiet\@$gEmailDomain
-
+       if ($veryquiet) {
+            &sendmessage(create_mime_message(
+                      ["X-Loop"      => "$gMaintainerEmail",
+                       From          => "$gMaintainerEmail ($gProject $gBug Tracking System)",
+                       To            => $replyto,
+                        Subject       => "$gBug#$ref: Acknowledgement of QUIET report ($subject)",
+                        "Message-ID"  => "<handler.$ref.$nn.ackquiet\@$gEmailDomain>",
+                        "In-Reply-To" => $header{'message-id'},
+                        References    => $header{'message-id'},
+                        Precedence    => 'bulk',
+                       "X-$gProject-PR-Message"  => "ack-quiet $ref",
+                       "X-$gProject-PR-Package"  => $data->{package},
+                       "X-$gProject-PR-Keywords" => $data->{keywords},
+                       "Reply-To"                => "$ref-quiet\@$gEmailDomain",
+                      ],<<END,[join("\n", @msg)]), '',undef,1);
 Thank you for the problem report you have sent regarding $gProject.
 This is an automatically generated reply, to let you know your message
 has been received.  It has not been forwarded to the package maintainers
@@ -795,19 +813,22 @@ $brokenness
 $gMaintainer
 (administrator, $gProject $gBugs database)
 END
-From: $gMaintainerEmail ($gProject $gBug Tracking System)
-To: $replyto
-Subject: $gBug#$ref: Acknowledgement of maintainer-only report
-         ($subject)
-Message-ID: <handler.$ref.$nn.ackmaint\@$gEmailDomain>
-In-Reply-To: $header{'message-id'}
-References: $header{'message-id'}
-Precedence: bulk
-X-$gProject-PR-Message: ack-maintonly $ref
-X-$gProject-PR-Package: $data->{package}
-X-$gProject-PR-Keywords: $data->{keywords}
-Reply-To: $ref-maintonly\@$gEmailDomain
-
+       }
+       elsif ($codeletter eq 'M') {
+            &sendmessage(create_mime_message(
+                      ["X-Loop"      => "$gMaintainerEmail",
+                       From          => "$gMaintainerEmail ($gProject $gBug Tracking System)",
+                       To            => $replyto,
+                        Subject       => "$gBug#$ref: Acknowledgement of maintainer-only report ($subject)",
+                        "Message-ID"  => "<handler.$ref.$nn.ackmaint\@$gEmailDomain>",
+                        "In-Reply-To" => $header{'message-id'},
+                        References    => $header{'message-id'},
+                        Precedence    => 'bulk',
+                       "X-$gProject-PR-Message" => "ack-maintonly $ref",
+                       "X-$gProject-PR-Package"  => $data->{package},
+                       "X-$gProject-PR-Keywords" => $data->{keywords},
+                       "Reply-To"               => "$ref-maintonly\@$gEmailDomain",
+                      ],<<END,[]), '',undef,1);
 Thank you for the problem report you have sent regarding $gProject.
 This is an automatically generated reply, to let you know your message has
 been received.  It is being forwarded to the package maintainers (but not
@@ -824,18 +845,22 @@ $brokenness
 $gMaintainer
 (administrator, $gProject $gBugs database)
 END
-From: $gMaintainerEmail ($gProject $gBug Tracking System)
-To: $replyto
-Subject: $gBug#$ref: Acknowledgement ($subject)
-Message-ID: <handler.$ref.$nn.ack\@$gEmailDomain>
-In-Reply-To: $header{'message-id'}
-References: $header{'message-id'}
-Precedence: bulk
-X-$gProject-PR-Message: ack $ref
-X-$gProject-PR-Package: $data->{package}
-X-$gProject-PR-Keywords: $data->{keywords}
-Reply-To: $ref\@$gEmailDomain
-
+                  }
+       else {
+            &sendmessage(create_mime_message(
+                      ["X-Loop"      => "$gMaintainerEmail",
+                       From          => "$gMaintainerEmail ($gProject $gBug Tracking System)",
+                       To            => $replyto,
+                        Subject       => "$gBug#$ref: Acknowledgement ($subject)",
+                        "Message-ID"  => "<handler.$ref.$nn.ack\@$gEmailDomain>",
+                        "In-Reply-To" => $header{'message-id'},
+                        References    => $header{'message-id'},
+                        Precedence    => 'bulk',
+                       "X-$gProject-PR-Message"  => "ack $ref",
+                       "X-$gProject-PR-Package"  => $data->{package},
+                       "X-$gProject-PR-Keywords" => $data->{keywords},
+                       "Reply-To"                => "$ref\@$gEmailDomain",
+                      ],<<END,[]), '',undef,1);
 Thank you for the problem report you have sent regarding $gProject.
 This is an automatically generated reply, to let you know your message has
 been received.  It is being forwarded to the package maintainers and other
@@ -851,26 +876,31 @@ $brokenness
 $gMaintainer
 (administrator, $gProject $gBugs database)
 END
+                  }
     } elsif ($codeletter ne 'U' and
-             $header{'precedence'} !~ /\b(?:bulk|junk|list)\b/) {
+             $header{'precedence'} !~ /\b(?:bulk|junk|list)\b/ and
+            # Workaround for gcc mail loops; bugzilla should do Precedence:
+            # instead. Deliberately not in CVS. - cjwatson
+            not exists $header{'x-bugzilla-reason'}) {
         &htmllog("Acknowledgement","sent",$replyto,
                  ($veryquiet ? "Extra info received and filed, but not forwarded." :
                   $codeletter eq 'M' ? "Extra info received and forwarded to maintainer." :
                   "Extra info received and forwarded to list."). $htmlbreak);
-        &sendmessage($veryquiet ? <<END : $codeletter eq 'M' ? <<END : <<END,'');
-From: $gMaintainerEmail ($gProject $gBug Tracking System)
-To: $replyto
-Subject: $gBug#$ref: Info received and FILED only
-         (was $subject)
-Message-ID: <handler.$ref.$nn.ackinfoquiet\@$gEmailDomain>
-In-Reply-To: $header{'message-id'}
-References: $header{'message-id'}
-Precedence: bulk
-X-$gProject-PR-Message: ack-info-quiet $ref
-X-$gProject-PR-Package: $data->{package}
-X-$gProject-PR-Keywords: $data->{keywords}
-Reply-To: $ref-quiet\@$gEmailDomain
-
+       if ($veryquiet) {
+            &sendmessage(create_mime_message(
+                      ["X-Loop"      => "$gMaintainerEmail",
+                       From          => "$gMaintainerEmail ($gProject $gBug Tracking System)",
+                       To            => $replyto,
+                        Subject       => "$gBug#$ref: Info received and FILED only (was $subject)",
+                        "Message-ID"  => "<handler.$ref.$nn.ackinfoquiet\@$gEmailDomain>",
+                        "In-Reply-To" => $header{'message-id'},
+                        References    => $header{'message-id'},
+                        Precedence    => 'bulk',
+                       "X-$gProject-PR-Message" => "ack-info-quiet $ref",
+                       "X-$gProject-PR-Package"  => $data->{package},
+                       "X-$gProject-PR-Keywords" => $data->{keywords},
+                       "Reply-To"               => "$ref-maintonly\@$gEmailDomain",
+                      ],<<END,[]), '',undef,1);
 Thank you for the additional information you have supplied regarding
 this problem report.  It has NOT been forwarded to the package
 maintainers, but will accompany the original report in the $gBug
@@ -886,19 +916,22 @@ $brokenness
 $gMaintainer
 (administrator, $gProject $gBugs database)
 END
-From: $gMaintainerEmail ($gProject $gBug Tracking System)
-To: $replyto
-Subject: $gBug#$ref: Info received for maintainer only
-         (was $subject)
-Message-ID: <handler.$ref.$nn.ackinfomaint\@$gEmailDomain>
-In-Reply-To: $header{'message-id'}
-References: $header{'message-id'}
-Precedence: bulk
-X-$gProject-PR-Message: ack-info-maintonly $ref
-X-$gProject-PR-Package: $data->{package}
-X-$gProject-PR-Keywords: $data->{keywords}
-Reply-To: $ref-maintonly\@$gEmailDomain
-
+                }
+       elsif ($codeletter eq 'M') {
+            &sendmessage(create_mime_message(
+                      ["X-Loop"      => "$gMaintainerEmail",
+                       From          => "$gMaintainerEmail ($gProject $gBug Tracking System)",
+                       To            => $replyto,
+                        Subject       => "$gBug#$ref: Info received for maintainer only (was $subject)",
+                        "Message-ID"  => "<handler.$ref.$nn.ackinfomaint\@$gEmailDomain>",
+                        "In-Reply-To" => $header{'message-id'},
+                        References    => "$header{'message-id'} $data->{msgid}",
+                        Precedence    => 'bulk',
+                       "X-$gProject-PR-Message" => "ack-info-maintonly $ref",
+                       "X-$gProject-PR-Package"  => $data->{package},
+                       "X-$gProject-PR-Keywords" => $data->{keywords},
+                       "Reply-To"               => "$ref-maintonly\@$gEmailDomain",
+                      ],<<END,[]), '',undef,1);
 Thank you for the additional information you have supplied regarding
 this problem report.  It has been forwarded to the package maintainer(s)
 (but not to other interested parties) to accompany the original report.
@@ -912,17 +945,22 @@ $brokenness
 $gMaintainer
 (administrator, $gProject $gBugs database)
 END
-From: $gMaintainerEmail ($gProject $gBug Tracking System)
-To: $replyto
-Subject: $gBug#$ref: Info received (was $subject)
-Message-ID: <handler.$ref.$nn.ackinfo\@$gEmailDomain>
-In-Reply-To: $header{'message-id'}
-References: $header{'message-id'}
-Precedence: bulk
-X-$gProject-PR-Message: ack-info $ref
-X-$gProject-PR-Package: $data->{package}
-X-$gProject-PR-Keywords: $data->{keywords}
-
+                  }
+       else {
+            &sendmessage(create_mime_message(
+                      ["X-Loop"      => "$gMaintainerEmail",
+                       From          => "$gMaintainerEmail ($gProject $gBug Tracking System)",
+                       To            => $replyto,
+                        Subject       => "$gBug#$ref: Info received ($subject)",
+                        "Message-ID"  => "<handler.$ref.$nn.ackinfo\@$gEmailDomain>",
+                        "In-Reply-To" => $header{'message-id'},
+                        References    => "$header{'message-id'} $data->{msgid}",
+                        Precedence    => 'bulk',
+                       "X-$gProject-PR-Message"  => "ack-info $ref",
+                       "X-$gProject-PR-Package"  => $data->{package},
+                       "X-$gProject-PR-Keywords" => $data->{keywords},
+                       "Reply-To"                => "$ref\@$gEmailDomain",
+                      ],<<END,[]), '',undef,1);
 Thank you for the additional information you have supplied regarding
 this problem report.  It has been forwarded to the package maintainer(s)
 and to other interested parties to accompany the original report.
@@ -936,10 +974,9 @@ $brokenness
 $gMaintainer
 (administrator, $gProject $gBugs database)
 END
-# Reply-To: in previous ack disabled by doogie due to mail loops.
-# Are these still a concern?
-# Reply-To: $ref\@$gEmailDomain
-    }
+
+                  }
+   }
 }
 
 &appendlog;
@@ -1013,12 +1050,34 @@ sub stripbccs {
     return $ret . $msg;
 }
 
+=head2 send_message
+
+     send_message($the_message,\@recipients,\@bcc,$do_not_encode)
+
+The first argument is the scalar message, the second argument is the
+arrayref of recipients, the third is the arrayref of Bcc:'ed
+recipients.
+
+The final argument turns off header encoding and the addition of the
+X-Loop header if true, defaults to false.
+
+=cut
+
+
 sub sendmessage {
-    local ($msg,$recips,$bcc) = @_;
-    if ((!ref($recips) && $recips eq '') || @$recips == 0) {
-        $recips = ['-t'];
+    my ($msg,$recips,$bcc,$no_encode) = @_;
+    if (not defined $recips or (!ref($recips) && $recips eq '')
+       or @$recips == 0) {
+       $recips = ['-t'];
     }
-    $msg = "X-Loop: $gMaintainerEmail\n" . $msg;
+    # This is suboptimal. The right solution is to send headers
+    # separately from the rest of the message and encode them rather
+    # than doing this.
+    $msg = "X-Loop: $gMaintainerEmail\n" . $msg unless $no_encode;
+    # The original message received is written out in appendlog, so
+    # before writing out the other messages we've sent out, we need to
+    # RFC1522 encode the header.
+    $msg = encode_headers($msg) unless $no_encode;
 
     my $hash = get_hashname($ref);
     #save email to the log
@@ -1033,7 +1092,10 @@ sub sendmessage {
         push @$recips, @$bcc;
     }
 
-    send_mail_message($msg,$recips);
+    send_mail_message(message        => $msg,
+                     # Because we encode the headers above, we do not want to encode them here
+                     encode_headers => 0,
+                     recipients     => $recips);
 }
 
 sub checkmaintainers {
@@ -1045,7 +1107,8 @@ sub checkmaintainers {
        m/^\s*$/ && next;
         m/^(\S+)\s+(\S.*\S)\s*\n$/ || &quit("maintainers bogus \`$_'");
         $a= $1; $b= $2; $a =~ y/A-Z/a-z/;
-        $maintainerof{$1}= $2;
+       # use the package which is normalized to lower case; we do this because we lc the pseudo headers.
+        $maintainerof{$a}= $2;
     }
     close(MAINT);
     open(MAINT,"$gMaintainerFileOverride") || die &quit("maintainers.override open: $!");
@@ -1054,7 +1117,8 @@ sub checkmaintainers {
        m/^\s*$/ && next;
         m/^(\S+)\s+(\S.*\S)\s*\n$/ || &quit("maintainers.override bogus \`$_'");
         $a= $1; $b= $2; $a =~ y/A-Z/a-z/;
-        $maintainerof{$1}= $2;
+       # use the package which is normalized to lower case; we do this because we lc the pseudo headers.
+        $maintainerof{$a}= $2;
     }
     close(MAINT);
     open(SOURCES,"$gPackageSource") || &quit("pkgsrc open: $!");
@@ -1082,8 +1146,7 @@ sub checkmaintainers {
            print DEBUG "maintainer add >$p|$maintainerof{$p}<\n";
             $addmaint= $maintainerof{$p};
             push(@maintaddrs,$addmaint) unless
-                ($addmaint eq $replyto and $codeletter ne 'M') || 
-                    grep($_ eq $addmaint, @maintaddrs);
+                $addmaint eq $replyto || grep($_ eq $addmaint, @maintaddrs);
             $anymaintfound++;
         } else {
            print DEBUG "maintainer none >$p<\n";
@@ -1101,80 +1164,6 @@ sub checkmaintainers {
     }
 }
 
-=head2 send_mail_message
-
-     send_mail_message($message,[@recipients],$envelope_from)
-
-Sends a mail message out to a set of recepients with envelope sender
-$envelope_from; if $envelope_from is not set, defaults to
-$gMaintainerEmail.
-
-=cut
-
-sub send_mail_message{
-     my ($message,$recipients,$envelope_from) = @_;
-
-     # Default to $gMaintainerEmail
-     $envelope_from ||= $gMaintainerEmail;
-
-     print DEBUG "sending mail to ".join(', ',@$recipients)." with -f $envelope_from";
-     local $_ = '';
-     $SIG{'CHLD'}='chldhandle';
-     #print DEBUG "mailing sigchild set up<\n";
-     our $chldexit = 'no';
-     our $c= open(U,"-|");
-     #print DEBUG "mailing opened pipe fork<\n";
-     defined($c) || die $!;
-     #print DEBUG "mailing opened pipe fork ok $c<\n";
-     if (!$c) { # ie, we are in the child process
-         #print DEBUG "mailing child<\n";
-         unless (open(STDERR,">&STDOUT")) {
-              #print DEBUG "mailing child opened stderr<\n";
-              print STDOUT "redirect stderr: $!\n";
-              #print DEBUG "mailing child opened stderr fail<\n";
-              exit 1;
-              #print DEBUG "mailing child opened stderr fail exit !?<\n";
-         }
-         #print DEBUG "mailing child opened stderr ok<\n";
-         $c= open(D,"|-");
-         #print DEBUG "mailing child forked again<\n";
-         defined($c) || die $!;
-         #print DEBUG "mailing child forked again ok $c<\n";
-         if (!$c) { # ie, we are the child process
-              #print DEBUG "mailing grandchild<\n";
-              exec '/usr/lib/sendmail', (defined $envelope_from?'-f'.$envelope_from:''),'-odq','-oem','-oi',
-                   @{$recipients};
-              #print DEBUG "mailing grandchild exec failed<\n";
-              die $!;
-              #print DEBUG "mailing grandchild died !?<\n";
-         }
-         #print DEBUG "mailing child not grandchild<\n";
-         print(D $message) || die $!;
-         #print DEBUG "mailing child printed msg<\n";
-         close(D);
-         #print DEBUG "mailing child closed pipe<\n";
-         die "\n*** command returned exit status $?\n" if $?;
-         #print DEBUG "mailing child exit status ok<\n";
-         exit 0;
-         #print DEBUG "mailing child exited ?!<\n";
-     }
-     #print DEBUG "mailing parent<\n";
-     $results='';
-     #print DEBUG "mailing parent results emptied<\n";
-     while( $chldexit eq 'no' ) { $results.= $_; }
-     #print DEBUG "mailing parent results read >$results<\n";
-     close(U);
-     #print DEBUG "mailing parent results closed<\n";
-     $results.= "\n*** child returned exit status $?\n" if $?;
-     #print DEBUG "mailing parent exit status ok<\n";
-     $SIG{'CHLD'}='DEFAULT';
-     #print DEBUG "mailing parent sigchild default<\n";
-     if (length($results)) { &quit("running sendmail: $results"); }
-     #print DEBUG "mailing parent results ok<\n";
-
-
-}
-
 =head2 bug_list_forward
 
      bug_list_forward($spool_filename) if $codeletter eq 'L';
@@ -1218,9 +1207,10 @@ sub bug_list_forward{
      $bug_address =~ s/\@.+//;
      print DEBUG "Sending message to bugs=$bug_address\@$gListDomain\n";
      print DEBUG $header.qq(\n\n).$body;
-     send_mail_message($header.qq(\n\n).$body,
-                      ["bugs=$bug_address\@$gListDomain"],
-                      $envelope_from,
+     send_mail_message(message        => $header.qq(\n\n).$body,
+                      recipients     => ["bugs=$bug_address\@$gListDomain"],
+                      envelope_from  => $envelope_from,
+                      encode_headers => 0,
                      );
      unlink("incoming/P$bug_fn") || &quit("unlinking incoming/P$bug_fn: $!");
      exit 0;