/usr/local/CPAN/GetWeb/MailBot/UI/Loop.pm
package MailBot::UI::Loop;
use strict;
# three defenses against mail-loops:
#
# 1. X-loop header
# 2. Set Envelope-From to bounceaddr
# 3. Refuse messages from @aDoubleBounce list
#my $MAX_HOP = 50;
my @aDoubleBounce = qw( system daemon mailer mailer-daemon
echo gateway majordomo listserv netmgr );
# jfj add 'Precedence: junk' header
sub new
{
my $type = shift;
my $message = shift;
my $header = $message -> head;
my $paBody = $message -> body;
my $xLoop = $header -> get("X-Loop");
defined $xLoop and
die "LOOP: X-Loop line of $xLoop";
if (grep(/ Transcript of session follows /i,@$paBody))
{
# probably a returned mailer-daemon message
die "LOOP: saw X-Loop: line in body";
}
my $from = $header -> get("From");
$from eq '' and die "did not specify 'From' address";
my @aAddress = Mail::Address -> parse($from);
my $address = $aAddress[0];
my $lowerFrom = lc $address -> address;
grep ($lowerFrom =~ /\b$_\b(?!\-)/,@aDoubleBounce)
and die "LOOP: Messages from $lowerFrom risk mail-loop";
my $notDeliveredTo = $header -> get("Not-Delivered-To");
$notDeliveredTo eq '' or
die "LOOP: saw Not-Delivered-To header\n";
# my @aHop = $header -> get("Received");
# @aHop <= $MAX_HOP
# or die "LOOP: too many hops: " . join(' ',@aHop);
# my $self = {HOP_REF => \@aHop};
my $self = {};
bless($self,$type);
}
sub makeAutoResponse
{
my $self = shift;
my $internet = shift;
my $bounceAddr = shift;
my $header = $internet -> head;
$header -> replace("Errors-To",$bounceAddr)
if defined $bounceAddr;
$header -> add("X-Loop","MailBot");
# my $paHop = $$self{HOP_REF};
# my $hop;
# foreach $hop (@$paHop)
# {
# #$header -> add("Received",$hop);
# }
}