this plugin rejects mail that does not have a From or Date header (both
required by RFC2822), and can also reject mail where the Date is beyond
some number of days in the past or future.

for the date checking, it uses the Date::Parse module, and currently
just declines to make a decision for messages where it can't parse the
Date header. (it would be interesting to see what effect rejecting those
messages would have.)

jim
#!/usr/bin/perl

=head1 NAME

check_basicheaders - Make sure both From and Date headers are present, and do optional 
range checking on the Date header

=head1 DESCRIPTION

Rejects messages that do not have a From or Date header.

Can also reject messages where the date in the Date header is more than
some number of the days in the past or future.

=head1 CONFIGURATION

Takes one optional parameter, the number of days in the future or past
beyond which to reject messages. (The default is to not reject messages
based on the date.)

=head1 AUTHOR

Written by Jim Winstead Jr.

=head1 LICENSE

Released to the public domain, 26 March 2004.

=cut

use Date::Parse qw(str2time);

sub register {
  my ($self, $qp) = @_;
  $self->register_hook("data_post", "check_basic_headers");

  if (@args > 0) {
    $self->{_days} = $args[0];
    $self->log(1, "WARNING: Ignoring additional arguments.") if (@args > 1);
  }
}

sub check_basic_headers {
  my ($self, $transaction) = @_;

  return (DENY, "Mail with no From header not accepted here")
    unless $transaction->header->get('From');

  my $date = $transaction->header->get('Date');

  return (DENY, "Mail with no Date header not accepted here")
    unless $date;

  return (DECLINED) unless defined $self->{_days};

  my $ts = str2time($date);

  return (DECLINED) unless $ts;

  return (DENY, "The Date in the header was too far in the past")
    if $ts < time - ($self->{_days}*24*3600);

  return (DENY, "The Date in the header was too far in the future")
    if $ts > time + ($self->{_days}*24*3600);

  return (DECLINED);
}

Reply via email to