#!/usr/bin/perl
-# $Id: process.in,v 1.107 2005/10/19 01:22:14 don Exp $
+# $Id: process.in,v 1.108 2006/02/03 03:52:51 don Exp $
#
# Usage: process nn
# Temps: incoming/Pnn
tzset();
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';
}
$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='';
$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.");
&checkmaintainers;
+ my @noticecc = grep($_ ne $replyto,@maintaddrs);
$noticeccval.= join(', ', grep($_ ne $replyto,@maintaddrs));
$noticeccval =~ s/\s+\n\s+/ /g;
$noticeccval =~ s/^\s+/ /; $noticeccval =~ s/\s+$//;
}
# 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+$//;
$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}${generalbcc}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)]),'',[@generalbcc,@noticecc],1);
Your message dated $header{'date'}
with message-id $header{'message-id'}
has caused the $gProject $gBug report #$ref,
} 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}${generalbcc}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-Packag" => $data->{package},
+ "X-$gProject-PR-Keywords" => $data->{keywords}
+ ],<<END ,[$x,join("\n",@msg)]),'',[@generalbcc,@noticecc],1);
Your message dated $header{'date'}
with message-id $header{'message-id'}
and subject line $subject
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 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",
+ 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.
$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
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);
+ $msg = encode_headers($msg) unless $no_encode;
my $hash = get_hashname($ref);
#save email to the log