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