ports/53277: [maintainer update]: mail/rlytest - Perl script to test for open SMTP relays

Paul Chvostek paul+fbsd at it.ca
Fri Jun 13 11:10:19 UTC 2003


>Number:         53277
>Category:       ports
>Synopsis:       [maintainer update]: mail/rlytest - Perl script to test for open SMTP relays
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          maintainer-update
>Submitter-Id:   current-users
>Arrival-Date:   Fri Jun 13 04:10:16 PDT 2003
>Closed-Date:
>Last-Modified:
>Originator:     Paul Chvostek
>Release:        FreeBSD 4.7-STABLE i386
>Organization:
>Environment:
System: FreeBSD foo.it.ca 4.7-STABLE FreeBSD 4.7-STABLE #1: Sun Nov 10 01:01:32 EST 2002 paul at foo.it.ca:/usr/src/sys/compile/foo i386


>Description:
        Nasty perl dependencies, obsolete dist URL.
>How-To-Repeat:
	n/a
>Fix:

diff -2ruN rlytest.old/Makefile rlytest/Makefile
--- rlytest.old/Makefile	Tue Mar 18 03:30:45 2003
+++ rlytest/Makefile	Fri Jun 13 06:53:32 2003
@@ -14,6 +14,6 @@
 EXTRACT_ONLY=   # defined
 
-MAINTAINER=	paul at it.ca
-COMMENT=	Test an SMTP host for third-party relay
+MAINTAINER=	paul+ports at it.ca
+COMMENT=	test remote system for unsecured mail relay
 
 USE_PERL5=	yes
@@ -24,15 +24,12 @@
 
 pre-patch:
-	perl -pe 's,^#!/usr/local/bin/perl$$,#!/usr/bin/perl,' < ${_DISTDIR}${DISTFILES} > ${WRKSRC}/rlytest
+	@${SED} '1s:^#!/usr/local/bin/perl:#!${PERL}:' < ${_DISTDIR}${DISTFILES} > ${WRKSRC}/rlytest
 
 do-build:
-	pod2man ${WRKSRC}/rlytest > ${WRKSRC}/rlytest.1
+	@pod2man ${WRKSRC}/rlytest > ${WRKSRC}/rlytest.1
 
 do-install:
-	${INSTALL_SCRIPT} ${WRKSRC}/rlytest ${PREFIX}/bin/
-	${INSTALL_MAN} ${WRKSRC}/rlytest.1 ${PREFIX}/man/man1/
-
-post-install:
-	${CAT} ${PKGMESSAGE}
+	@${INSTALL_SCRIPT} ${WRKSRC}/rlytest ${PREFIX}/bin/
+	@${INSTALL_MAN} ${WRKSRC}/rlytest.1 ${PREFIX}/man/man1/
 
 .include <bsd.port.mk>
diff -2ruN rlytest.old/pkg-descr rlytest/pkg-descr
--- rlytest.old/pkg-descr	Mon May  3 01:50:32 1999
+++ rlytest/pkg-descr	Fri Jun 13 06:29:54 2003
@@ -7,10 +7,9 @@
 menace to the Internet.
 
-See http://www.unicom.com/sw/#rlytest for mor information.
+See http://www.unicom.com/sw/rlytest for more information.
 
-rlytest was written by Chip Rosenthal, and is featured at
-http://maps.vix.com/tsi/ and http://www.badrelay.org/.
+pxytest was written by Chip Rosenthal.
 
-- Paul Chvostek <paul at it.ca>
+- Paul Chvostek <paul+ports at it.ca>
 
