sub is_dialup { my ($Host, $IP) = @_; # No reverse DNS, assume dialup of some sort return 1 if !$Host || $Host eq 'unknown'; # Whitelist obvious mail relay hostnames return 0 if is_smtp_server($Host, $IP); # Regexp from postfix mailing list return 1 if $Host =~ /docsis|dip[0-9]|dpc[0-9]|dsl|catv|client|dhcp|pool[\-\.]|ppp(?:oe|oa)?[0-9\-\.]|cpe|cust|dial|access|in\-addr|\.arpa|cable|nombres|upc\-[a-z] |user|bri\-|abo\.|dynamic|\D\d{5,}\D/i; # Contains part of the IP in some form? my ($IP1, $IP2, $IP3, $IP4) = map { sprintf('(?i:%d|%03d|%02X)', $_, $_, $_) } split /\./, $IP; my $IPRE1 = qr/${IP1}[\.\-]?${IP2}[\.\-]?${IP3}/; my $IPRE2 = qr/${IP3}[\.\-]${IP4}\D/; my $IPRE3 = qr/${IP3}[\.\-]${IP2}[\.\-]${IP1}/; my $IPRE4 = qr/${IP4}[\.\-]${IP3}\D/; return 1 if $Host =~ /(?:^|\D)(?:$IPRE1|$IPRE2|$IPRE3|$IPRE4)/; return 0; } sub is_smtp_server { (local $_, my $IP) = @_; # Common things in MX hostnames return 1 if /smtp|mx[\d\.]|(^|\.)d?ns[\d\.]|mta|mail|relay|router|server|\bout|forward/i; # Raw domains or single level depth domain, probably a server return 1 if /^(?:[a-z]+\d{0,2}\.)?[\w\-]+\.(?:com|org|net)$/i; return 1 if /^(?:[a-z]+\d{0,2}\.)?[\w\-]+\.(?:com|org|net|co)\.[a-z]{2}$/i; return 1 if /^(?:[a-z]+\d{0,2}\.)?[\w\-]+\.[a-z]{2}$/i; return 0; }