Skip to content

Instantly share code, notes, and snippets.

@SpareSimian
Created December 17, 2024 18:51
Show Gist options
  • Save SpareSimian/abb7f3d179a7ba75fa9a161af13db1cc to your computer and use it in GitHub Desktop.
Save SpareSimian/abb7f3d179a7ba75fa9a161af13db1cc to your computer and use it in GitHub Desktop.
MIMEDefang milter extract: Discard spam from backup MX
use Net::DNS;
# GetHostAddresses(resolver,hostname)
# returns list of IP addresses for hostname
sub GetHostAddresses ($$) {
my ($resolver,$hostname) = @_;
my @addresses;
my $received = $resolver->search($hostname);
if ($received) {
foreach my $rr ($received->answer) {
next unless $rr->type eq "A";
push(@addresses, $rr->address);
}
}
return @addresses;
}
# GetDomainMXAddresses(resolver,domain)
# returns array of IP addresses for domain's MX list
# if no MX records, returns array of IP addresses for this hostname
sub GetDomainMXAddresses ($$) {
my ($resolver,$domain) = @_;
my @mxlist = mx($resolver, $domain);
my @mxaddresses;
if (@mxlist) {
push(@mxaddresses, map { GetHostAddresses($resolver, $_->exchange); } @mxlist);
} else { # check for an A record for the domain...
push(@mxaddresses, GetHostAddresses($resolver, $domain));
}
return @mxaddresses;
}
# MTA_is_domain_MX(domain,address)
# returns TRUE if address is a MX for domain
sub MTA_is_domain_MX ($$) {
my ($domain,$address) = @_;
return grep { /^$address$/ } GetDomainMXAddresses(Net::DNS::Resolver->new, $domain);
}
sub action_discard_bounce ($) {
my($message) = @_;
md_syslog('info', "Recipients[0] = '$Recipients[0]'");
if (MTA_is_domain_MX($MyDomain,$RelayAddr)) {
# don't pester mx backup
return action_discard();
} else {
return action_bounce($message);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment