Perl Script to Test for Open Mail Relays

July 30, 2004, updated August 18, 2004

Open relays are bad. You shouldn't ever run one and your server will be swamped by spammers if you do.

As a warning, while this will detect most normal relays, it does not test for vulnerabilities and unknown reactions that some mail servers may have that allow them to exploited as a mail relay. http://www.abuse.net is pretty good at detecting these things. I can personally speak for software like a fully patched Microsoft Exchange 5.5 server which is absolutely horrible at handling mail trying to be relayed.

#!/usr/bin/perl -w
 
use IO::Socket::INET;
my $SOCKET = IO::Socket::INET->new(
        PeerAddr => "mailserverhost",
        PeerPort => 25,
        Proto   => 'tcp') || die "Error in create socket!";
 
$SOCKET->autoflush= 0;
 
# Suck down the greeting and discard it
my $RESPONSE = <$SOCKET>;
print $RESPONSE;
 
print "HELO server";
print $SOCKET "HELO server";
$RESPONSE = <$SOCKET>;
print $RESPONSE;
 
print "RSET";
print $SOCKET "RSET";
$RESPONSE = <$SOCKET>;
print $RESPONSE;
 
print "MAIL FROM:<spamtest@somedomain.com>";
print $SOCKET "MAIL FROM:<spamtest@somedomain.com>";
$RESPONSE = <$SOCKET>;
print $RESPONSE;
 
 
print "RCPT TO:<to@domain.com>";
print $SOCKET "RCPT TO:<to@domain.com>";
$RESPONSE = <$SOCKET>;
print $RESPONSE;
 
# goodbye
print $SOCKET "QUIT";
# eat any response
$RESPONSE = <$SOCKET>;
print $RESPONSE;
# kill socket
close($SOCKET);

This script can basically be used to automate doing something like telneting to a server to test it's ability to deny an unauthorized relay.

If you are looking for a better solution, the Grinch is a more developed perl script.

Related Posts

2 Comments

Comment February 18, 2009 by FelipeFerreira.net
Great Script, I am adapting to get a list of hosts from .txt I can send u once i finish it.
Comment June 23, 2009 by felipeferreira.net
cool script, simple and usefull