-WWW: http://www.unicom.com/sw/#rlytest
+WWW: http://www.unicom.com/sw/rlytest
diff -2ruN rlytest.old/pkg-message rlytest/pkg-message
--- rlytest.old/pkg-message	Mon Jan 25 22:20:56 1999
+++ rlytest/pkg-message	Wed Dec 31 19:00:00 1969
@@ -1,18 +0,0 @@
-
-NOTE: If you wish to make easier use of the rlytest program from within
-scripts, you might want to modify the exit codes it uses.  Line 122 of
-the script contains the exit code used if the relay was accepted (bad),
-and line 165 contains the exit code used if the relay was rejected
-(good).  The original author has expressed a wish that his code not be
-modified automatically in this way by this distribution, but if you wish
-to modify your local copy, you should feel free to do so.
-
-If you just change the "0" line line 122 to a "1", then in shell scripts
-you'll be able to use constructs like:
-
-  if /usr/local/bin/rlytest $hostname >/dev/null 2>/dev/null ; then
-    echo "$hostname is good"
-  else
-    echo "$hostname is evil"
-  fi
-
diff -2ruN rlytest.old/work/.PLIST.mktmp rlytest/work/.PLIST.mktmp
--- rlytest.old/work/.PLIST.mktmp	Wed Dec 31 19:00:00 1969
+++ rlytest/work/.PLIST.mktmp	Fri Jun 13 06:40:48 2003
@@ -0,0 +1,4 @@
+man/man1/rlytest.1.gz
+ at unexec rm -f %D/man/cat1/rlytest.1 %D/man/cat1/rlytest.1.gz
+bin/rlytest
+ at unexec if [ -f %D/info/dir ]; then if sed -e '1,/Menu:/d' %D/info/dir | grep -q '^[*] '; then true; else rm %D/info/dir; fi; fi
diff -2ruN rlytest.old/work/rlytest rlytest/work/rlytest
--- rlytest.old/work/rlytest	Wed Dec 31 19:00:00 1969
+++ rlytest/work/rlytest	Fri Jun 13 06:40:41 2003
@@ -0,0 +1,379 @@
+#!/usr/bin/perl
+#
+# $Id: rlytest,v 1.22 2001/10/22 22:02:48 chip Exp $
+#
+# $Log: rlytest,v $
+# Revision 1.22  2001/10/22 22:02:48  chip
+# updated message
+#
+# Revision 1.21  2001/10/22 19:57:38  chip
+# updated URLs
+#
+# Revision 1.20  2000/06/21 09:02:09  chip
+# Produce useful diagnostic if socket fails.
+# Thanks to Paul Ewing Jr. <ewing at ima.umn.edu>
+#
+# Revision 1.19  2000/06/11 06:21:49  chip
+# now uses exit status 2 to indicate successful relay submission
+# added $EX_RELAY_ACCEPTED $EX_RELAY_REJECTED $EX_PROGRAM_ERROR
+#
+# Revision 1.18  2000/04/04 08:25:32  chip
+# changed default domain from acme.com to example.com
+#
+# Revision 1.17  1999/08/20 07:11:54  chip
+# moved uid=0 check before calculate_fqdn is called (oof!)
+# thanks to Paul David Fardy <pdf at morgan.ucs.mun.ca> for catching that
+#
+# Revision 1.16  1999/05/25 15:51:57  chip
+# added $Root_check to avoid running as root
+# remove $! from socket creation failure, people were finding it confusing
+#
+#
+# rlytest - test mail host for third-party relay
+# (see POD documentation at end)
+#
+# Chip Rosenthal
+# Unicom Systems Development
+# <chip at unicom.com>
+#
+
+require 5.002;
+use strict;
+use Getopt::Std;
+use IO::Socket;	# warning - IO::Socket was an optional add-on prior to 5.004
+use Time::gmtime;
+use vars qw($Usage $Dflt_hostname $Dflt_domain $Root_check %Opts
+	$Target_host $Timeout $Hostname $Username $Comment
+	$Actual_sender $MailFrom_addr $RcptTo_addr $Mssg_body);
+
+$0 =~ s!.*/!!;
+$Usage = "usage: $0 [-f sender_addr] [-u recip_addr] [-c comment] [-t timeout] target_host";
+
+use vars qw($EX_RELAY_ACCEPTED $EX_RELAY_REJECTED $EX_PROGRAM_ERROR);
+$EX_RELAY_REJECTED = 0;
+$EX_RELAY_ACCEPTED = 2;
+$EX_PROGRAM_ERROR = 1;
+
+#
+# Host name configuration - Leave these commented out unless the
+# calculate_fqdn() routine is unable to calculate your FQDN (fully
+# qualified domain name) correctly.  You'll know if it fails, because
+# the script will bomb out bitching about the FQDN.  If this happens,
+# try setting $Dflt_domain to your domain.  Or, if you like, you
+# may hardwire $Dflt_hostname to a particular FQDN.
+#
+### $Dflt_domain = "example.com";
+### $Dflt_hostname = "dopey.example.com";
+
+#
+# This utility does not need to be run as root.  In fact, there is
+# a potential problem in doing so.  In the "calculate_fqdn" subroutine,
+# one of the ways it tries to obtain the host name is with "hostname -f".
+# While this works on some systems, on others it will attempt to change
+# the local hostname to "-f"!
+#
+$Root_check = 1;
+
+if ($Root_check && $> == 0) {
+	print STDERR q[
+You should not be running this as root!
+Recommend you abort and run as a nonprivileged user.
+Pausing 10 seconds.];
+	foreach $_ (1 .. 10) {
+		print STDERR ".";
+		sleep 1;
+	}
+	print STDERR "\n";
+}
+
+#
+# Unbuffered output.
+#
+autoflush STDOUT 1;
+
+#
+# Crack command line.
+#
+getopts('c:f:t:u:', \%Opts)
+	or die "$Usage";
+die "$Usage\n"
+	unless (@ARGV == 1);
+$Target_host = shift;
+
+#
+# Initialize parameters.
+#
+$Timeout = $Opts{'t'} || 60;
+$Hostname = calculate_fqdn()
+	or die "$0: cannot determine FQDN\n";
+$Username = $ENV{'LOGNAME'} || $ENV{'USER'} || die "$0: LOGNAME undefined\n";
+$Actual_sender = $Username . "\@" . $Hostname;
+$RcptTo_addr = $Opts{'u'} || $Actual_sender;
+$Comment = $Opts{'c'} . "\n"
+	if ($Opts{'c'});
+
+if ($Opts{'f'} ne "") {
+	$MailFrom_addr = $Opts{'f'};
+} elsif ($Target_host =~ /^\d+\.\d+\.\d+\.\d+$/) {
+	$MailFrom_addr = "nobody\@[${Target_host}]";
+} else {
+	$MailFrom_addr = "nobody\@${Target_host}";
+}
+
+#
+# Construct the test message.
+#
+$Mssg_body =
+	"To: $RcptTo_addr\n"
+	. "From: $MailFrom_addr\n"
+	. "Subject: test for susceptibility to third-party mail relay\n"
+	. "Date: " .  arpa_date(time()) . "\n"
+	. "Message-Id: <rlytest-" . time() . "-" . $$ . "\@$Hostname>\n"
+	. "Sender: $Actual_sender\n"
+	. qq[
+This message is a test probe, to ensure that your mail server is secured
+against third-party mail relay.  This is NOT an attempt to hack or
+crack your system, but just to ensure the system are secured against
+this common vulnerability.  This test usually is performed by a system
+administrator who is trying to determine the source of a spam email.
+
+A well-configured mail server should NOT relay third-party email.
+Otherwise, the server is subject to attack and hijack by Internet vandals
+and spammers.  For information on how to secure a mail server against
+third-party relay, visit <URL: http://mail-abuse.org/tsi/>.
+
+This probe was generated by the "rlytest" utility.  For more information,
+visit <URL: http://www.unicom.com/sw/rlytest/>.
+
+    Target host = $Target_host
+    Test performed by <$Actual_sender>
+
+If you have any concern about this test, please contact the person listed
+in the "test performed by" line above.
+
+${Comment}
+.
+];
+
+#
+# Connect and execute SMTP diaglog.
+#
+print "Connecting to $Target_host ...\n";
+my $sock = IO::Socket::INET->new(
+		Proto => "tcp",
+		PeerAddr => $Target_host,
+		PeerPort => "smtp(25)",
+		Timeout => $Timeout)
+	or die "$0: socket failed: cannot connect to $Target_host: $@\n";
+
+$SIG{'ALRM'} = sub { die "$0: timeout waiting for socket I/O\n"; };
+$sock->autoflush(1);
+read_response($sock);
+write_command($sock, "HELO $Hostname\n");
+write_command($sock, "MAIL FROM:<$MailFrom_addr>\n");
+write_command($sock, "RCPT TO:<$RcptTo_addr>\n");
+write_command($sock, "DATA\n");
+write_command($sock, $Mssg_body, "(message body)\n");
+my $code = write_command($sock, "QUIT\n");
+
+#
+# Dialog successful (which is bad -- that means the relay was accepted).
+#
+warn "$0: relay accepted - final response code $code\n";
+exit($EX_RELAY_ACCEPTED);
+
+
+#
+# usage: write_command($sock, $data_to_send[, $mssg_to_display])
+#
+sub write_command
+{
+	my $sock = shift;
+	my $data = shift;
+	my $mssg = shift || $data;
+	print ">>> $mssg";
+	$data =~ s/\n/\r\n/g;
+	alarm($Timeout);
+	$sock->print($data)
+		or die "$0: socket write failed [$!]\n";
+	alarm(0);
+	return read_response($sock);
+}
+
+
+#
+# usage: $response_code = read_response($sock);
+#
+sub read_response
+{
+	my $sock = shift;
+	my($code, $cont, $mssg);
+
+	do {
+		alarm($Timeout);
+		chop($_ = $sock->getline());
+		alarm(0);
+		($code, $cont, $mssg) = /(\d\d\d)(.)(.*)/;
+		print "<<< ", $_, "\n";
+	} while ($cont eq "-");
+	return $code
+		if ($code >= 200 && $code < 400);
+
+	alarm($Timeout);
+	$sock->print("QUIT\r\n");
+	alarm(0);
+	warn "$0: relay rejected - final response code $code\n";
+	exit($EX_RELAY_REJECTED);
+}
+
+
+#
+# usage: $hostname = calculate_fqdn();
+#
+sub calculate_fqdn
+{
+	my @trycmds = ("hostname", "hostname -f", "uname -n");
+	my $cmd;
+	my $hostname;
+
+	return $Dflt_hostname
+		if ($Dflt_hostname);
+
+	foreach $cmd (@trycmds) {
+		chop($hostname = `$cmd`);
+		return $hostname
+			if ($hostname =~ /\./);
+		return $hostname . "." . $Dflt_domain
+			if ($hostname && $Dflt_domain);
+	}
+
+	die "$0: cannot determine FQDN - please set \$Dflt_domain or \$Dflt_hostname\n"
+}
+
+
+#
+# usage: $date_header = arpa_date($secs_since_epoch)
+#
+sub arpa_date
+{
+	my $gm = gmtime(shift);
+	my @Day_name = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");
+	my @Month_name = (
+		"Jan", "Feb", "Mar", "Apr", "May", "Jun",
+		"Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
+
+	sprintf("%-3s, %02d %-3s %4d %02d:%02d:%02d GMT",
+		$Day_name[$gm->wday],
+		$gm->mday, $Month_name[$gm->mon], 1900+$gm->year,
+		$gm->hour, $gm->min, $gm->sec);
+
+}
+
+
+__END__
+
+=head1 NAME
+
+rlytest - test mail host for third-party relay
+
+=head1 SYNOPSIS
+
+B<rlytest>
+[B<-f> sender_addr]
+[B<-u> recip_addr]
+[B<-c> I<comment>]
+[B<-t> I<timeout>]
+I<target_host>
+
+=head1 DESCRIPTION
+
+The B<rlytest> utility performs a test on I<target_host> to determine
+whether it will relay third-party email.  It will try to relay an
+email message to yourself through that host.  A host that allows
+third-party relay is subject to attack by Internet vandals, and
+frequently is hijacked by spammers to relay massive amounts of junk
+email.  A host that allows third-party relay should be B<immediately>
+secured, disconnected, or shunned as a menace to the Internet.
+
+The following options are available:
+
+=over 4
+
+=item B<-f> I<sender_addr>
+
+Specifies the (C<MAIL FROM>) email address to use on the probe.
+By default, B<rlytest> tries to calculate an email address in the
+target domain.  This is to ensure that the host is not using simple
+(and easily defeated) envelope checks for anti-relay protection.
+
+=item B<-u> I<recip_addr>
+
+Specifies the (C<RCPT TO>) email address to use on the probe.  By
+default, B<rlytest> tries to calculate your email address and use
+that.  A host that is susceptible to relay will deliver a probe
+message to this address.
+
+=item B<-c> I<comment>
+
+Embed I<comment> in the body of the test message.  This may
+be useful, for instance, if you are doing some automatic testing
+and want to insert cookies into the messages.
+
+=item B<-t> I<timeout>
+
+Sets the timeout value (default is 60 seconds) for certain
+operations.
+
+=back
+
+If the remote host refused to relay the message, the program
+will terminate with a zero exit status dislay a message to
+I<stderr> similar to:
+
+  rlytest: relay rejected - status code 571
+
+If the message was accepted, the program will terminate with an
+exit status of 2 and display a message to I<stderr> similar to:
+
+  rlytest: relay accepted - status code 221
+
+Any other (non-zero) exit status indicates a program error, such as a
+bad hostname or host not resopnding.
+
+=head1 EXAMPLE
+
+Here is an example, showing a host that refuses third-party relay:
+
+  $ ./rlytest mail.example.dom
+  Connecting to mail.example.dom ...
+  <<< 220 mail.example.dom ready
+  >>> HELO garcon.unicom.com
+  <<< 250 Hello garcon.unicom.com, pleased to meet you
+  >>> MAIL FROM:<nobody at mail.example.dom>
+  <<< 250 <chip at garcon.unicom.com>... Sender ok
+  >>> RCPT TO:<chip at garcon.unicom.com>
+  <<< 550 <chip at garcon.unicom.com>... Relaying Denied
+  rlytest: relay rejected - status code 550
+
+=head1 BUGS
+
+There is no reliable and portable method to determine the local
+host's fully qualified domain name.  If the utility bombs out
+complaining about FQDN problems, read the "host name configuration"
+information near the top of the script.
+
+=head1 SEE ALSO
+
+mail(1),
+sendmail(8),
+smtpd(8)
+
+=head1 AUTHOR
+
+  Chip Rosenthal
+  Unicom Systems Development
+  <chip at unicom.com>
+
+  $Id: rlytest,v 1.22 2001/10/22 22:02:48 chip Exp $
+  See http://www.unicom.com/sw/#rlytest for latest version.
+
diff -2ruN rlytest.old/work/rlytest.1 rlytest/work/rlytest.1
--- rlytest.old/work/rlytest.1	Wed Dec 31 19:00:00 1969
+++ rlytest/work/rlytest.1	Fri Jun 13 06:40:41 2003
@@ -0,0 +1,303 @@
+.rn '' }`
+''' $RCSfile$$Revision$$Date$
+'''
+''' $Log$
+'''
+.de Sh
+.br
+.if t .Sp
+.ne 5
+.PP
+\fB\\$1\fR
+.PP
+..
+.de Sp
+.if t .sp .5v
+.if n .sp
+..
+.de Ip
+.br
+.ie \\n(.$>=3 .ne \\$3
+.el .ne 3
+.IP "\\$1" \\$2
+..
+.de Vb
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve
+.ft R
+
+.fi
+..
+'''
+'''
+'''     Set up \*(-- to give an unbreakable dash;
+'''     string Tr holds user defined translation string.
+'''     Bell System Logo is used as a dummy character.
+'''
+.tr \(*W-|\(bv\*(Tr
+.ie n \{\
+.ds -- \(*W-
+.ds PI pi
+.if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
+.if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
+.ds L" ""
+.ds R" ""
+'''   \*(M", \*(S", \*(N" and \*(T" are the equivalent of
+'''   \*(L" and \*(R", except that they are used on ".xx" lines,
+'''   such as .IP and .SH, which do another additional levels of
+'''   double-quote interpretation
+.ds M" """
+.ds S" """
+.ds N" """""
+.ds T" """""
+.ds L' '
+.ds R' '
+.ds M' '
+.ds S' '
+.ds N' '
+.ds T' '
+'br\}
+.el\{\
+.ds -- \(em\|
+.tr \*(Tr
+.ds L" ``
+.ds R" ''
+.ds M" ``
+.ds S" ''
+.ds N" ``
+.ds T" ''
+.ds L' `
+.ds R' '
+.ds M' `
+.ds S' '
+.ds N' `
+.ds T' '
+.ds PI \(*p
+'br\}
+.\"	If the F register is turned on, we'll generate
+.\"	index entries out stderr for the following things:
+.\"		TH	Title 
+.\"		SH	Header
+.\"		Sh	Subsection 
+.\"		Ip	Item
+.\"		X<>	Xref  (embedded
+.\"	Of course, you have to process the output yourself
+.\"	in some meaninful fashion.
+.if \nF \{
+.de IX
+.tm Index:\\$1\t\\n%\t"\\$2"
+..
+.nr % 0
+.rr F
+.\}
+.TH RLYTEST 1 "perl 5.005, patch 03" "13/Jun/2003" "User Contributed Perl Documentation"
+.UC
+.if n .hy 0
+.if n .na
+.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
+.de CQ          \" put $1 in typewriter font
+.ft CW
+'if n "\c
+'if t \\&\\$1\c
+'if n \\&\\$1\c
+'if n \&"
+\\&\\$2 \\$3 \\$4 \\$5 \\$6 \\$7
+'.ft R
+..
+.\" @(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2
+.	\" AM - accent mark definitions
+.bd B 3
+.	\" fudge factors for nroff and troff
+.if n \{\
+.	ds #H 0
+.	ds #V .8m
+.	ds #F .3m
+.	ds #[ \f1
+.	ds #] \fP
+.\}
+.if t \{\
+.	ds #H ((1u-(\\\\n(.fu%2u))*.13m)
+.	ds #V .6m
+.	ds #F 0
+.	ds #[ \&
+.	ds #] \&
+.\}
+.	\" simple accents for nroff and troff
+.if n \{\
+.	ds ' \&
+.	ds ` \&
+.	ds ^ \&
+.	ds , \&
+.	ds ~ ~
+.	ds ? ?
+.	ds ! !
+.	ds /
+.	ds q
+.\}
+.if t \{\
+.	ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
+.	ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
+.	ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
+.	ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
+.	ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
+.	ds ? \s-2c\h'-\w'c'u*7/10'\u\h'\*(#H'\zi\d\s+2\h'\w'c'u*8/10'
+.	ds ! \s-2\(or\s+2\h'-\w'\(or'u'\v'-.8m'.\v'.8m'
+.	ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
+.	ds q o\h'-\w'o'u*8/10'\s-4\v'.4m'\z\(*i\v'-.4m'\s+4\h'\w'o'u*8/10'
+.\}
+.	\" troff and (daisy-wheel) nroff accents
+.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
+.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
+.ds v \\k:\h'-(\\n(.wu*9/10-\*(#H)'\v'-\*(#V'\*(#[\s-4v\s0\v'\*(#V'\h'|\\n:u'\*(#]
+.ds _ \\k:\h'-(\\n(.wu*9/10-\*(#H+(\*(#F*2/3))'\v'-.4m'\z\(hy\v'.4m'\h'|\\n:u'
+.ds . \\k:\h'-(\\n(.wu*8/10)'\v'\*(#V*4/10'\z.\v'-\*(#V*4/10'\h'|\\n:u'
+.ds 3 \*(#[\v'.2m'\s-2\&3\s0\v'-.2m'\*(#]
+.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
+.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
+.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
+.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
+.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
+.ds ae a\h'-(\w'a'u*4/10)'e
+.ds Ae A\h'-(\w'A'u*4/10)'E
+.ds oe o\h'-(\w'o'u*4/10)'e
+.ds Oe O\h'-(\w'O'u*4/10)'E
+.	\" corrections for vroff
+.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
+.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
+.	\" for low resolution devices (crt and lpr)
+.if \n(.H>23 .if \n(.V>19 \
+\{\
+.	ds : e
+.	ds 8 ss
+.	ds v \h'-1'\o'\(aa\(ga'
+.	ds _ \h'-1'^
+.	ds . \h'-1'.
+.	ds 3 3
+.	ds o a
+.	ds d- d\h'-1'\(ga
+.	ds D- D\h'-1'\(hy
+.	ds th \o'bp'
+.	ds Th \o'LP'
+.	ds ae ae
+.	ds Ae AE
+.	ds oe oe
+.	ds Oe OE
+.\}
+.rm #[ #] #H #V #F C
+.SH "NAME"
+rlytest \- test mail host for third-party relay
+.SH "SYNOPSIS"
+\fBrlytest\fR
+[\fB\-f\fR sender_addr]
+[\fB\-u\fR recip_addr]
+[\fB\-c\fR \fIcomment\fR]
+[\fB\-t\fR \fItimeout\fR]
+\fItarget_host\fR
+.SH "DESCRIPTION"
+The \fBrlytest\fR utility performs a test on \fItarget_host\fR to determine
+whether it will relay third-party email.  It will try to relay an
+email message to yourself through that host.  A host that allows
+third-party relay is subject to attack by Internet vandals, and
+frequently is hijacked by spammers to relay massive amounts of junk
+email.  A host that allows third-party relay should be \fBimmediately\fR
+secured, disconnected, or shunned as a menace to the Internet.
+.PP
+The following options are available:
+.Ip "\fB\-f\fR \fIsender_addr\fR" 4
+Specifies the (\f(CWMAIL FROM\fR) email address to use on the probe.
+By default, \fBrlytest\fR tries to calculate an email address in the
+target domain.  This is to ensure that the host is not using simple
+(and easily defeated) envelope checks for anti-relay protection.
+.Ip "\fB\-u\fR \fIrecip_addr\fR" 4
+Specifies the (\f(CWRCPT TO\fR) email address to use on the probe.  By
+default, \fBrlytest\fR tries to calculate your email address and use
+that.  A host that is susceptible to relay will deliver a probe
+message to this address.
+.Ip "\fB\-c\fR \fIcomment\fR" 4
+Embed \fIcomment\fR in the body of the test message.  This may
+be useful, for instance, if you are doing some automatic testing
+and want to insert cookies into the messages.
+.Ip "\fB\-t\fR \fItimeout\fR" 4
+Sets the timeout value (default is 60 seconds) for certain
+operations.
+.PP
+If the remote host refused to relay the message, the program
+will terminate with a zero exit status dislay a message to
+\fIstderr\fR similar to:
+.PP
+.Vb 1
+\&  rlytest: relay rejected - status code 571
+.Ve
+If the message was accepted, the program will terminate with an
+exit status of 2 and display a message to \fIstderr\fR similar to:
+.PP
+.Vb 1
+\&  rlytest: relay accepted - status code 221
+.Ve
+Any other (non-zero) exit status indicates a program error, such as a
+bad hostname or host not resopnding.
+.SH "EXAMPLE"
+Here is an example, showing a host that refuses third-party relay:
+.PP
+.Vb 10
+\&  $ ./rlytest mail.example.dom
+\&  Connecting to mail.example.dom ...
+\&  <<< 220 mail.example.dom ready
+\&  >>> HELO garcon.unicom.com
+\&  <<< 250 Hello garcon.unicom.com, pleased to meet you
+\&  >>> MAIL FROM:<nobody at mail.example.dom>
+\&  <<< 250 <chip at garcon.unicom.com>... Sender ok
+\&  >>> RCPT TO:<chip at garcon.unicom.com>
+\&  <<< 550 <chip at garcon.unicom.com>... Relaying Denied
+\&  rlytest: relay rejected - status code 550
+.Ve
+.SH "BUGS"
+There is no reliable and portable method to determine the local
+host's fully qualified domain name.  If the utility bombs out
+complaining about FQDN problems, read the \*(L"host name configuration\*(R"
+information near the top of the script.
+.SH "SEE ALSO"
+\fImail\fR\|(1),
+\fIsendmail\fR\|(8),
+\fIsmtpd\fR\|(8)
+.SH "AUTHOR"
+.PP
+.Vb 3
+\&  Chip Rosenthal
+\&  Unicom Systems Development
+\&  <chip at unicom.com>
+.Ve
+.Vb 2
+\&  $Id: rlytest,v 1.22 2001/10/22 22:02:48 chip Exp $
+\&  See http://www.unicom.com/sw/#rlytest for latest version.
+.Ve
+
+.rn }` ''
+.IX Title "RLYTEST 1"
+.IX Name "rlytest - test mail host for third-party relay"
+
+.IX Header "NAME"
+
+.IX Header "SYNOPSIS"
+
+.IX Header "DESCRIPTION"
+
+.IX Item "\fB\-f\fR \fIsender_addr\fR"
+
+.IX Item "\fB\-u\fR \fIrecip_addr\fR"
+
+.IX Item "\fB\-c\fR \fIcomment\fR"
+
+.IX Item "\fB\-t\fR \fItimeout\fR"
+
+.IX Header "EXAMPLE"
+
+.IX Header "BUGS"
+
+.IX Header "SEE ALSO"
+
+.IX Header "AUTHOR"
+
>Release-Note:
>Audit-Trail:
>Unformatted:



More information about the freebsd-ports-bugs mailing list