3 # This is a SpamAssassin module that kills mail from newly-born domains.
7 use Mail::SpamAssassin::Plugin;
9 use Sys::Syslog qw(:standard :macros);
13 our @ISA = qw(Mail::SpamAssassin::Plugin);
16 my ($class, $mailsa) = @_;
18 # the usual perlobj boilerplate to create a subclass object
19 $class = ref($class) || $class;
20 my $self = $class->SUPER::new($mailsa);
21 bless ($self, $class);
24 syslog('info', 'Initializing INFANTICIDE for SpamAssassin (c) 2022-2023 by Art Cancro');
26 # Register evaluation rules
27 $self->register_eval_rule ("check_for_disposable_domain");
29 # and return the new plugin object
35 my $s = shift; $s =~ s/^\s+|\s+$//g; return $s
39 sub infanticide_get_creation_date {
40 my $domain_to_test = $_[0];
43 open my $fh, "-|", "whois", $domain_to_test or return("");
44 my @lines = <$fh> or return("");
45 close $fh or return("");
47 if (index($_, "Creation Date:") != -1) {
48 my @arr = split("Creation Date:", $_);
49 $cDate = trim($arr[1]);
50 # 2017-06-02T13:15:42Z
57 sub check_for_disposable_domain() {
58 $counter = $counter + 1;
60 my ($self, $pms) = @_;
61 my $fromaddr = $pms->get("From:addr", undef);
62 my @fromarr = split('@', $fromaddr);
63 my $domain = $fromarr[1];
64 my $creationDate = infanticide_get_creation_date($domain);
65 if ($creationDate eq "") {
66 syslog('debug', "infanticide: " . $counter . " no creation date for " . $domain);
69 my $dt = str2time($creationDate);
70 my $daysAgo = (time() - $dt) / 86400;
71 syslog("debug", "infanticide: " . $domain . " was created " . $daysAgo . " days ago");