Adcomplain is posted to alt.sources at the beginning of each month.
It can can also be retrieved from my web page:
http://www.rdrop.com/users/billmc
Tired of spam and other net abuse? Report it! Most service providers
terminate accounts used for such purposes.
Adcomplain is a tool for reporting inappropriate commercial e-mail and
usenet postings, as well as chain letters and "make money fast" postings.
It automatically analyzes the message, composes an abuse report, and mails
the report to the offender's internet service provider. The report is
displayed for your approval prior to mailing. Adcomplain can be invoked
from the command line or automatically from many news and mail readers.
Adcomplain runs under Unix, Windows-NT, and Windows-95. Adcomplain does
_not_ currently run on Macintosh systems. Macintosh users _might_ find
something suitable at:
http://www.compulink.co.uk/~net-services/spam/
You must have Perl installed on your system to run this. (Either perl
version, 4 or 5, will work.) Perl can be obtained at:
http://www.perl.com/
A csh version of adcomplain is also available. It is much slower but does
not require Perl. However, it is not being maintained--you must install
the Perl version to get the latest features. For more information, see:
http://www.rdrop.com/users/billmc
ALERT!!!
If you downloaded a copy of adcomplain from my web page during the month
of December, 1997, you need to download a new copy immediately. It
contained a bug that caused it to discard complaints, with no indication
of anything wrong.
This bug affects revision 2.79 through 2.87. Revision 2.87b and later
are fine, as are revision 2.78 and earlier. You can find out what
revision you have by searching your copy for lines containing the word
"Revision".
NEW:
Now runs on Windows 95 and Windows NT.
Runs much faster.
Uses improved method to send mail.
Spammers and exceptions lists have been updated.
NOTES
This is a significant revision to adcomplain. It now runs on Windows NT
4.0 and Windows 95. Perl is still required, even on these platforms.
Adcomplain no longer uses the Unix sendmail command in order to send its
correspondence, though a hook to allow a user-defined program is still
available. Instead, it will directly contact a mail transfer agent (MTA)
and converse directly with it. This is both faster and more portable.
The authors expect that this change in functionality may initially cause
difficulties in certain unforeseen cases; however, we feel that the overall
improvement in usefulness is worth the perturbation.
adcomplain.pl Revision 3.5
#!/bin/sh
# This is a shell archive (produced by shar 3.49)
# To extract the files from this archive, save it to a file, remove
# everything above the "!/bin/sh" line above, and type "sh file_name".
#
# made 02/28/1998 00:39 UTC by bill@tiktok
# Source directory /login/bill/src/usenet/adcomplain
#
# existing files will NOT be overwritten unless -c is specified
#
# This shar contains:
# length mode name
# ------ ---------- ------------------------------------------
# 175436 -rwxr-xr-x adcomplain.pl
#
# ============= adcomplain.pl ==============
if test -f 'adcomplain.pl' -a X"$1" != X"-c"; then
echo 'x - skipping adcomplain.pl (File already exists)'
else
echo 'x - extracting adcomplain.pl (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'adcomplain.pl' &&
#! /bin/sh -- # -*- perl -*-
# first line invokes sh. Some systems may need to refer to perl directly, i.e.:
X
#! /bin/perl
X
# But the first way is preferable, because we have a trick (below) that
# allows perl to be _anywhere_ in the user's path. The intent is to reduce
# the need to edit this file.
X
eval 'exec perl $0 ${1+"$@"}'
if 0; # tee hee! This is on a separate line, so /bin/sh never sees it.
X
#-----------------------------------------------
# DESCRIPTION
X
# Tired of spam and other net abuse? Report it! Most service providers
# terminate accounts used for such purposes.
X
# Adcomplain is a tool for reporting inappropriate commercial e-mail and
# Usenet postings, as well as chain letters and "make money fast" postings.
X
# It automatically analyzes the message, composes an abuse report, and mails
# the report to the offender's internet service provider. The report is
# displayed for your approval prior to mailing. Adcomplain can be invoked
# from the command line or automatically from many news and mail readers.
X
# Adcomplain runs under Unix, Windows-NT, and Windows-95. Adcomplain does
# _not_ currently run on Macintosh systems. Macintosh users _might_ find
# something suitable at:
# http://www.compulink.co.uk/~net-services/spam/
X
# You must have Perl installed on your system to run this. (Either perl
# version, 4 or 5, will work.) Perl can be obtained at: http://www.perl.com/
X
# adcomplain was created in the belief that a single concise message is the
# most appropriate way to complain. Mail bombing (e-mailing megabytes of
# useless data) and public flaming (replying on Usenet, causing your complaint
# to be duplicated on every machine in the network) are discouraged.
X
# The default letter meets ISP standards (such as those required by netcom) for
# abuse reports. The letter hopefully makes its point without wasting value
# computer or human bandwidth. It marks itself as being machine-generated, so
# that system administrators can quickly recognize its format and content.
X
# A third-party forwarding service called "abuse.net" is used for complaints to
# the offender's provider. This ensures that the best known complaint address
# is used. The first time you use abuse.net, you will receive a message asking
# you to register. See http://www.abuse.net for more information.
X
#-----------------------------------------------
# USAGE
# Pipe the Usenet posting or e-mail into this program. It may detect
# mail forgeries or other problems and ask you to confirm by pressing return.
# It will then compose the message and display it for approval before mailing.
# You have opportunities to edit or list the message, or to just abort.
X
# SYNOPSIS
# adcomplain [-b] [-c] [-f fname] [-m] [-p fname] [-q] [-s] [-u] [-v]
# [newsgroup]
X
# OPTIONS
# Any combination of options may be used together. For example, -c and
# -m may be used together to complain about a chain letter received via
# e-mail.
X
# You may supply a newsgroup name (or comma separated newsgroups list)
# as the last argument. If not supplied, the contents of the
# 'Newsgroups' header, if present, will be used.
X
# -b
# Batch mode (not recommended)
X
# -c
# Chain letter mode. Composes and mails a complaint about chain
# letters, such as Make Money Fast.
X
# -f fname
# Use the contents of the specified file as the complaint text.
# The contents of this file will have perl variables expanded before
# proceeding. Some useful ones are:
#
# $header_analysis -- list of header anomalies in the message
# $newsgroups -- news groups this was posted to
# $postmaster -- postmaster at the originator's site
X
# -m
# Force the input to be regarded as a mail message. This is not
# necessary in most instances; adcomplain will correctly infer whether the
# message is a mail or a Usenet message.
X
# -p fname
# Read the ad from given file. You _must_ use this option on
# Windows-NT and Windows-95 systems.
X
# -q
# Quiet mode. Doesn't ask any questions except whether to send the message.
X
# -s
# Don't append your .signature. Note that some mailers may do this anyway,
# but this at least prevents adcomplain from doing it.
X
# -u
# Don't resolve. Regard the message syntactically, don't try to confirm
# host names and domains. This is useful if you are behind a firewall
# and have absolutely no way to confirm the hostnames within the message.
X
# -v
# Verbose mode. Diagnostic messages will be printed.
X
# NOTE: the (undocumented) -t switch is a regression test mode, not for normal
# use.
X
#-----------------------------------------------
# ENVIRONMENT VARIABLES
# The following environment variables influence the operation:
X
# $EDITOR -- the editor to use to edit the message, if $VISIUAL is not
# defined. If not defined, the default is "vi" on Unix, "notepad" on
# win32.
X
# $PAGER -- The message is always displayed prior to mailing using this
# program. If $PAGER is not defined, the default is "more" on Unix,
# the internal pager on Windows-NT and Windows-95. You can specify the
# builtin pager by setting $PAGER to "builtin".
X
# $SIGNATURE -- name of a file that holds your signature. The default
# is $HOME/.signature. This may not be very useful if you are not on Unix.
X
# $VISUAL -- the editor to use to edit the message, when an editor is requested.
# If not defined, $EDITOR is used.
X
# $ADCOMPLAIN_DOMAINS is used to set a list of domain names that should _not_
# be construed as valid origination domains for spam.
X
# $ADCOMPLAIN_FROM will specify the "From:" address in the resulting complaint
# message. This is a convenience for individuals who use adcomplain in
# multiple mail domains but want to register with abuse.net only once.
# Most users on Windows-NT or Windows-95 should set this.
X
# $ADCOMPLAIN_HOSTS is a file that is searched before the regular
# gethostbyname() # and gethostbyaddr() functions are called. (This is
# mainly used by adcomplain's internal regression test suite.)
X
# $ADCOMPLAIN_OPTS is an additional list of switches that should be added to
# every invocation of adcomplain.
X
#-----------------------------------------------
# INSTALLATION
# You must have either perl 4.036 or perl 5.0 installed.
# Perl can be obtained at: http://www.perl.com/
X
# Installation on Unix Systems:
# -----------------------------
# Type "echo $PATH" to list the directories in your search path.
#
# Go to one of those directories and save this script in a file named
# "adcomplain".
#
# Examine the Configuration Section and make sure it is correct for your
# system.
#
# Type "chmod +x adcomplain" to make it executable.
#
# Type "rehash" to add it to the search path.
#
# To test, send an e-mail message to yourself, save the message in a
# file, and type "adcomplain <file", where "file" is the file in which
# you saved the message.
X
# There are reports that the complex "#!" exec-line causes trouble on some
# primitive BSD systems. You may have to find perl (try "/bin/which perl"
# "/usr/bin/which perl", or "type perl") and modify the first line per the
# comments at the front of this file.
X
# Installation on Windows-NT and Windows-95 Systems:
# --------------------------------------------------
# Save this script in a convenient place on your system.
X
# Make sure your system is configured to run TCP/IP.
X
# If you are running on Windows 95, you _must_ set the following
# environment variables:
# ADCOMPLAIN_FROM -- your return e-mail address
# COMPUTERNAME -- the name of your host, as used in TCP/IP
X
# You can either put a line like
# $ENV{"this"} = "that";
# in the configuration file, or put "set" commands in your autoexec file
# and reboot. Your pick.
X
# Examine the configuration section carefully and adjust to taste. Note
# that you _must_ set $mailhost, unless you've actually bought and installed
# a sendmail program on your machine.
X
# To test, send an e-mail message to yourself, save the message in a
# file, and type "adcomplain -p file", where "file" is the file in which
# you saved the message.
X
#-----------------------------------------------
# NEWSREADER CONFIGURATION
X
# =================
# rn, trn, and strn:
X
# Put the following in your ~/.rnmac file to map adcomplain to the 'a' key:
#
# a %(%m=[pa]?|adcomplain %C\n:a)
#
# In addition, rn users can complain about chain letters by mapping the
# 'A' key as follows:
#
# A %(%m=[pa]?|adcomplain -c\n:A)
#
# rn users can also customize the message based on the current newsgroup
# by using adcomplain's -f mode as shown in the following example:
#
# Z %(%m=[pa]?%(%C=aaa.forsale?|adcomplain -f aaa_complaint\n:%(%C=bbb.forsale?|adcomplain -f bbb_complaint\n:%(%C=ccc.forsale?|adcomplain -f ccc_complaint\n:%(%C=ddd.forsale?|adcomplain -f ddd_complaint\n:Z)))))
#
# When 'Z' is pressed, the above macro checks the newsgroup name, and if
# it matches one of four choices (aaa.forsale, bbb.forsale, ccc.forsale,
# ddd.forsale), uses a complaint message specific to that newsgroup.
# You can use it to complain about foreign postings in local newsgroups,
# for example (e.g., "aaa.forsale is for items for sale in the Podunk
# area.")
X
# =================
# nn:
X
# Put the following in your ~/.nn/init file to map adcomplain
# to ctrl-A and chain mail complain to ctrl-B:
#
# map both ^A (
# :!! cat /dev/null > /tmp/junk$(USER)
# save-full "//tmp/junk$(USER)"
# :! echo; adcomplain $G < /tmp/junk$(USER)
# :!! rm -rf /tmp/junk$(USER)
# )
# map both ^B (
# :!! cat /dev/null > /tmp/junk$(USER)
# save-full "//tmp/junk$(USER)"
# :! echo; adcomplain -c $G < /tmp/junk$(USER)
# :!! rm -rf /tmp/junk$(USER)
# )
#
X
# =================
# tin:
X
# Type "|" at the article level to pipe the article into
# adcomplain. Type "adcomplain" when it asks for the command name.
X
# =================
# SLRN newsreader (thanks to Ralf Hildebrandt <R.Hild...@tu-bs.de>)
X
# Put an additional line in the ~/.slrnrc :
# interpret ".slrn.sl"
#
# The file ~/.slrn.sl contains:
#
# define pipe_to_adcomplain ()
# {
# pipe_article ("adcomplain -q");
# }
# definekey ("pipe_to_adcomplain", "S", "article");
#
# This binds the key "S" to adcomplain -q "article".
X
#-----------------------------------------------
# BACKGROUND, CREDITS, and BUG REPORTING
X
# adcomplain is the brainchild of "Bill McFadden" bil...@agora.rdrop.com,
# who wrote it originally in csh (!!!).
X
# "D. Jason Penney" <ja...@gemstone.com> transcribed it to run in perl,
# significantly augmented the header processing, and added domain name
# verification.
X
# Acknowledgements and thanks also go out to:
# "Andrey A. Chernov" <ac...@nietzsche.net>
# "Martin Ward" <Marti...@durham.ac.uk>
# "Wm" <wm_...@bigfoot.com>
# "Wolfgang Weisselberg" <wei...@ph-cip.Uni-Koeln.DE>
X
# The latest version of this file is available at:
# http://www.rdrop.com/users/billmc
X
# Please mail ideas and bug reports to
# bil...@agora.rdrop.com or ja...@gemstone.com.
X
# Be sure to include the version number and a test case in your bug report.
X
# $Id: adcomplain.pl,v 3.5 1998/02/27 22:59:30 jason Exp $
#-----------------------------------------------
X
#-----------------------------------------------
# CONFIGURATION SECTION
#-----------------------------------------------
X
# this section lets you choose the default recipient(s) of the complaint
# $recipient = 1; # ($complain_to_only) only to the authorities;
# $recipient = 2; # ($poster_only) only to the poster
# $recipient = 3; # ($poster_and_complain_to) both
$recipient = 1; # ($complain_to_only) only to the authorities;
X
# Modify this if you want a copy of the complaint sent to someone else
$cc = ""; # ??? Dubious usefulness, should be changed
X
# comment this to include a copy of the posting every time.
# (ordinarily this is not done unless you choose to notify provider)
$noinclude = 1;
X
# comment this if your mailer automatically adds your .signature
# (otherwise, adcomplain adds it unless -s is specified).
$addsig = 1;
X
# this is the default name of the file to use for the complaint text
# if the file name is empty, the default text will be used. Override
# with the "-f <filename>" switch.
$complaintFile = "";
X
# Specify the host running sendmail by which to deliver your complaint.
# This is not used if $mailscript is set
# Default: your current host
$mailhost = "";
#$mailhost = "servio";
X
# Specify a script to run that will send the mail for you. If this is
# set, the script is invoked instead of contacting a sendmail daemon directly.
# It takes two arguments:
# 1. The name of a file to send. It contains all of the sendmail headers,
# so the program will have to use or modify them appropriately.
# 2. "batch" or "interactive", in case the script wants to make
# different UI decisions
# $mailscript = "/usr/lib/sendmail -t <";
X
# this is a list of domain names for your system (e.g., "compuserve.com")
# Names in this list are considered "friendly". Including your own system
# will prevent adcomplain from sending complaints to your home domain.
#
# It may also be desirable if your domain has multiple names, or if you
# regularly get mail forwarded from another domain.
#
# if the ADCOMPLAIN_DOMAINS environment variable is set, it will be read
# as a space-delimited list of domains to use and be added to the default list.
#
# an example: @mydomains = ("gemstone.com", "slc.com");
@mydomains = ();
X
#-----------------------------------------------
# NO USER SERVICEABLE PARTS INSIDE
#-----------------------------------------------
X
# parse command line options
&initialize;
X
$junk = $ENV{"ADCOMPLAIN_OPTS"};
if (defined($junk) && $junk ne "") {
X @junk = split(/\s/, $junk);
X # push(@ARGV, @junk);
X unshift(@ARGV, @junk); # make sure that non-dash opts stay at end
X }
&Getopts('bcf:hmp:qstuv');
# -t undocumented
if ((defined($opt_h) && $opt_h) || $opt_err) {
X print "Usage: $0 [-b] [-c] [-f blurbfile] [-p infile] [-hmqv] [newsgroup]\n";
X print " -b -- batch mode (not recommended)\n";
X print " -c -- chain letter\n";
X print " -f -- text to use instead of standard blurb\n";
X print " -h -- this message\n";
X print " -m -- force input to be regarded as a mail message\n";
X print " -p -- read the ad from given file\n";
X print " -u -- Don't attempt to use gethostbyaddr name resolution\n";
X print " -q -- ask no unnecessary questions\n";
X print " -s -- Omit .signature from resulting letter.\n";
X print " -v -- verbose\n";
X exit 0;
X }
X
$batchmode = 0;
$batchmode = 1 if defined($opt_b) && $opt_b;
$chainmode = 0;
$chainmode = 1 if defined($opt_c) && $opt_c;
$complaintFile = $opt_f if (defined($opt_f) && $opt_f ne "");
$mailmode = 0; $mailmode = 1 if defined($opt_m) && $opt_m;
$quiet = 0; $quiet = 1 if defined($opt_q) && $opt_q;
$omit_signature = 0; $omit_signature = 1 if defined($opt_s) && $opt_s;
$dont_resolve = 0; $dont_resolve = 1 if defined($opt_u) && $opt_u;
$verbose = 0; $verbose = 1 if defined($opt_v) && $opt_v;
X
# Resolve conflicting modes
if (defined($opt_t) && $opt_t) { # test mode
X $quiet = 0;
X $verbose = 1; # print traces
X $testMode = 1;# quits without mailing
X }
X
$junk = $ENV{"ADCOMPLAIN_DOMAINS"};
if (defined($junk) && $junk ne "") {
X @junk = split(/\s/, $junk);
X push(@mydomains, @junk);
X for ($i = 0; $i < @mydomains; $i ++) {
X $mydomains[$i] = &find_site($mydomains[$i]);
X }
X }
if (@mydomains != 0 && $verbose) {
X print "adcomplain: home domains: ";
X for (@mydomains) {
X print "$_ ";
X }
X print "\n";
X }
X
## copy original Usenet posting from stdin
if ($opt_p) {
X open(MSG, "<$opt_p") || die "cannot open $opt_p: $!";
X @original = <MSG>;
X close MSG;
X }
elsif ($os_kind eq "unix") {
X @original = <STDIN>;
X if (!$batchmode) {
X open(STDIN, $CONSOLE) || die "cannot reopen tty"; # UNIX dependency...
X }
X }
elsif ($os_kind eq "winnt" || $os_kind eq "win32") {
X die "You must use -p on Windows" unless $opt_p ne "";
X }
else {
X die "Don't know how to scarf stdin and reset console on this os ($os_kind)";
X }
X
&parse_headers; # does most of the work
&check_hosts;
X
for (sort(keys(%hosts_to_ips))) {
X $junk = $hosts_to_ips{$_};
X next if $junk ne "";
X $header_analysis .= "${bullet}I cannot find the IP of $_.\n\n";
X }
for (sort(keys(%ips_to_hosts))) {
X $junk = $ips_to_hosts{$_};
X next if $junk ne "";
X $header_analysis .= "${bullet}I cannot convert IP \"$_\" to a host name.\n\n";
X }
X
# Make the list of found spammers
$spammer_domain = "";
if (@spammer_list > 0) {
X # sort and unique the list
X @spammer_list = sort(@spammer_list);
X for ($i = 0; $i < $#spammer_list;) {
X if ($spammer_list[$i] eq $spammer_list[$i + 1]) {
X @spammer_list = splice(@spammer_list, $i + 1, 1);
X next; # reprocess this element
X }
X $i ++;
X }
X
X # prettyprint the list
X $spammer_domain = "";
X for ($i = 0; $i < @spammer_list; $i ++) {
X $each = $spammer_list[$i];
X $spammer_domain .= ", "
X if $spammer_domain ne "" && @spammer_domain ne 2;
X $spammer_domain .= " and " if $#spammer_list != 0 && $i == $#spammer_list;
X $spammer_domain .= "\"$each\"";
X }
X
X $header_analysis .= "${bullet}Spam host(s) were found in the headers: ";
X $header_analysis .= "$spammer_domain.\n\n";
X }
X
if (!$batchmode) {
X if ($header_analysis ne "") {
X $poster = "";
X $junk = &fmt($header_analysis, 72);
X print "adcomplain: header analysis:\n";
X print "----------------\n";
X print "$junk";
X print "----------------\n";
X }
X if ($verbose || $header_analysis ne "") {
X print "\nSummary of Potential Addressees: (\"$site\" recommended)\n";
X for (sort(keys(%available_hosts))) {
X printf " %25s %s\n", $_, $available_hosts{$_};
X }
X }
X }
X
# Limit the options
if ($complain_to eq "" && $poster eq "") {
X if ($batchmode) {
X print "ERROR: adcomplain did not detect a valid recipient.\n";
X exit 1;
X }
X else {
X print "ERROR: no valid recipients; edit text to correct before sending.\n";
X }
X }
elsif ($complain_to eq "") {
X $recipient = $poster_only;
X }
elsif ($poster eq "") {
X $recipient = $complain_to_only;
X }
X
if ($testMode) {
X print "TEST MODE: early exit\n";
X exit 0;
X }
X
# Make sure critical messages are seen
if ($quiet || $batchmode) {
X }
elsif ($poster eq "" || $complain_to eq "" || $header_analysis ne "") {
X print "Press enter to continue.... ";
X $ans = <STDIN>;
X }
X
## find out where to send message
if ($batchmode || $quiet) {
X }
elsif ($poster ne "" && $complain_to ne "") {
X print "Send to:\n";
X print " 1 = $complain_to\n";
X print " 2 = $poster\n";
X print " 3 = both\n";
X print " 4 = <abort>\n";
X $ans = &get_answer("Send to whom?", $recipient);
X if ($ans == 4) {
X print "aborted\n";
X exit 0;
X }
X $recipient = $ans if $ans ne "" && $ans >= 1 && $ans <= 3;
X }
X
$response = &compose_message;
X
## include copy of posting if needed
if (!$noinclude || $recipient ne $poster_only) {
X $response .= "\n--------forwarded message--------\n";
X for (@original) {
X $response .= $_;
X }
X $response .= "-----end of forwarded message-----\n\n";
X }
X
## append signature if needed
$siggie = $ENV{"SIGNATURE"};
if (!defined($siggie) || $siggie eq "") {
X $siggie = $ENV{"HOME"};
X $siggie .= "/.signature" if defined($siggie) && $siggie ne "";
X }
X
if (!$omit_signature && $addsig && defined($siggie) && -f $siggie) {
X if (!open(TEXTFILE, $siggie)) {
X print "adcomplain: cannot open $siggie: $!\n";
X }
X else {
X $response .= "-- \n";
X @text = <TEXTFILE>;
X # in case siggie already has the delim....
X shift(@text) if $text[0] eq "-- \n" || $text[0] eq "--\n";
X for (@text) {
X $response .= $_;
X }
X close TEXTFILE;
X @text = (); # garbage collection
X }
X }
X
## prepend message header
$header = "";
X
{ # Add RFC-822 "Date:" header
X local ($Date);
X local ($sec,$min,$hour,$mday,$mon,$year,$wday,$junk) = gmtime(time);
X
X $junk = sprintf("%02d:%02d:%02d", $hour, $min, $sec);
X $mday = sprintf("%02d", $mday);
X $mon = $monthNames[$mon];
X $year += 1900;
X $wday = $wdayNames[$wday];
X
X # TO DO: we could actually put the time zone in. For now, use GMT
X $Date = "$wday, $mday $mon $year $junk +0000 (GMT)";
X $header .= "Date: $Date\n";
}
X
# Add "From:"
$header .= "From: $from\n";
X
# who is it to?
if ($recipient == $complain_to_only) {
X $header .= "To: $complain_to\n";
X }
else {
X $header .= "To: $poster\n";
X }
X
# and who gets copies?
if ($recipient == $poster_and_complain_to) {
X $cc = ", $cc" if $cc ne "";
X $cc = "$complain_to$cc";
X }
$header .= "Cc: $cc\n" if $cc ne "";
$subject = "no subject" if $subject eq "";
$header .= "Subject: ";
if ($recipient == $complain_to_only) {
X $header .= "Abuse report: ";
X }
else {
X $header .= "Re: your ";
X }
if ($mailmode) {
X $header .= "email ";
X }
else {
X $header .= "Usenet article ";
X }
$header .= "titled \"$subject\"\n";
$header .= "\n"; # RFC822 end of headers
$response = $header . $response;
X
## Finally, place a copy of the message on the disk
open(TEXTFILE, ">$tempname") || die "cannot open $tempname";
printf TEXTFILE "%s", $response;
close TEXTFILE;
X
if (!$batchmode) {
X ## print copy of message on terminal
X print "\n";
X &moref($tempname);
X }
X
if ($batchmode) {
X $ok = &send_to_list($from, $send_to, $tempname);
X unlink $tempname;
X exit 1 if !$ok;
X }
else {
X ## send, abort, edit, or list the message
X for (;;) {
X print "\n";
X $ans = &get_answer("Send, abort, edit, or list (s/a/e/l)?", "a");
X if ($ans =~ /s.*/ || $ans =~ /y.*/) {
X # re-extract the addressee from the body
X open(F, "<$tempname") || die "temp file $tempname has disappeared!";
X local(@junk) = <F>;
X close F;
X $send_to = $cc_to = "";
X foreach $each (@junk) {
X last if $each =~ /^$/; # end of headers
X if ($each =~ /^To: (.*)/i) {
X $send_to = $1;
X }
X elsif ($each =~ /^Cc: (.*)/i) {
X $cc_to = $1;
X }
X }
X if ($send_to eq "") {
X print "no addressee! re-edit and continue\n";
X next;
X }
X
X $ok = &send_to_list($from, $send_to, $tempname);
X next if !$ok;
X print "sent to $send_to\n";
X
X if ($cc_to ne "") {
X $ok = &send_to_list($from, $cc_to, $tempname);
X print "WARNING: cc to $cc_to failed\n" if !$ok;
X }
X last;
X }
X elsif ($ans =~ /a.*/) {
X print "aborted\n";
X last;
X }
X elsif ($ans =~ /e.*/) {
X system "$editor $tempname <$CONSOLE";
X }
X elsif ($ans =~ /l.*/) {
X &moref($tempname);
X }
X else {
X print "what?\n";
X }
X } # for
X }
X
print "\n";
unlink $tempname;
#close STDIN;
Xexit 0;
X
sub rfc822_chop {
X local($text) = @_;
X
X for (;;) {
X return $text if $text !~ /[\n\r]$/;
X chop($text);
X }
X }
X
# Exchange a line of text with an SMTP daemon
sub send_line {
X local($text) = @_;
X local($response);
X
X print S "$text\r\n"; # RFC-821, ^M^J is end of line!
X $response = <S>;
X $response = &rfc822_chop($response);
X return $response if $response =~ /^500/;
X print "do_sendmail: response \"$response\"\n" if $verbose;
X return "";
X }
X
# Relay a mail message through an SMTP daemon.
# Note: this is for use with perl-4. I _know_ perl-5 has better routines.
sub do_sendmail {
X local($from, $send_to, $body) = @_;
X
X local($sockaddr) = 'S n a4 x8'; # magic spell to pack an inet_addr
X local($name, $aliases, $type, $len, $thisaddr, $thataddr);
X local($local_inetaddr, $remote_inetaddr);
X local($targetPort) = "smtp"; # or 25, world-wide standard
X local($response);
X
X if (defined($mailscript) && $mailscript ne "") {
X $name = "$mailscript $body ";
X if ($batchmode) {
X $name .= "batch";
X }
X else {
X $name .= "interactive";
X }
X print "mail command: $name\n" if $verbose;
X $response = system($name) >> 256;
X if ($response != 0) {
X print "mail command \"$name\" failed!\n";
X return 0;
X }
X return 1;
X }
X
X ($name, $aliases, $targetPort) = getservbyname($targetPort, 'tcp')
X unless $targetPort =~ /^\d+$/;
X
X # Fill out local side of connection
X ($name, $aliases, $type, $len, $thisaddr) = gethostbyname($local_hostname);
X
X # Fill out remote side
X if ($mailhost =~ /\d+\.\d+\.\d+\.\d+/) {
X local($a, $b, $c, $d) = split(/\./, $mailhost);
X $thataddr = pack("C4", $a, $b, $c, $d);
X }
X else {
X ($name, $aliases, $type, $len, $thataddr) = gethostbyname($mailhost);
X if (!defined($name) || $name eq "") {
X # $! doesn't have error return here. Sigh.
X print STDERR "cannot find \"$mailhost\" (gethostbyname)\n";
X return 0;
X }
X }
X
X $local_inetaddr = pack($sockaddr, $AF_INET, 0, $thisaddr);
X $remote_inetaddr = pack($sockaddr, $AF_INET, $targetPort, $thataddr);
X
X #MAKE the socket filehandle.
X if ( ! socket( S, $AF_INET, $SOCK_STREAM, 0)) {
X print STDERR "socket() failure: $!\n";
X return 0;
X }
X
X #GIVE the socket an address.
X if (! bind(S, $local_inetaddr)) {
X print STDERR "bind() failure: $!\n";
X return 0;
X }
X
X #Call up the server.
X if (! connect( S, $remote_inetaddr)) {
X print STDERR "unable to connect() to \"$mailhost\": $!\n";
X return 0;
X }
X print "do_sendmail: contacted \"$mailhost\"\n" if $verbose;
X
X #Set socket to be command buffered.
X select(S); $| =1; select(STDOUT);
X
X # sometimes you have to be aggressive to get the daemon to talk?
X # print S "\r\nHELO $local_hostname\r\n";
X # $response = <S>;
X # print "do_sendmail: throw-away response \"$response\"\n" if $verbose;
X
X # Start the dance....
X print S "HELO $local_hostname\r\n";
X
X # Try to get the initial acknowledgement. Some SMTP servers are silent
X # until you speak first. Others speak without being prompted. The best way
X # out of this ambiguity is to just eat until we see the banner. We
X # do _not_ check for 500 errors here.
X for (;;) {
X $response = <S>;
X $response = &rfc822_chop($response);
X print "do_sendmail: initial response \"$response\"\n" if $verbose;
X last if $response =~ /^220 /;
X last if $response =~ /^250 /;
X last if $response =~ /^SMTP/;
X }
X
X $response = &send_line("MAIL FROM: <$from>");
X if ($response ne "") {
X print "do_sendmail: error(MAIL FROM) \"$response\" from sendmail\n";
X close S;
X return 0;
X }
X
X $response = &send_line("RCPT TO: $send_to");
X if ($response ne "") {
X print "do_sendmail: error(RCPT TO) \"$response\" from sendmail\n";
X close S;
X return 0;
X }
X
X $response = &send_line("DATA");
X if ($response ne "") {
X print "do_sendmail: error(DATA) \"$response\" from sendmail\n";
X close S;
X return 0;
X }
X
X if (!open(F, "<$body")) {
X print "do_sendmail: cannot open $body\n";
X close S;
X return 0;
X }
X for (;;) {
X $body = <F>;
X last if !defined($body);
X $body = &rfc822_chop($body); # put our _own_ line terminator on it
X $body = ".$body" if $body =~ /^\..*/; # rfc821 sec. 4.5.2 transparency
X print S "$body\r\n";
X }
X close F;
X
X $response = &send_line(".");
X if ($response ne "") {
X print "do_sendmail: error(final) \"$response\" from sendmail\n";
X close S;
X return 0;
X }
X
X $response = &send_line("QUIT");
X if ($response ne "") {
X print "do_sendmail: error(QUIT) \"$response\" from sendmail\n";
X close S;
X return 0;
X }
X close S;
X
X return 1;
X }
X
sub send_to_list {
X local($from, $send_to, $body) = @_;
X local($ok, $each);
X local(@list) = split(/[ \t\n,]+/, $send_to);
X
X $ok = 1;
X foreach $each (@list) {
X print "sending from \"$from\" to \"$each\"\n" if $verbose;
X $ok = &do_sendmail($from, $each, $body) && $ok;
X }
X
X return $ok;
X }
X
#-----------------------------------------------
;# getopts.pl - a better getopt.pl
X
;# Usage:
;# do Getopts('a:bc'); # -a takes arg. -b & -c not. Sets opt_* as a
;# # side effect.
;# $opt_err set nonzero in case of error.
X
sub Getopts {
X local($optlist) = @_;
X local(@args, $_, $first, $rest);
X local(@new_argv, @unused_argv);
X local(@active_argv) = ();
X
X # Gather up the argv's that we should be examining
X for (;;) {
X last if !@ARGV;
X $each = shift(@ARGV);
X last if ($each eq "--"); # POSIX convention
X push(@active_argv, $each);
X }
X @unused_argv = @ARGV; # remaining args unprocessed
X @new_argv = ();
X
X $opt_err = 0;
X @args = split(/ */, $optlist);
X for (;;) { # process argv
X last if !@active_argv;
X
X if (($_ = $active_argv[0]) !~ /^-(.)(.*)/) {
X # Allow non-switch args, as in gnu getopt
X push(@new_argv, $active_argv[0]);
X shift(@active_argv);
X next;
X }
X ($first,$rest) = ($1,$2);
X
X $pos = index($optlist, $first);
X if ($pos < 0) {
X print STDERR "Unknown option: $first\n";
X ++$opt_err;
X if($rest ne '') {
X $active_argv[0] = "-$rest";
X }
X else {
X shift(@active_argv);
X }
X next;
X }
X
X if (!defined($args[$pos + 1]) ||
X $args[$pos + 1] ne ':') { # simple switch argument
X eval "\$opt_$first = 1";
X if ($rest eq '') {
X shift(@active_argv);
X }
X else {
X $active_argv[0] = "-$rest";
X }
X next;
X }
X
X # switch takes argument
X if ($rest ne '') {
X eval "\$opt_$first = \"$rest\"";
X shift(@active_argv);
X next;
X }
X
X shift(@active_argv);
X if ($rest eq '') { # argument is $active_argv[0]
X if (!@active_argv) {
X print STDERR "-$first: argument missing\n";
X $opt_err ++;
X last;
X }
X $rest = shift(@active_argv);
X if ($rest eq "--") {
X print STDERR "-$first: argument missing\n";
X $opt_err ++;
X last;
X }
X } # argument is $active_argv[0]
X eval "\$opt_$first = \$rest;";
X } # process argv
X
X # Remaining args are left for caller...
X @ARGV = (@new_argv, @unused_argv);;
} # Getopts
X
#-----------------------------------------------
# Find the first line that matches the given header and return it.
sub extract_header {
X local($pattern) = @_;
X local($result);
X
X $result = "";
X for (@original) {
X if ($_ =~ /$pattern/i) { # RFC-822 says case-independent
X $result = $_;
X chop($result);
X $result =~ s/$pattern\s*(.*)/$1/i;
X last;
X }
X last if length($_) == 1; # RFC-822: end of headers at first blank line
X }
X return $result;
} # extract_header
X
#-----------------------------------------------
# Return true if the given pattern is an inet address, e.g. "192.83.233,4"
sub is_inet_addr {
X local ($pat) = @_;
X
X return 0 unless $pat =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/;
X return 0 if $1 > 255;
X return 0 if $2 > 255;
X return 0 if $3 > 255;
X return 0 if $4 > 255;
X return 1;
X }
X
#-----------------------------------------------
# return the connecting SMTP agent's name for itself
sub helo_name {
X local ($text) = @_;
X local ($probe);
X
X return "" unless $text =~ /.*from\s*[\w\.-]+.*/;
X ($probe = $text) =~ s/.*from\s*([\w\.-]+).*/$1/; # get first word
X
X $probe =~ s/^\((.*)\).*/$1/; # turn (host) into host
X $probe =~ s/(.*)\(.*\).*/$1/; # turn host(inet_addr) into host
X $probe =~ s/^(\S+)\s+.*/$1/; # get first word
X $probe = &good_hostname($probe, 0); # don't require this name to exist
X return "" if $probe eq "";
X
X return $probe;
X }
X
#-----------------------------------------------
# Return name of recipient machine ("by" clause)
sub by_name {
X local ($text) = @_;
X local ($probe);
X
X return "" unless $text =~ /.*by\s+([\w\.-]+).*/;
X $probe = &good_hostname($1, 0);
X return $probe;
X }
X
#-----------------------------------------------
# Return (name, inet_addr) of peer name out of received header if they exist
sub received_peer_name {
X local ($text) = @_;
X local ($probe, $probe2);
X local ($peer_name, $inet_addr);
X
X return ("", "") unless $text =~ /.*from\s*[^(]*\([^)]*\)/;
X
X $probe = $text;
X
X # a _very_ thorny problem. Extract the from-clause (stuff between parens).
X # Ignore any by-clause.
X if ($probe =~ /\(peer crosschecked as: (.*)\)/) {
X # new stuff from uunet, yay! Sep '97, they're finally hitting back.
X $probe = $1;
X }
X else {
X $probe =~ s/.*\bfrom\s+(.*)\s+by\s.*/$1/; # by-clause after from-clause
X $probe =~ s/.*\bby\s+.*\s+from\s+(.*)/$1/; # from-clause after by-clause
X return "" unless $probe =~ /[^(]*\(([^)]*)\).*/; # must have parens here.
X $probe = $1; # stuff between parens
X }
X
X $inet_addr = $probe;
X $probe =~ s/\s*(\S+).*/$1/; # grab first word
X return ("", "") if $probe =~ /.*smail.*/i; # strange smail header
X return ("", "") if $probe =~ /.*smtp.*/i; # strange smtpd header
X return ("", "") if $probe =~ /^\d\.\d/; # strange sendmail header
X
X # Get the internet address.
X $inet_addr =~ s/^[^[]*\[(.*)\]/$1/;
X $inet_addr = "" if !&is_inet_addr($inet_addr);
X
X $probe =~ s/^([^[]*)\[.*\]/$1/; # ignore bracketed inet address
X if (&is_inet_addr($probe)) { # mailhost was as puzzled as we are
X $inet_addr = $probe;
X $probe = "";
X }
X
X $probe = &good_hostname($probe, 1);
X if ($probe eq "localhost" || $inet_addr eq "127.0.0.1") {
X $probe = $inet_addr = "";
X }
X return ($probe, $inet_addr);
X }
X
#-----------------------------------------------
sub is_spammer { # standard binary search
X local ($name) = @_;
X local ($site, $u, $l, $i, $pat);
X
X return 0 if $name eq "";
X $name =~ y/A-Z/a-z/; # canonicalize to lower case
X $site = &find_site($name); # site, not host.
X $l = 0;
X $u = $#SPAMMERS;
X for (;;) {
X return 0 if $u < $l;
X $i = int(($l + $u) / 2);
X
X # End if a pattern match is successful
X $pat = $SPAMMERS[$i];
X $pat =~ s/(\W)/\\$1/g; # remove special characters
X $pat = "\\b$pat\\b";
X if ($site =~ /$pat/i) {
X print "found spammer \"$name\".\n" if $verbose;
X push (@spammer_list, $name);
X return 1;
X }
X
X if ($site lt $SPAMMERS[$i]) {
X $u = $i - 1;
X }
X elsif ($site gt $SPAMMERS[$i]) {
X $l = $i + 1;
X }
X else {
X die "internal error in is_spammer(\"$name\")";
X }
X }
}
X
#-----------------------------------------------
# Return 1 if arg begins with a valid month.
sub is_month {
X local ($text) = @_;
X local ($probe, $each, $result);
X
X ($probe = $text) =~ s/^\s*(\S\S\S)\s+.*/$1/;
X for (@monthNames) {
X return 1 if $_ =~ /$probe/i;
X }
X return 0;
}
X
sub is_day {
X local ($text) = @_;
X local ($probe, $result);
X
X ($probe = $text) =~ s/^\s*(\S\S\S).*/$1/;
X $probe =~ s/(\W)/\\$1/g; # remove special characters
X for (@wdayNames) {
X return 1 if $_ =~ /$probe/i;
X }
X return 0;
X }
X
#-----------------------------------------------
# Is time zone believable?
sub zone_check {
X local ($datepart) = @_;
X local ($hour_offset, $zone, $zoneStr);
X local (@zone_list, $each);
X
X $hour_offset = $zone = $datepart;
X if ($hour_offset =~ /(-\d\d\d\d)/) {
X $hour_offset = $1;
X }
X elsif ($hour_offset =~ /\+(\d\d\d\d)/) {
X $hour_offset = $1;
X }
X else {
X $hour_offset =~ s/^.*\D(\d\d\d\d).*/$1/;
X }
X return 1 if $hour_offset eq $datepart;
X
X # $pattern = "^.*" . $hour_offset . "\s*\(([^)]+)\).*";
X # $zone =~ s/$pattern/$1/;
X $zone =~ s/^.*$hour_offset\s*\(([^)]+)\).*/$1/;
X return 1 if $zone eq $datepart;
X
X $zoneStr = $timezones{$hour_offset};
X if ($zoneStr eq "") {
X print
X "zone_check: Unknown time zone \"$hour_offset\" in date \"$datepart\"\n"
X if $verbose;
X $header_analysis .=
X "${bullet}I cannot confirm that the time zone \"$zone\" in \"Received:\"\n";
X $header_analysis .= "header \"$datepart\"\n";
X $header_analysis .= "should have an hour offset of \"$hour_offset\".\n\n";
X return 1;
X }
X @zone_list = split(/,\s*/, $zoneStr);
X for (@zone_list) {
X return 1 if $_ =~ /^$zone$/i; # OK, let it be case-insensitive
X }
X
X if ($verbose) {
X print "zone_check: hour offset $hour_offset has zone $zone, ";
X print "expected one of: $zoneStr\n";
X }
X
X # prettify for the message
X $zoneStr = "";
X for (@zone_list) {
X $zoneStr .= ", " if $zoneStr ne "";
X $zoneStr .= "\"$_\"";
X }
X if ($zoneStr =~ /^[^,]+,[^,]+$/) {
X $zoneStr =~ s/(.*), ([^,]*)$/$1 or $2/g;
X }
X else {
X $zoneStr =~ s/(.*), ([^,]*)$/$1, or $2/g;
X }
X
X $header_analysis .= "${bullet}Time zone in \"Received:\" header \"$datepart\"\n";
X $header_analysis .=
X "is \"$zone\" when it should be one of: $zoneStr.\n";
X $header_analysis .=
X "(This is the signature of the \"Stealth\" spam mailer.)\n"
X if $zone eq "EST";
X $header_analysis .= "\n";
X
X return 0;
}
X
X
#-----------------------------------------------
# Return 1 if the header parses properly
sub parse_received_header {
X local ($text) = @_;
X local ($datepart, $probe, $probe2, $each);
X
# From rfc822:
# TO DO: note that "from" must be first, etc.
# received = "Received" ":" ; one per relay
# ["from" domain] ; sending host
# ["by" domain] ; receiving host
# ["via" atom] ; physical path
# *("with" atom) ; link/mail protocol
# ["id" msg-id] ; receiver msg id
# ["for" addr-spec] ; initial form
# ";" date-time ; time received
# date = 1*2DIGIT month 2DIGIT ; day month year
# ; e.g. 20 Jun 82
# date-time = [ day "," ] date time ; dd mm yy
# ; hh:mm:ss zzz
# day = "Mon" / "Tue" / "Wed" / "Thu"
# / "Fri" / "Sat" / "Sun"
# hour = 2DIGIT ":" 2DIGIT [":" 2DIGIT]
# ; 00:00:00 - 23:59:59
# month = "Jan" / "Feb" / "Mar" / "Apr"
# / "May" / "Jun" / "Jul" / "Aug"
# / "Sep" / "Oct" / "Nov" / "Dec"
# time = hour zone ; ANSI and Military
# zone = "UT" / "GMT" ; Universal Time
# ; North American : UT
# / "EST" / "EDT" ; Eastern: - 5/ - 4
# / "CST" / "CDT" ; Central: - 6/ - 5
# / "MST" / "MDT" ; Mountain: - 7/ - 6
# / "PST" / "PDT" ; Pacific: - 8/ - 7
# / 1ALPHA ; Military: Z = UT;
X if ($text !~ /;/) {
X $header_analysis .= "${bullet}\"Received:\" header \"$possibleName\"\n";
X $header_analysis .= "has no mandatory semicolon (see RFC-822).\n\n";
X return 0;
X }
X
X # But does it really have a time?
X ($datepart = $text) =~ s/.*;\s*(.*)/$1/;
X $probe = $datepart;
X
X # Remove comments (thanks to Andrey A. Chernov for this)
X $probe =~ s/(\([^)]*\))//g;
X
X if ($probe =~ /,/) {
X # process the day field
X ($probe2 = $probe) =~ s/^\s*([^,\s]+)\s*,.*/$1/;
X if (!&is_day($probe)) {
X $header_analysis .=
X "${bullet}Day of week in \"Received:\" header, \"$datepart\",\n";
X $header_analysis .=
X "is not standard (see RFC-822).\n\n";
X return 0;
X }
X $probe =~ s/[^,\s]+\s*,(.*)/$1/; # now looking at date + time
X }
X else {
X # Nonstandard netcom header
X $probe =~ s/^\s*...\s+(.*)/$1/ if &is_day($probe);
X }
X
X $probe =~ s/^\s*(.*)/$1/; # remove leading spaces
X
X if ($probe =~ /^\d+\s+(.*)/) { # standard day-month-year
X $probe = $1; # now must have month
X
X if (!&is_month($probe)) {
X $header_analysis .=
X "${bullet}Date in \"Received:\" header, \"$datepart\", is not\n";
X $header_analysis .= "standard (see RFC-822).\n\n";
X return 0;
X }
X $probe =~ s/^...\s+(.*)/$1/;
X }
X elsif (&is_month($probe)) {
X # Netcom has non-standard month-day-year
X $probe =~ s/^...\s+(.*)/$1/;
X if ($probe !~ /^\d/) {
X $header_analysis .= "${bullet}(Netcom-style) ";
X $header_analysis .=
X "date in \"Received:\" header, \"$datepart\", is not standard;\n";
X $header_analysis .= "cannot find day of month (see RFC-822).\n\n";
X return 0;
X }
X }
X else {
X $header_analysis .=
X "${bullet}Date in \"Received:\" header, \"$datepart\", is not\n";
X $header_analysis .= "standard; cannot find day of month (see RFC-822).\n\n";
X return 0;
X }
X
X # Now for year
X $probe =~ s/^...\s+(.*)/$1/;
X if ($probe !~ /^\d+/) {
X $header_analysis .=
X "${bullet}Date in \"Received:\" header, \"$datepart\", is not\n";
X $header_analysis .= "standard; cannot find the year (see RFC-822).\n\n";
X return 0;
X }
X $probe =~ s/^\d+\s+(.*)/$1/; # anything left?
X if ($probe !~ /^\d\d:\d\d/) {
X $header_analysis .=
X "${bullet}Date in \"Received:\" header, \"$datepart\", is not\n";
X $header_analysis .= "standard; time is not hh:mm:ss (see RFC-822).\n\n";
X return 0;
X }
X
X # in practice, time zones are not very consistent, but we'll do our best.
X return 0 if !&zone_check($datepart);
X
X return 1;
X }
X
#-----------------------------------------------
# Indicate if the Received: header is forged.
sub forged_received_header {
X local ($text) = @_;
X local ($possibleName);
X local ($probe, $probe2, $result);
X
X # Many ad hoc checks for a bogus Received: header.
X # Plenty of work needs to be done here.
X # See http://oasis.ot.com/~dmuth/spam-l
X
X # everything after the 'from'
X ($possibleName = $text) =~ s/^Received:\s*(.*)/$1/i;
X
X $result = 0;
X
X for ("CLOAKED!", "may be forged", "unknown host") {
X next unless $possibleName =~ /$_/i;
X print "forged_received_header: found \"$_\" in header.\n" if $verbose;
X $header_analysis .=
X "${bullet}\"Received:\" header has suspicious text: \"$_\".\n\n";
X $result = 1;
X }
X
X # look for impossible IP address
X $probe2 = $probe = $possibleName;
X for (;;) {
X local ($str1, $str2, $str3, $str4);
X
X # last if !($probe =~ /\d+\.\d+\.\d+\.\d+/);
X last unless $probe =~ /[\[(]\s*(\d+\.\d+\.\d+\.\d+)\s*[\])]/;
X # idea: require that the inet_addr have enclosing brackets?
X
X ($str1 = $probe2 = $1) =~ s/\./\\./g;
X $probe =~ s/^(.*)$str1(.*)/$1$2/; # remove it
X
X ($str1, $str2, $str3, $str4) = ($probe2 =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)/);
X
X if ($probe2 =~ /^0\d/ || $probe2 =~ /\.0\d/ ||
X $str1 > 255 || $str2 > 255 || $str3 > 255 || $str4 > 255) {
X print "forged_received_header: impossible IP \"$probe2\".\n" if $verbose;
X $header_analysis .=
X "${bullet}\"Received:\" header has impossible IP \"$probe2\".\n\n";
X $result = 1;
X }
X }
X
X $result = 1 if !&parse_received_header($possibleName);
X
X # bogus Received: header won't have a for-clause with _your_ name in it.
X # for now, just see if it has the right domain name.
X # I wish a Received: header _always_ had a for-clause!
# too aggressive. How can I make this right?
# if ($possibleName =~ /for\s+<[^>]+>;/) {
# $probe = $possibleName;
# $probe =~ s/.*\sfor\s+<([^>]+)>;.*/$1/;
# if (!&home_domain($probe)) {
# print
# "forged_received_header: bogus for-clause <$probe>\n"
# if $verbose;
# $header_analysis .= "${bullet}\"Received:\" header has bogus for-clause <$probe>.\n\n";
# $result = 1;
# }
# }
X
X # bogus Received: header often has incorrect SMTP id
# Relies too much on the implementation of SMTP.
# if ($possibleName =~ /with smtp id/i) {
# local ($smtp_id, $smtp_char, $smtp_time, $smtp_hour);
#
# $smtp_id = $possibleName;
# $smtp_id =~ s/.*with smtp id (\w+).*/$1/i;
# $smtp_char = $smtp_id;
# $smtp_char =~ s/^(.).*$/$1/;
# $smtp_time = $possibleName;
# $smtp_time =~ s/.*with smtp id [^;]+;(.*)/$1/i; # entire end of header
# $smtp_time =~ s/.*\s([0-2]\d:\d\d:\d\d).*/$1/; # just want hh:mm:ss
# $smtp_hour = $smtp_time;
# $smtp_hour =~ s/^([0-2]\d):.*/$1/; # just the hour
# if ($smtp_chars{$smtp_char} ne $smtp_hour) {
# if ($verbose) {
# print "forged_received_header: SMTP id \"$smtp_id\" does";
# print " not match time \"$smtp_time\"\n";
# }
# $header_analysis .=
#"${bullet}\"Received:\" header with SMTP id \"$smtp_id\" mismatches \"$smtp_time\".\n\n";
# $result = 1;
# }
# }
X
X return $result;
X }
X
#-----------------------------------------------
# Find a line in hosts
sub findLine {
X local ($text) = @_;
X local ($result);
X
X return "" if $hosts_file eq "";
X open(HOSTS, "<$hosts_file") || die "cannot open $hosts_file: $!";
X $result = "";
X while (<HOSTS>) {
X $line = $_;
X chop($line);
X next if $line =~ /^\s*#.*/;
X # how else do I specify \< and \>? I miss vi's regex, for once.
X if ($line =~ /^$name$/i ||
X $line =~ /^$name\s+/i ||
X $line =~ /\s+$name$/i ||
X $line =~ /\s+$name\s+/i) {
X $result = $line;
X last;
X }
X next;
X }
X
X close HOSTS;
X return $result;
X }
X
#-----------------------------------------------
# gethostbyaddr looks here first
sub fakeAddrToName {
X local($name) = @_;
X local($result);
X
X $name =~ s/(\W)/\\$1/g; # remove special characters
X $result = &findLine($name);
X
X $result =~ s/^\d+\.\d+\.\d+\.\d+\s+(\S+).*/$1/;
X return $result;
X }
X
#-----------------------------------------------
# gethostbyname looks here first
sub fakeNameToAddr {
X local($name) = @_;
X local($result);
X
X $name =~ s/(\W)/\\$1/g; # remove special characters
X $result = &findLine($name);
X $result =~ s/^(\d+\.\d+\.\d+\.\d+)\s+.*/$1/;
X return $result;
X }
X
#-----------------------------------------------
sub log_mapping {
X local($name, $ip, $type) = @_;
X
X $ips_to_hosts{$ip} = $name if $ip ne "";
X $hosts_to_ips{$name} = $ip if $name ne "";
X $name = "?" if $name eq "";
X $ip = "?" if $ip eq "";
X print " $ip -> $name\t# $type\n" if $verbose;
X }
X
X
#-----------------------------------------------
# Try to turn an address into a hostname
# gethostbyaddr
sub addrToName {
X local ($text) = @_;
X local ($name, $aliases, $addrtype, $length, @addrs);
X local ($addr_int);
X local ($a, $b, $c, $d);
X local ($AF_INET) = 2; # not portable, but pretty common
X
X $name = $ips_to_hosts{$text};
X return $name if defined($name) && $name ne "";
X
X $name = &fakeAddrToName($text);
X if ($name ne "") {
X $name = "" if $name eq "BOGUS";
X &log_mapping($name, $text, "hosts");
X return $name;
X }
X
X ($a, $b, $c, $d) = split(/\./, $text);
X $addr_int = pack("C4", $a, $b, $c, $d);
X
X ($name, $aliases, $addrtype, $length, @addrs) =
X gethostbyaddr($addr_int, $AF_INET);
X if (defined($name) && $name ne "") {
X &log_mapping($name, $text, "gethostbyaddr");
X return $name;
X }
X
X &log_mapping("", $text, "gethostbyaddr");
X return "";
X }
X
#-----------------------------------------------
# Try to turn a hostname into an address
# gethostbyname
sub nameToAddr {
X local ($text) = @_;
X local ($name, $aliases, $addrtype, $length, @addrs);
X local ($a, $b, $c, $d);
X
X $name = $hosts_to_ips{$text};
X return $name if defined($name) && $name ne "";
X
X $name = &fakeNameToAddr($text);
X if (defined($name) && $name ne "") {
X $name = "" if $name eq "0.0.0.0";
X &log_mapping($text, $name, "hosts");
X return $name;
X }
X
X ($name, $aliases, $addrtype, $length, @addrs) = gethostbyname($text);
X if (defined($name) && $name ne "") {
X ($a, $b, $c, $d) = unpack('C4', $addrs[0]);
X $name = "$a.$b.$c.$d";
X &log_mapping($text, $name, "gethostbyname");
X return $name;
X }
X
X &log_mapping($text, "", "gethostbyname");
X return "";
X }
X
#-----------------------------------------------
# return 1 if this is an existing host.
sub real_host {
X local ($host) = @_;
X local ($junk);
X
X return 1 if $dont_resolve;
X $junk = &nameToAddr($host);
X return 0 if $junk eq "";
X return 1;
X }
X
X
#-----------------------------------------------
# return "", or best domain from the "Received: from" headers
# The algorithm is fairly involved. Basically, start with the newest
# Received: header and process until the last one a bogus one is found.
sub do_received {
X local ($message_host) = @_;
X local ($message_site, $inet_addr);
X local ($result, $previous_peer);
X local ($probe, $probe2, $possibleName);
X local ($this, $i, $each);
X local (@all_headers);
X local ($peer_name, $helo_name, $by_name);
X local ($peer_site, $helo_site, $by_site);
X local ($junk2, $peer_is_spammer);
X
X $message_site = &find_site($message_host);
X
X # get "Received: " headers for later perusal.
X for ($i = 0; $i < @original; $i ++) {
X $line = $original[$i];
X last if length($line) == 1; # RFC-822: end of headers at first blank line
X next unless $line =~ /^Received:\s*/i; # RFC-822 says case-independent
X $this = $line;
X chop($this);
X while ($i < @original) { # collect multi-line header
X $line = $original[$i + 1];
X last unless $line =~ /^[\s]+/;
X chop($line);
X $this .= $line;
X $i ++;
X }
X $this =~ s/^Received:\s*(.*)/$1/i;
X last if &forged_received_header($this); # don't _even_ put in the list
X push(@all_headers, $this);
X }
X
X $peer_name = $result = "";
X
X # Analyze the headers
X NEXT_HEADER: for ($i = 0; $i < @all_headers; $i ++) {
X $possibleName = $all_headers[$i];
X
X $previous_peer = $peer_name if $peer_name ne "";
X ($peer_name, $inet_addr) = &received_peer_name($possibleName);
X $helo_name = &helo_name($possibleName);
X $by_name = &by_name($possibleName);
X $by_name = &good_hostname($by_name, 1);
X if ($verbose) {
X print "received: \"$peer_name\"";
X print " inet: \"$inet_addr\"" if defined($inet_addr) && $inet_addr ne "";
X print " by: \"$by_name\"" if $by_name ne "";
X print " helo: \"$helo_name\"" if $helo_name ne "";
X print "\n";
X }
X $peer_site = &find_site($peer_name);
X $peer_is_spammer = &is_spammer($peer_name);
X $peer_site = "" if $peer_is_spammer;
X
X $helo_site = &find_site($helo_name);
X $by_site = &find_site($by_name);
X
X # analyze inet_addr, upgrade notion of peer_name
X if (defined($inet_addr) && $inet_addr ne "" && !$dont_resolve) {
X $probe2 = &addrToName($inet_addr);
X if ($peer_name ne "" && $probe2 eq "") {
X $header_analysis .= "${bullet}Unable to confirm $peer_name is $inet_addr.\n\n";
X $peer_name = $previous_peer if $peer_name eq "";
X }
X elsif ($peer_name ne "" && $probe2 ne "" && !&home_domain($peer_name)) {
X $junk2 = &find_site($probe2);
X if (!$peer_is_spammer && $peer_site ne $junk2) {
X $header_analysis .= "${bullet}\"Received:\" header says that peer is \"$peer_name\",\n";
X $header_analysis .= "but address $inet_addr resolves to $probe2.\n\n";
X $result = $probe2;
X last NEXT_HEADER;
X }
X }
X if ($probe2 ne "") {
X if ($peer_name eq "") {
X $header_analysis .= "${bullet}\"Received:\" header has empty peer name, but\n";
X $header_analysis .= "address $inet_addr resolves to $probe2.\n\n";
X }
X $peer_name = $probe2;
X }
X } # $inet_addr ne ""
X
X # ignore this header if it comes through/from/by a spammer
X if ($peer_is_spammer) {
X $result = $by_name if $by_name ne "";
X last NEXT_HEADER;
X }
X $peer_site = &find_site($peer_name);
X
X # Look at helo_name. Don't trust it very far, really.
X if ($helo_name ne "" && $helo_site eq "") {
X $header_analysis .=
X "${bullet}HELO name \"$helo_name\" is not a valid host name.\n\n";
X print " do_received: queer helo_name $helo_name\"\n" if $verbose;
X }
X elsif (&is_spammer($helo_name)) {
X $result = $peer_site if $peer_site ne ""; # end of the road
X last NEXT_HEADER;
X }
X elsif ($helo_name ne "" && $helo_name ne $peer_name) { # analyze helo_name
X # Does the helo_name matches the peer_name?
X if ($peer_site ne "" && $helo_site ne $peer_site) {
X $header_analysis .=
X "${bullet}\"Received:\" header's HELO name \"$helo_name\" significantly\n";
X $header_analysis .= "differs from peer_name \"$peer_name\".\n\n";
X print " do_received: helo $helo_name != peer $peer_name\n" if $verbose;
X $result = $peer_site; # end of the road
X last NEXT_HEADER;
X }
X } # analyze helo_name
X
X # Attempt to match the name of this host with the by_name of the next header
X if ($helo_name ne "" &&
X $i != $#all_headers) { # not oldest header, verification possible
X # Attempt to match the helo_name with the by_name of the next header
X $probe = &by_name($all_headers[$i + 1]);
X $probe2 = &find_site($probe);
X if ($probe2 eq "") {
X print
X "adcomplain: unable to confirm $helo_name against origination.\n";
X }
X elsif ($helo_site ne "" && $probe2 ne $helo_site) {
X $header_analysis .=
X "${bullet}HELO name \"$helo_name\" does not match prior header's\n";
X $header_analysis .= "by-name \"$probe\"\n\n";
X print
X "do_received: helo $helo_name does not match next by_name $probe\n"
X if $verbose;
X # HELO name is a little queer, so tolerate this, with a comment.
X }
X elsif ($peer_site ne "" && $probe2 ne $peer_site) {
X $header_analysis .=
X "${bullet}Peer name \"$peer_name\" does not match prior header's\n";
X $header_analysis .= "by-name name \"$probe\"\n\n";
X print
X "do_received: peer $peer_name does not match by_name $probe\n"
X if $verbose;
X $result = $peer_site;
X last NEXT_HEADER; # This is serious!
X }
X } # not oldest header
X
X # Check for spam insertion that created a Message-Id
X if ($result ne "" && $result eq $message_site &&
X $peer_site ne $message_site) {
X # No valid message has a Message-Id created on it mid-stream. If we
X # get here, we have the spam insertion. Let the victimized postmaster
X # be held accountable.
X $header_analysis .=
X "${bullet}Message-Id site \"$message_site\" is not at the start"
X . " of the chain of Received: headers.\n\n";
X print
X "do_received: Message-Id site \"$message_site\" found.\n" if $verbose;
X last NEXT_HEADER;
X }
X
X # $peer_name is definitely the way to go:
X if ($peer_name ne "") {
X $result = $peer_site;
X next NEXT_HEADER;
X }
X
X # no reverse address. Could be bogus, DNS transient oddness, or
X # simply that we are behind a firewall.
X
X # Plan B: use the by-name
X last NEXT_HEADER if &is_spammer($by_name);
X if ($by_name ne "") {
X $result = $by_name;
X next NEXT_HEADER;
X }
X
X # Go for the helo name (yuccch)
X next NEXT_HEADER if $helo_name eq "";
X last NEXT_HEADER if &is_spammer($helo_name);
X
X print "do_received: relying on helo_name \"$helo_name\"\n" if $verbose;
X $result = $helo_name;
X } # NEXT_HEADER
X
X return "" if $result eq "";
X $result = "" if &home_domain($result);
X if ($result ne "") {
X ®ister_host("Received:", $result);
X print "do_received: result is \"$result\"\n";
X }
X
X if ($result ne "" && $message_host ne "") {
X $probe = &find_site($result);
X if ($message_site ne $probe) {
X $header_analysis .=
X "${bullet}Site in \"Message-Id:\" \"$message_site\" does not match\n";
X $header_analysis .=
X "\"Received:\" origin \"$result\".\n\n";
X print " do_received: Message-Id site $message_site != result $result\n"
X if $verbose;
X }
X }
X
X return $result;
X }
X
#-----------------------------------------------
# The following headers are scanned, in order, to determine the poster:
# NNTP-Posting-User:
# Return-Path:
# Reply-To:
# From:
#
# A poster's address be of the form user@domain, where domain is
# a legal domain name. The domain is rejected if it matches our domain.
#
# If the address is of form "user,id <xxx@site>", the
# message will be addressed to xxx@site.
# If the address is of form "Name <address>", set to "address".
# If the address is of form "(address)", set to "address".
# If the address is of form "address(Name)", set to "address".
# Remove extra words, in case header is of form "address (Name)"
X
sub find_poster {
X local ($this, $junk, $junkhost, $result);
X
X @headers = ("NNTP-Posting-User:", "Return-Path:", "Reply-To:", "From:");
X @search_patterns = ( '.*NNTP-Posting-User: ',
X '^Return-Path:', '^Reply-To:', '^From:');
X $result = "";
X for (@search_patterns) {
X $this = $headers[0];
X shift @headers;
X $junk = &extract_header($_);
X next if $junk eq "";
X
X # Validate the name
X $junk =~ s/[^<]*<([^>]*)>.*/$1/; # remove angle brackets
X $junk =~ s/([^(\s]*)\s*\([^)]*\)/$1/; # remove parenthesized name
X ($junkhost = $junk) =~ s/.*@(.*)/$1/;
X $junkhost =~ s/([^\s]*) *\(.*\)/$1/; # remove proper name
X $junkhost = &good_hostname($junkhost, 0);
X next if $junkhost eq "";
X $result = $junk if $result eq ""; # take first available
X ®ister_host($this, $junkhost);
X print "find_poster: found '$this' host $junk\n" if $verbose;
X }
X if ($result !~ /.*,.*/) {
X # remove angle brackets from poster's name
X $result =~ s/.*<(.*)>.*/$1/;
X }
X if ($result eq "") {
X print "\nadcomplain: WARNING: cannot determine poster's address.\n\n";
X $result = "";
X }
X else {
X print "find_poster: poster is '$result'\n" if $verbose;
X }
X return $result;
X }
X
#-----------------------------------------------
# Analyze the "Path:" header, return best possible host
# Basically, we're looking for the oldest (believable) host in the path.
# I used to process the path from left-to-right, with the idea that I
# could stop before the first unconfirmable host. In practice, it seems
# to be better to just go from the right and stop with the first believable
# one (though I still have reservations about that).
sub do_path {
X local ($path, $result, $chunk, $junk);
X local (@chunks);
X
X $path = &extract_header("^Path:");
X return "" if $path eq "";
X @chunks = reverse(split(/!/, $path));
X
X foreach $chunk (@chunks) {
X $chunk = &addrToName($chunk) if &is_inet_addr($chunk);
X $chunk = &good_hostname($chunk, 1);
X # $chunk = &good_hostname($chunk, 0); # don't require host to exist.
X next if $chunk eq "";
X next if &is_spammer($chunk);
X $result = $chunk;
X last;
X }
X
X if ($result ne "") {
X print "do_path: Path origin is $result\n" if $verbose;
X ®ister_host("Path:", $result);
X return $result;
X }
X return "";
X }
X
#-----------------------------------------------
# Examine and qualify a header
sub try_host
{
X local($pat, $name, $must_be_real) = @_;
X local($junk, $junk2);
X
X $junk = &extract_header($pat);
X return "" if $junk eq "";
X print "try_host: \'$name\' is $junk\n" if $verbose;
X if (&is_inet_addr($junk) && !$dont_resolve) {
X $junk2 = &addrToName($junk);
X $junk = $junk2;
X }
X else {
X $junk = &good_hostname($junk, $must_be_real);
X }
X return "" if $junk eq "";
X return "" if &home_domain($junk);
X ®ister_host($name, $junk);
X return $junk;
}
X
#-----------------------------------------------
# I've seen these headers and I want to check for them:
# X-Authentication-Warning: quick.t-1net.com: b142.ecom.net [207.13.225.142] didn't use HELO protocol
#X-Authentication-Warning: communique-tech.co.uk:
# Host 1Cust40.max15.los-angeles.ca.ms.uu.net [153.34.77.168] claimed
# to be hotmail.com
# X-Authentication-Warning: gatekeeper.smltd.com:
# mail set sender to <lo...@6t9.com> using -f
# X-Authentication-Warning: ns.internetmedia.net: weginc owned process doing -bs
sub do_auth_warning {
X local ($junk, $junk_site, $name_site);
X local ($name, $inet_addr, $result);
X
X $junk = &extract_header("X-Authentication-Warning:");
X return "" if $junk eq "";
X
X $inet_addr = "";
X if ($junk =~ /didn't use HELO protocol/) {
X $junk =~ s/^[^:]+: (.*) didn't use HELO protocol/$1/i;
X $name = $inet_addr = $junk;
X
X $name =~ s/^\s*([\w\.-]+)\s*.*/$1/;
X $inet_addr =~ s/^.*\[(.*)\].*/$1/;
X }
X elsif ($junk =~ /claimed to be/) {
# Host 1Cust40.max15.los-angeles.ca.ms.uu.net [153.34.77.168] claimed
# or:
# oncidium: Host x.y..net claimed to be usinet cziegle
X
X ($name = $junk) =~ s/.*Host\s+(\S+).*/$1/;
X
X ($inet_addr = $junk) =~ s/.*\[([^]]*)\].*/$1/
X if $junk =~ /\[\d+\.\d+\.\d+\.\d+\]/;
X }
X elsif ($junk =~ / set sender to /) {
X # nothing else warranted
X $name = "";
X }
X elsif ($junk =~ / owned process doing /) {
X # is this useful? For now, do nothing.
X $name = "";
X }
X else {
X print "adcomplain: new X-Authentication-Warning header\n";
X print " Please send this test case to the adcomplain authors.\n";
X return "";
X }
X
X $result = $name;
X if ($inet_addr ne "" && !$dont_resolve) {
X $junk = &addrToName($inet_addr);
X if ($junk eq "") {
X $header_analysis .= "${bullet}Unable to confirm $name is $inet_addr.\n\n";
X }
X elsif ($name ne "" && !&home_domain($name)) {
X $result = $junk;
X $junk_site = &find_site($junk);
X $name_site = &find_site($name);
X if ($name_site ne $junk_site) {
X $header_analysis .= "${bullet}\"X-Authentication-Warning:\" header says that peer is \"$name\",\n";
X $header_analysis .= "but address $inet_addr resolves to $junk.\n\n";
X }
X }
X } # $inet_addr ne ""
X print "do_auth_warning: found \"$result\"\n" if $verbose;
X ®ister_host("X-Authentication-Warning:", $result) if $result ne "";
X return $result;
X }
X
X
#-----------------------------------------------
# The following order of preference is used to determine the originating host:
# the host in the "NNTP-Posting-Host:" header;
# the host in the "Path:" header;
# the host in the "Received:" headers;
# the host in the "Message-Id:" header;
# the host in the "Sender:" header; else
# the host of the poster
#
# In any event, recognize and reduce hostnames of the form
# <id@host>
# (id@host)
# host(inet_addr) [reduce to "host"]
# Make sure to remove extra words, i.e., "address (Name)"
# A hostname must have valid syntax and not match the current domain.
X
sub find_host {
X local ($message_host, $junk, $this, $result);
X
X $postmaster = "";
X $complain_to = "";
X $result = "";
X
X # NNTP-Posting-Host: is first choice.
X $junk = &try_host(".*NNTP-Posting-Host:", "NNTP-Posting-Host:", 1);
X $junk = "" if &home_domain($junk);
X $result = $junk if $result eq "" && $junk ne "";
X
X $junk = &do_path; # Path: header is the next most reliable.
X $junk = "" if &home_domain($junk);
X $result = $junk if $result eq "" && $junk ne "";
X
X # This is used in do_received, so figure it out now.
X $message_host = &try_host("^Message-Id:", "Message-Id:", 1);
X
X $junk = &do_auth_warning();
X $junk = "" if &home_domain($junk);
X $result = $junk if $result eq "" && $junk ne "";
X
X $junk = &do_received($message_host); # ...then, try Received:
X $junk = "" if &home_domain($junk);
X $result = $junk if $result eq "" && $junk ne "";
X print "adcomplain: WARNING: cannot use \"Received:\" headers.\n"
X if $junk eq "" && $mailmode;
X
X # Now curry any remaining possibilities....
X $result = $message_host if $result eq "" && $message_host ne "";
X
X $junk = &try_host("^Sender:", "Sender:", 0);
X $result = $junk if $result eq "" && $junk ne "";
X
X if ($poster ne "") {
X print "find_host: trying poster \"$poster\"...\n" if $verbose;
X $junk = &good_hostname($poster, 0);
X ®ister_host("Poster:", $junk) if $junk ne "";
X $junk = "" if &home_domain($junk);
X $result = $junk if $result eq "" && $junk ne "";
X }
X
X if ($result eq "") {
X print "\nadcomplain: WARNING: no valid host name was found\n";
X }
X else {
X print "find_host: host is '$result'\n" if $verbose;
X }
X return $result;
X }
X
#-----------------------------------------------
# Revise the site name based on some exceptions and known aliases.
sub revise_site {
X local ($site) = @_;
X local ($redirect, $junk);
X
X $redirect = "";
X ($junk = $site) =~ s/(\W)/\\$1/g; # remove special characters
X for (keys(%rematch_aliases)) {
X if ($_ =~ /$junk/) {
X $redirect = $_;
X last;
X }
X }
X if ($redirect ne "") {
X $junk = $rematch_aliases{$redirect};
X print "revise_site: $site redirected: '$junk'\n" if $verbose;
X $redirect = &extract_header($junk);
X }
X if ($redirect ne "") {
X $site = &find_site($redirect);
X print "revise_site: '$redirect' is '$site'\n" if $site ne "" && $verbose;
X }
X return $site;
X }
X
#-----------------------------------------------
# Get all of the sites feasible from the Complain-To headers
sub do_complain_to {
X local ($junk, $junk2);
X local (@list, $i, $j, $each);
X
X $complain_to = "";
X for ("Complain-To", "Report-Abuse-To", "X-Complaints-To"
X ) { # alternatives
X $junk = &extract_header("^.*$_:");
X next if $junk eq "";
X print "do_complain_to: $_: is $junk\n" if $verbose;
X @list = split(/[\s,]+/, $junk);
X for ($i = 0; $i < @list; $i ++) { # process list
X $junk2 = &good_hostname($list[$i], 0);
X if ($junk2 ne "") { # good hostname
X if ($i == 0 && $#list == 0) {
X ®ister_host("$_:", $junk2);
X }
X else {
X $j = $i + 1;
X ®ister_host("$_-$j:", $junk2);
X }
X $complain_to = $junk if $complain_to eq "";
X } # good hostname
X } # process list
X } # alternatives
X
X if ($complain_to eq "") {
X if ($site eq "") {
X print "\nadcomplain: WARNING: no valid complain_to address was found\n";
X }
X else {
X print "do_complain_to: setting complain_to to site name.\n" if $verbose;
X $complain_to = "$site\@abuse.net";
X }
X }
X else {
X if ($site eq "") {
X @list = split(/[\s,]+/, $complain_to);
X $site = &good_hostname($list[0], 0);
X print "do_complain_to: setting site to $site.\n" if $verbose;
X }
X }
X
X $complain_to =~ s/,/ /g; # turn all commas to spaces
X $complain_to =~ s/\s+/, /g; # and then back to commas
X print "do_complain_to: complain_to is '$complain_to'\n"
X if $complain_to ne "" && $verbose;
X }
X
#-----------------------------------------------
sub parse_headers {
X local ($this);
X
X $subject = &extract_header("^Subject:");
X if ($subject eq "") {
X print "\nadcomplain: WARNING: subject not found\n\n";
X }
X else {
X print "subject is '$subject'\n" if $verbose;
X }
X
X if ($mailmode) {
X # mail mode forced
X if ($ARGV[0] ne "") {
X print
X "\nadcomplain: ERROR choose at most one of -m and a newsgroup name\n";
X exit 1;
X }
X $newsgroup = "";
X print "This is a mail message.\n" if $verbose;
X }
X else {
X $this = &extract_header("^Path:");
X $newsgroup = &extract_header("^Newsgroups:");
X if (defined($ARGV[0]) && $ARGV[0] ne "") {
X $newsgroup = $ARGV[0];
X print "newsgroup is from command line argument.\n" if $verbose;
X }
X if ($newsgroup eq "") {
X $mailmode = 1;
X print "Inferring that this is a mail message.\n" if $verbose;
X }
X else {
X $newsgroup =~ s/,/, /g;
X if ($newsgroup =~ /^[^,]+,[^,]+$/) {
X $newsgroup =~ s/(.*), ([^,]*)$/$1 or $2/g;
X }
X else {
X $newsgroup =~ s/(.*), ([^,]*)$/$1, or $2/g;
X }
X print "newsgroup is '$newsgroup'\n" if $verbose;
X }
X }
X
X $poster = &find_poster;
X $host = &find_host;
X
X $site = &find_site($host);
X if ($site ne "") {
X print "site is '$site'\n" if $verbose;
X
X $site = &revise_site($site);
X $postmaster = "postmaster\@$site";
X print "postmaster is '$postmaster'\n" if $verbose;
X }
X
X &do_complain_to;
X
X $site = "INSERT_SITE_NAME_HERE" if $site eq "";
} # parse_headers
X
# returns 0 or else a cleaned up hostname
sub good_hostname {
X local ($host, $must_be_real) = @_;
X local ($junk, $found, $each);
X
X # clean up the hostname
X $host =~ s/.*<(.*)>.*/$1/; # remove angle brackets, if any
X $host =~ s/.*\((.*)\).*/$1/; # remove parens, if any
X $host =~ s/\(.*\)//; # remove parenthesized text
X $host =~ s/.*@(.*)/$1/;
X $host =~ y/A-Z/a-z/; # lowercase
X
X # return "" if !($host =~ /^[A-Z]/i); # hostname must begin with a letter
X return "" unless $host =~ /.*\..*/; # hostname must have at least one dot
X return "" if &is_inet_addr($host);
X
X # check for illegal characters
X for (
X # from rfc822
X "\\(", "\\)", "<", ">", "@", ",", ";", ":", "\\\\", "\\\"",
X "\\[", "\\]", # ".",
X # questionable ones added by Jason
X "#", "\\^", "\\&", "\\*", "=", "\\+", "\\|", "\\?", "`", "~", "\\/") {
X if ($host =~ /$_/) {
X print "good_hostname: \"$host\" has illegal char \"$_\".\n" if $verbose;
X return "";
X }
X }
X
X # Look at the irregular site names first.
X $junk = $host;
X for (@site_exceptions) {
X return $host if $junk =~ /$_$/;
X }
X
X # See if tail is a valid country suffix. If so, strip it.
X ($junk = $host) =~ s/.*\.([^.]*)/$1/; # get that tail
X $found = 0;
X for (@country_domains, @org_domains) {
X if ($junk eq $_) {
X $found = 1;
X last;
X }
X }
X
X if (!$found) {
X print "good_hostname: \"$host\" has invalid suffix \"$junk\"\n" if $verbose;
X return "";
X }
X
X if ($must_be_real && !&home_domain($host)) {
X $host = "" if !&real_host($host);
X }
X
X return $host;
X }
X
#--------------
# Reduce a hostname to a site; i.e.:
# If last field of $host >= 3 characters long (e.g., "com", "edu"),
# set $site to last two fields (e.g., "company.com" or "college.edu")
# unless three field version found in exceptions list,
# otherwise, set $site to last three fields (e.g., "canadian.site.ca")
# unless two field version found in exceptions list.
sub find_site {
X local ($host) = @_;
X local ($site, $site2, $site3, $junk);
X
X $host =~ s/<(.*)>/$1/; # remove angle brackets
X $host =~ s/[^@]*@(.*)/$1/; # extract domain-name part
X
X ($site2 = $host) =~ s/.*\.(.*\..*)/$1/;
X ($site3 = $host) =~ s/.*\.(.*\..*\..*)/$1/;
X ($junk = $host) =~ s/.*\.(.*)/$1/;
X if (length($junk) >= 3) {
X ($junk = $site3) =~ s/(\W)/\\$1/g; # remove special characters
X
X if (grep(/^$junk$/, @site_exceptions) != 0) {
X $site = $site3;
X }
X else {
X $site = $site2;
X }
X }
X else {
X ($junk = $site2) =~ s/(\W)/\\$1/g; # remove special characters
X
X if (grep(/^$junk$/, @site_exceptions) != 0) {
X $site = $site2;
X }
X else {
X $site = $site3;
X }
X }
X $site =~ y/A-Z/a-z/; # lowercase
X return $site;
X }
X
#-----------------------------------------------
# Add the given site to the list of sites
sub register_host {
X local ($key, $value) = @_;
X
X $available_hosts{$key} = &find_site($value);
X }
X
#-----------------------------------------------
# Analyze the list of available hosts. Generate diagnostic if
# headers are inconsistent.
sub check_hosts {
X local ($firstkey, $secondkey, $firstval, $secondval);
X local (@order) = ("Path:", "Received:", # "NNTP-Posting-Host:",
X # "Message-Id:", "Sender:", "NNTP-Posting-User:",
X # "Return-Path", "Reply-To:", "From:"
X );
X
X foreach $firstkey (@order) {
X $firstval = $available_hosts{$firstkey};
X next if !defined($firstval) || $firstval eq "";
X foreach $secondkey (@order) {
X $secondval = $available_hosts{$secondkey};
X next if !defined($secondval) || $secondval eq "";
X if ($firstval ne $secondval) {
X $header_analysis .= "${bullet}Site implied by \"$firstkey\" header ($firstval)";
X $header_analysis .= " is not consistent with site implied by";
X $header_analysis .= " \"$secondkey\" header ($secondval).\n\n";
X return;
X }
X }
X }
X }
X
#-----------------------------------------------
# Return 1 if the argument refers to the home domain
sub home_domain {
X local ($probe) = @_;
X local ($each);
X
X for (@mydomains) {
X return 1 if $probe =~ /$_$/i;
X }
X return 0;
X }
X
#-----------------------------------------------
# j-random initialization
sub initialize {
# ($user,$passwd,$uid,$gid,$quota,$comment,$gcos,$dir,$shell) = getpwuid($>);
X
X # Start by figuring out which OS we're on. Fortunately, we don't
X # need to distinguish different Unixes....
X if (defined($ENV{"OS"}) && $ENV{"OS"} eq "Windows_NT") {
X $os_kind = "winnt";
X }
X elsif ($ eq "MSWin32") {
X # Windows 95, as opposed to Windows NT which would pass previous test
X $os_kind = "win32";
X }
X elsif (-x "/bin/uname") {
X # $ would work with perl5, but then I would have to distinguish
X # between AIX, HP-UX, Solaris, SunOS, Linux, SINIX, SVr4, etc.
X $os_kind = "unix";
X }
X else {
X die "what is your os?";
X }
X
X # Fix $AF_INET and $SOCK_STREAM
X if (!defined($AF_INET) || $AF_INET eq "") {
X if ($os_kind eq "unix") {
X # an apology here: the perl run here at gemstone.com was installed
X # years ago by someone who _really_ didn't know what he was doing.
X # All of the host-specific libraries are really a mess, and disentangling
X # it for our different architectures is not practical.
X $junk = `/bin/uname -rs`;
X if ($junk =~ /^SunOS 5.*/) { # Solaris
X $AF_INET = 2;
X $SOCK_STREAM = 2; # they just _had_ to be different.
X }
X elsif ($junk =~ /^HP-UX.*/i # HP-UX
X || $junk =~ /^AIX.*/i # AIX
X || $junk =~ /^SunOS 4.*/i # SunOS
X ) {
X $AF_INET = 2;
X $SOCK_STREAM = 1;
X }
X else {
X # Sorry, can't guess. Your perl better be properly installed.
X require "sys/socket.ph";
X }
X }
X elsif ($os_kind eq "winnt" || $os_kind eq "win32") {
X # from winsock.h
X $AF_INET = 2;
X $SOCK_STREAM = 1;
X }
X else {
X die "cannot set AF_INET and SOCK_STREAM properly";
X }
X }
X
X # Determine the editor
X $editor = $ENV{"VISUAL"};
X $editor = $ENV{"EDITOR"} if !defined($editor) || $editor eq "";
X if (!defined($editor) || $editor eq "") {
X if ($os_kind eq "unix") {
X $editor = "vi";
X }
X elsif ($os_kind eq "winnt" || $os_kind eq "win32") {
X $editor = "notepad";
X }
X else {
X die "don't know default editor for os $os_kind";
X }
X }
X
X # Determine the pager
X $pager = $ENV{"PAGER"};
X $pager = "" if !defined($pager);
X if ($pager eq "" && $os_kind eq "unix") {
X # better default on Unix
X $pager = "more";
X }
X $pager = "" if $pager eq "builtin";
X
X # hostname (will include domain if you're _really_ lucky)
X if ($os_kind eq "unix") {
X chop($local_hostname = `/bin/hostname`);
X }
X elsif ($os_kind eq "winnt") {
X $local_hostname = $ENV{"COMPUTERNAME"};
X
X die "Please set the COMPUTERNAME environment variable"
X if $local_hostname eq "";
X }
X elsif ($os_kind eq "win32") {
X # I wish there was a better way of doing this....
X $local_hostname = $ENV{"COMPUTERNAME"};
X
X die "Please set the COMPUTERNAME environment variable"
X if $local_hostname eq "";
X }
X else {
X die "cannot determine local hostname on this os ($os_kind)";
X }
X
X if (!defined($mailhost) || $mailhost eq "") {
X local($name, $aliases, $type, $len, $addr) = gethostbyname("mailhost");
X $addr = $addr; # shut up perl5 -w
X if (defined($name) && $name ne "") {
X $mailhost = $name;
X }
X elsif ($os_kind eq "unix") {
X $mailhost = $local_hostname;
X # $mailhost = "localhost";
X }
X else {
X die "configuration error: mailhost not set";
X }
X }
X
X $SIG{'PIPE'} = IGNORE;
X $header_analysis = "";
X $bullet = ". "; # used in formatting header_analysis
X $bullet2 = " "; # for hanging indent
X @spammer_list = ();
X
X # Make stderr and stdout unbuffered.
X select(STDERR); $| = 1;
X select(STDOUT); $| = 1;
X
X if ($os_kind eq "unix") {
X $tempname="/tmp/adcomplain-$$";
X $CONSOLE = "/dev/tty";
X }
X elsif ($os_kind eq "winnt" || $os_kind eq "win32") {
X # Two weird conventions for a temp directory on Windows NT
X $tmp = $ENV{"TMP"};
X $tmp = $ENV{"TEMP"} if !defined($tmp) || $tmp eq "";
X $tempname="$tmp\\adcomplain-$$"; # ?? is there a better way?
X $tempname =~ s#/#\\#g; # in case Unix-isms crept in
X
X $CONSOLE = "con:";
X }
X else {
X die "need tempname and console for this os ($os_kind)";
X }
X
X $hosts_file = $ENV{"ADCOMPLAIN_HOSTS"};
X $hosts_file = "" if !defined($hosts_file) || $hosts_file eq ""
X || ! -f $hosts_file;
X
X # mnemonics for $recipient
X $complain_to_only = 1;
X $poster_only = 2;
X $poster_and_complain_to = 3;
X
X %hosts_to_ips = ();
X %ips_to_hosts = ();
X
X @monthNames = (
X "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep",
X "Oct", "Nov", "Dec");
X @wdayNames = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");
X
X # Now that I've discovered IEEE 1003.1, I just want to cry. But here's
X # a modest attempt at time zones. Complain away if you think it's wrong....
X %timezones = (
X "-1200", "IDLW, M", # International Date Line West
X "-1100", "NT, SST, L", # Nome, Samoa
X "-1000", "HST, AHST, CAT, HAST, K", # Hawaii Standard
X "-0900", "YST, HDT, AKADT, HADT, I", # Yukon Standard
X "-0800", "PST, YDT, H", # Pacific Standard, Yukon Daylight
X "-0700", "MST, PDT, G", # Mountain Standard, Pacific Daylight
X "-0600", "CST, MDT, F", # Central Standard, Mountain Daylight
X "-0500", "EST, CDT, AST, E",# Eastern Standard, Central Daylight,
X # Brazil/Acre
X "-0400", "AST, EDT, WST, ADT, CST, D",
X # Atlantic Standard, Eastern Daylight,
X # Brazil Western, Brazil/Acre, Chile Standard
X "-0330", "NST, CDT", # Newfoundland Standard, Chile Daylight
X "-0300", "ADT, EST, WDT, C",# Atlantic Daylight, Brazil
X "-0230", "NDT", # Newfoundland Daylight
X "-0200", "EDT, FST, AT, B", # Brazil Eastern Daylight, Brazil/deNoronha,
X # Azores
X "-0100", "FDT, WAT, A", # Brazil/deNoronha, West Africa
X "0000", "GMT, UTC, WET, UT, Z", # Greenwich Mean,
X # Universal Time, Western Europe
X "0100", "BST, WET DST, MET, CET, FWT, MEWT, SWT, N",
X # Western Daylight, Middle Europe
X "0200", "EET, MET DST, METDST, MEST, MESZ, SST, FST, O, SAT",
X # Middle Europe Daylight
X # Swedish Summer Time, French Summer Time,
X # South African Time
X "0300", "EET DST, MSK, IST, BT, P", # Turkey, Moscow, Israel
X "0330", "IT", # Iran?
X "0400", "IDT, MSD, ZP4, Q",
X "0500", "ZP5, R", # USSR Zone 4
X "0530", "IST", # India Standard Time
X "0600", "ZP6, S", # USSR Zone 5
X "0630", "NST", # North Sumatra?
X "0700", "WAST, T", # Western Austrailia
X "0730", "JT", # Java?
X "0800", "CST, SST, SGT, HKT, WST, CCT, WADT, U, MYT", # China & Taiwan,
X # Singapore Standard, Hong Kong, West Australia,
X # Maylasia
X "0900", "KST, CDT, JST, V", # Korea, China, Japan
X "0930", "CST, CAST", # North Australia, South Australia
X "1000", "KDT, EAST, GST, W",
X # Korea, Eastern Australia, Guam
X "1100", "EST, EADT, X",
X "1200", "NZST, IDLE, NZT, Y",# New Zealand, International Date Line East
X "1300", "NZDT", # New Zealand Daylight Time?
X );
X
X # Valid country domains
X @country_domains = (
X "uk", # Non-standard but frequently used.
X "su", # Non-standard but frequently used.
X "af", "al", "dz", "as", "ad", "ao", "ai", "aq", "ag", "ar", "am", "aw", "au",
X "at", "az", "bs", "bh", "bd", "bb", "by", "be", "bz", "bj", "bm", "bt", "bo",
X "ba", "bw", "bv", "br", "io", "bn", "bg", "bf", "bi", "kh", "cm", "ca", "cv",
X "ky", "cf", "td", "cl", "cn", "cx", "cc", "co", "km", "cg", "ck", "cr", "ci",
X "hr", "cu", "cy", "cz", "dk", "dj", "dm", "do", "tp", "ec", "eg", "sv", "gq",
X "er", "ee", "et", "fk", "fo", "fj", "fi", "fr", "fx", "gf", "pf", "tf", "ga",
X "gm", "ge", "de", "gh", "gi", "gr", "gl", "gd", "gp", "gu", "gt", "gn", "gw",
X "gy", "ht", "hm", "hn", "hk", "hu", "is", "in", "id", "ir", "iq", "ie", "il",
X "it", "jm", "jp", "jo", "kz", "ke", "ki", "kp", "kr", "kw", "kg", "la", "lv",
X "lb", "ls", "lr", "ly", "li", "lt", "lu", "mo", "mk", "mg", "mw", "my", "mv",
X "ml", "mt", "mh", "mq", "mr", "mu", "yt", "mx", "fm", "md", "mc", "mn", "ms",
X "ma", "mz", "mm", "na", "nr", "np", "nl", "an", "nc", "nz", "ni", "ne", "ng",
X "nu", "nf", "mp", "no", "om", "pk", "pw", "pa", "pg", "py", "pe", "ph", "pn",
X "pl", "pt", "pr", "qa", "re", "ro", "ru", "rw", "kn", "lc", "vc", "ws", "sm",
X "st", "sa", "sn", "sc", "sl", "sg", "sk", "si", "sb", "so", "za", "gs", "es",
X "lk", "sh", "pm", "sd", "sr", "sj", "sz", "se", "ch", "sy", "tw", "tj", "tz",
X "th", "tg", "tk", "to", "tt", "tn", "tr", "tm", "tc", "tv", "ug", "ua", "ae",
X "gb", "us", "um", "uy", "uz", "vu", "va", "ve", "vn", "vg", "vi", "wf", "eh",
X "ye", "yu", "zr", "zm", "zw",
X );
X
X @org_domains = (
X # The old ARPAnet standards...
X "com", "edu", "gov", "int", "mil", "net", "org",
X
X # Following at http://www.edns.net/registries.htm
X # unsanctioned but currently supported by a number of nameservers
X "biz", "corp", "earth", "exp", "k12", "ltd", "lnx", "med", "nic", "npo",
X "per", "usa", "web", "xxx",
X
X # Following at http://www.iahc.org/press-final.html, dated 4 Feb 97.
X # Also want to hear more before accepting these....
X # "arts", "firm", "info", "nom", "rec", "store", "web",
X );
X
X $from = $ENV{"ADCOMPLAIN_FROM"};
X if ($from eq "") {
X # username
X if ($os_kind eq "unix") {
X $from = $ENV{"USER"};
X $from = $ENV{"LOGNAME"} if $from eq "";
X }
X elsif ($os_kind eq "winnt") {
X $from = $ENV{"USERNAME"};
X }
X elsif ($os_kind eq "win32") {
X # This might be buried in the registry somewhere....
X $from = $ENV{"USERNAME"};
X die "Please set %ADCOMPLAIN_FROM% in your autoexec" if $from eq "";
X }
X else {
X die "how do I get your username on this os? ($os_kind)";
X }
X $from = "$from\@$local_hostname" if $from ne "" && $local_hostname ne "";
X }
X if (&good_hostname($from, 0) eq "") {
X print "WARNING: your return address \"$from\" is not valid.\n";
X print " Be sure to edit before sending. Set ADCOMPLAIN_FROM\n";
X print " in your environment to permanently rectify this.\n";
X }
X
X # This is a dictionary of the hostnames we've found.
X %available_hosts = ();
X
X # This is a simple way to match the first letter of an SMTP id with the
X # expected hour of the day....
# %smtp_chars = ( "A", "00", "B", "01", "C", "02", "D", "03", "E", "04",
# "F", "05", "G", "06", "H", "07", "I", "08", "J", "09",
# "K", "10", "L", "11", "M", "12", "N", "13", "O", "14",
# "P", "15", "Q", "16", "R", "17", "S", "18", "T", "19",
# "U", "20", "V", "21", "W", "22", "X", "23");
X
X # Exceptions List
X # Please mail additions and corrections to bil...@agora.rdrop.com.
X #
X # DESCRIPTION
X # These are site names that don't follow the convention of two fields for
X # names with three-letter suffixes (e.g., company.com) or three fields for
X # names with two-letter suffixes (e.g., canadian.site.ca).
X
X @site_exceptions = (
X 'ab.umd.edu',
X 'acc.ca',
X 'ada.se',
X 'ai.mit.edu',
X 'algonet.se',
X 'austria.eu.net',
X 'aware.nl',
X 'bcm.tmc.edu',
X 'bluewin.ch',
X 'bme.hu',
X 'bureau7.utcc.utoronto.ca',
X 'campus.mci.net',
X 'canit.se',
X 'casema.nl',
X 'ceta.es',
X 'chalmers.se',
X 'cisnews.cisnet.com',
X 'coast.to',
X 'cs.umass.edu',
X 'cybernet.za',
X 'demon.co.uk',
X 'dial-access.att.net',
X 'dial.pipex.com',
X 'direct.ca',
X 'econnect.ca',
X 'egate.ca',
X 'elektrobit.fi',
X 'escape.ca',
X 'eunet.be',
X 'eunet.ch',
X 'eunet.fi',
X 'extrabit.fi',
X 'fastlane.ca',
X 'forfree.at',
X 'fun.ee',
X 'germany.eu.net',
X 'glo.be',
X 'glas.apc.org',
X 'glue.umd.edu',
X 'gmx.de',
X 'gnu.ai.mit.edu',
X 'greenhill.pvt.k12.tx.us',
X 'gregg.world-access.com',
X 'grolier.fr',
X 'gu.se',
X 'hol.fr',
X 'hvu.nl',
X 'iaf.nl',
X 'ibernet.es',
X 'ican.ca',
X 'indigo.ie',
X 'iol.ie',
X 'isky.ca',
X 'istar.ca',
X 'lakeheadu.ca',
X 'loki.silkspin.com',
X 'lserv.utcc.utoronto.ca',
X 'mail.icongrp.com',
X 'mediatech.de',
X 'metronet.de',
X 'msfc.nasa.gov',
X 'nacamar.de',
X 'nemo.fi',
X 'netcom.ca',
X 'netinc.ca',
X 'netway.at',
X 'nstn.ca',
X '.nu',
X 'nym.alias.net',
X 'on.the.net',
X 'online.no',
X 'pangea.ca',
X 'pi.se',
X 'pine.nl',
X 'ping.at',
X 'planet.eon.net',
X 'postag.de',
X 'redestb.es',
X 'rmcs.cranfield.ac.uk',
X 'schwaben.de',
X 'seicom.de',
X 'silsoe.cranfield.ac.uk',
X 'sky.fr',
X 'smart.is',
X 'sn.no',
X 'snerpa.is',
X 'sol.no',
X 'spectranet.ca',
X 'sprint.ca',
X 'sprintcanada.ca',
X 'stack.nl',
X 'sun-denshi.co.jp',
X 'sympatico.ca',
X 'telepac.pt',
X 'tin.it',
X '.to',
X 'uk.uu.net',
X 'uni-c.dk',
X 'unibe.ch',
X 'unicall.be',
X 'unik.no',
X 'uunet.ca',
X 'usask.ca',
X 'uvic.ca',
X 'varney.idbsu.edu',
X 'videotron.ca',
X 'wam.umd.edu',
X 'wanadoo.fr',
X 'worldnet.att.net',
X 'worldnet.fr',
X 'worldonline.nl',
X 'xs4all.nl',
X );
X
X %rematch_aliases = (
X 'nonexistent.com', 'X-NNTP-Posting-Host:',
X 'nym.alias.net', 'Message-Id:',
X );
X
X # TO DO: make the legal blurb country-specific. Need code to identify the
X # country of origin, and we need legal texts for more countries.
X
X # List of domains that are worthless spammers and will be ignored
X # I am omitting names that do not seem to have a DNS resolution. Write me
X # if you think this list has inaccuracies.
X @SPAMMERS = (
X # following names are defunct but needed by the adcomplain
X # regression tests....
X "juno.com",
X "mlmail.com",
X "nevwest.com",
X "primepromo.com",
X "tnlb.com",
X
X # Following thanks to maca...@aol.com 1997.09.11
X
X #AGIS is a rogue backbone provider under CEO Phil Lawlor, who may
X #be reached at ph...@agis.net and n...@agis.net. The upper management of
X #AGIS cuts off e-mail from persistent complainers. AGIS is the service
X #provider of the Internet E-mail Marketing Council, a political front
X #organization for several of the most notorious abusers of the Internet.
X #
X #Addresses for Phil Lawlor and AGIS include:
X #Lawlor, Phillip J.
X #7747 Minock Street
X #Detroit, MI 48228-4515
X #US
X #Apex Global Information Services
X #22015 West Outer Drive
X #Dearborn, MI 48124
X #US
X #Apex Global Information Services
X #3601 Pelham
X #Dearborn, MI 48124
X #US
X
# no DNS for agis.com
X "agis.net",
X
X # Cyber Promotions (Cyberpromo) (maca...@aol.com 1997.09.11)
X #Sanford Wallace is the leader of Cyber Promotions and sister companies
X #Cyberout Email Services, Cyber Promotions Autoresponder Services, and
X #the ISPam network. Cyberpromo is a member of the IEMMC. Sanford
X #Wallace may be found at: au...@mci.savetrees.com,
X #ie...@answerme.com, ie...@mci.savetrees.com,
X #postm...@answerme.cybermirror1.com, postm...@ispam.net,
X #pri...@answerme.cybermirror1.com, priv...@answerme.com,
X #priv...@answerme.cybermirror1.com, priv...@mci.savetrees.com,
X #priv...@spamford.com, ro...@answerme.cybermirror1.com,
X #st...@mci.savetrees.com, sta...@mci.savetrees.com,
X #wal...@answerme.cybermirror1.com, wal...@auto3.cybermirror1.com,
X #wal...@ispam.net, wal...@mci.savetrees.com,
X #wal...@temp.cyberpromo.com
X #
X #The true business address of Cyber Promotions is:
X #Cyber Promotions, Inc.
X #830 Twining RD STE 6 & 7
X #Dresher, PA 19025
X #US
X
# no DNS for 1-500-fingers.com
# no DNS for 1stbiz.com
# no DNS for 1stkidsclub.com
# no DNS for 1stservices.com
# no DNS for 1stworldwidemedia.com
# no DNS for 2mansions.com
# no DNS for 411network.com
# no DNS for 4yourpleasure.com
# no DNS for 50andup.com
X "6thsense.com",
X "7thmillennia.com",
# no DNS for abcguitars.com
# no DNS for abcybermall.com
# no DNS for ablocator.com
# no DNS for abvintl.com
# no DNS for accessiblepleasures.com
# no DNS for adbenterprises.com
# no DNS for adult-site.com
X "adult-webmaster.com",
# no DNS for adulteyesonly.com
# no DNS for advanced-web.com
# no DNS for alwaysaboveaverage.com
X "amazingproducts.com",
# no DNS for americancoin.com
# no DNS for americapro.com
# no DNS for amponline.com
X "amv-inc.com",
# no DNS for andrivel.com
# no DNS for androtec.com
# no DNS for answerme.com
# no DNS for apscheck.com
# no DNS for apsi.com
# no DNS for ar-web-service.com
# no DNS for artemis23.com
# no DNS for artimages.com
X "astroluz.com",
# no DNS for attoday.com
# no DNS for attorneycrawford.com
# no DNS for audioforum.com
# no DNS for awgroup.com
# no DNS for babchurch.org
# no DNS for banner-year.com
# no DNS for bell-co.com
# no DNS for best-solution.com
# no DNS for bhoman.com
# no DNS for big-web.com
# no DNS for bighotdeals.com
# no DNS for biolynx.com
# no DNS for biz-net-usa.com
# no DNS for biz-webmaster.com
X "bizhost.net",
# no DNS for bizimage.com
X "bizpromo.com",
# no DNS for bizstn.com
# no DNS for bluediamondu.com
X "bluehorizons.com",
X "bowecay.com",
# no DNS for breakthroughproducts.com
# no DNS for breakthruint.com
# no DNS for bridge-technologies.com
# no DNS for bvbotanicals.com
# no DNS for c-s-consulting.com
# no DNS for cafegirls.com
# no DNS for californiaonline.com
# no DNS for carproinc.com
X "cartridgeusa.com",
# no DNS for ccsplprod.com
# no DNS for ceeweb.com
# no DNS for celebritysex.com
# no DNS for centurycigar.com
X "cfn-net.com",
# no DNS for ch-export.net
# no DNS for chucklehead.com
# no DNS for claire.net
# no DNS for cloaked.com
# no DNS for collegezone.com
X "conceptsmg.com",
# no DNS for conestogasupply.com
# no DNS for consolidatedmold.com
# no DNS for contactmarket.com
# no DNS for coolmorning.com
X "corporateoffice.com",
# no DNS for cpmall.com
# no DNS for creativemedia.com
# no DNS for crt-enterprises.com
# no DNS for cspromo.com
# no DNS for cteam.com
X "cyber-pages.net",
# no DNS for cyber2100.com
# no DNS for cyberemag.com
# no DNS for cyberinfo.org
# no DNS for cybermaxx.com
# no DNS for cybermirror1.com
X "cybermoments.com",
# no DNS for cyberpath.org
# no DNS for cyberplanet.org
# no DNS for cyberpromo.com
# no DNS for cyberpromo.net
# no DNS for cyberpros.com
# no DNS for cyberstation.com
# no DNS for cyberwarecorp.com
# no DNS for d3vdo.com
# no DNS for darnassoc.com
# no DNS for datagoldsystems.com
# no DNS for daveowl.com
# no DNS for daviscomputers.com
# no DNS for debtkiller.com
# no DNS for deedeeprinting.com
X "delatech.com",
# no DNS for denco-bus.com
# no DNS for dens.com
# no DNS for desen.com
# no DNS for destination-unknown.com
# no DNS for developers-boutique.com
# no DNS for devotion.com
# no DNS for digital-market.com
# no DNS for digitalenergy.net
# no DNS for divcomm.com
# no DNS for doggygone.com
# no DNS for domainseller.com
# no DNS for dranimal.com
# no DNS for dreamhouse.org
# no DNS for dstrahan.com
# no DNS for e-health.com
# no DNS for earthfriends.com
# no DNS for easywave.com
# no DNS for eatatmuffys.com
# no DNS for econ-enterprises.com
X "eims-inc.com",
# no DNS for electro-mail.com
# no DNS for email2u.com
# no DNS for emailad.com
X "emutoday.com",
# no DNS for eroticconnections.com
# no DNS for eroticsites.com
# no DNS for ezwealth.com
# no DNS for fantasyone.com
# no DNS for fastcolor.com
X "fastone.com",
X "fastresults.com",
X "fatalblindness.com",
# no DNS for fdgd.com
# no DNS for feir.com
# no DNS for financialequities.com
# no DNS for findporn.com
# no DNS for findsuccess.com
X "fineberg.com",
# no DNS for first-team.com
X "foamworks.com",
# no DNS for foodmagic.com
X "fordandassoc.com",
# no DNS for fotip.com
# no DNS for fpausa.com
X "freedom4u.com",
# no DNS for freedomnet.net
# no DNS for freenudity.com
# no DNS for freepromo.com
# no DNS for freerelay.com
# no DNS for freerelays.com
# no DNS for freeresponder.com
X "freshflesh.com",
# no DNS for futurecybersongs.com
X "gemstars.com",
# no DNS for genasys-mechanical.com
# no DNS for generalstor.com
# no DNS for georgewalther.com
X "girlsplay.com",
# no DNS for glenfinnan.com
# no DNS for global-stock-exchange.com
# no DNS for globalitems.net
# no DNS for globalnet4u.com
# no DNS for globalwebestate.com
X "godhatesfags.com",
# no DNS for golcat.com
# no DNS for golden-pages.com
# no DNS for goldweb.net
# no DNS for good-earth.com
# no DNS for gotchi.com
# no DNS for gps2.com
# no DNS for growthbusassoc.com
# no DNS for growthfunding.com
# no DNS for grphcimgs.com
# no DNS for hardcore-pics.com
# no DNS for hbhinc.com
# no DNS for hiv-test.com
# no DNS for home-biz.net
# no DNS for hotboxx.com
X "hotlady69.com",
# no DNS for hottstuff.com
# no DNS for huxtableassociates.com
# no DNS for i-machine.com
# no DNS for ideastream.com
# no DNS for imc3.com
# no DNS for infinitelegacies.com
# no DNS for info-mart.com
# no DNS for info98.com
# no DNS for infofree.net
# no DNS for infofree.org
# no DNS for inforamp.org
# no DNS for infoutlet.com
# no DNS for inspireexcellence.com
# no DNS for inspirexcellence.com
# no DNS for interace.com
# no DNS for islandcoin.com
# no DNS for islandshores.com
# no DNS for islandtradersintl.com
# no DNS for ispam.com
# no DNS for ispam.net
X "jcgear.com",
# no DNS for jcpromotions.com
# no DNS for jobshopstaffing.com
# no DNS for jobspc.com
# no DNS for jpro.com
# no DNS for jservices.com
# no DNS for justamazing.com
# no DNS for kazuyoshi.com
# no DNS for kckprod.com
# no DNS for keepmailing.com
# no DNS for keygate.net
# no DNS for keyinfonet.com
# no DNS for klnv.com
X "koolshade.com",
# no DNS for kopensky.com
# no DNS for kzweb.com
# no DNS for labornet.com
X "ladygodivanetwork.com",
X "ladyjane.com",
# no DNS for lakeinwoodcampground.com
# no DNS for lakeinwoodsresort.com
X "larsonsauto.com",
X "laurient.com",
# no DNS for libertyteam.com
# no DNS for light-avenue.com
# no DNS for live-xxx.net
# no DNS for liveass.com
# no DNS for ljsimon.com
X "locationmanagement.com",
# no DNS for lrspublications.com
# no DNS for ltgcomm.com
# no DNS for lucky-star.com
# no DNS for luyoluyo.com
# no DNS for mail-gram.com
# no DNS for mailq.com
# no DNS for makingmoney1.com
# no DNS for mallmaster.com
# no DNS for managementresultsinc.com
# no DNS for marketing-center.com
# no DNS for marketingsuccess.com
# no DNS for marketnet.net
X "martianconsulate.com",
# no DNS for mary-world.com
# no DNS for mas-automate.com
# no DNS for matrixcapital.com
# no DNS for max2001.com
# no DNS for maxxmail.com
# no DNS for mega-meganets.com
# no DNS for megafone.com
# no DNS for megapromo.com
# no DNS for megatrendsystems.com
# no DNS for megaworx.com
# no DNS for megd.com
# no DNS for micosrcmall.com
# no DNS for microsrcmall.com
X "midnightmm.com",
# no DNS for midwestmkg.com
# no DNS for milfordcommptnrs.com
# no DNS for millennium-watch.com
# no DNS for millenniumconsultants.com
X "miltsparks.com",
# no DNS for miradainn.com
# no DNS for mistyshores.com
# no DNS for mlm-support.com
# no DNS for mlmman.com
# no DNS for mlmopolis.com
X "mlmwealth.com",
# no DNS for moneyaction.com
# no DNS for moneymaking.org
# no DNS for moneyspider.com
# no DNS for mortenconsulting.com
# no DNS for mountaineerhomes.com
# no DNS for mq.com
X "mrbo.com",
# no DNS for mtec2.com
# no DNS for mystars.com
X "nakedvisions.com",
# no DNS for natlp.com
# no DNS for navigation-station.com
# no DNS for nbirnbaum.com
# no DNS for nefis.com
# no DNS for neo-quest.com
# no DNS for nerworkersroadmap.com
# no DNS for net-offers.com
# no DNS for net-wwworth.com
X "netcenter.com",
X "netgenius.com",
# no DNS for nethello.com
# no DNS for netscum.net
# no DNS for netweddings.com
# no DNS for networkersroadmap.com
# no DNS for neverbusyfax.com
# no DNS for newdiscoveries.com
# no DNS for newmillenniumgroup.com
# no DNS for newxxx.com
X "nicers.com",
X "nim.com",
# no DNS for nj-retax.com
# no DNS for nmsystms.com
# no DNS for nordatasys.com
# no DNS for northpointe.net
X "novaproducts.com",
# no DNS for nsshops.com
# no DNS for nudemales.com
# no DNS for nudiegram.com
# no DNS for nyannyan.com
# no DNS for ogden1.com
X "ohioamish.com",
# no DNS for ohiosuperbike.com
X "online-success.com",
# no DNS for onlineprofit.com
X "only4adults.com",
X "opportunityhotline.com",
# no DNS for orbitmag.org
# no DNS for originalbodysugar.com
X "owned.com",
# no DNS for p-lenahan.com
# no DNS for p-strategies.com
# no DNS for pagansex.com
# no DNS for pagespages.com
X "partygirls.com",
X "pdfc-inc.com",
# no DNS for pedcom-la.com
# no DNS for peggyhn.com
# no DNS for pegmark.com
# no DNS for performanceplusdance.com
X "petbiz.com",
# no DNS for pfsconsulting.com
# no DNS for phdnet.net
# no DNS for phdnet.org
X "pier37.com",
# no DNS for pierenterprises.com
# no DNS for pigskininsider.com
# no DNS for pj-computing.com
# no DNS for planetroanoke.com
# no DNS for platinumteam.com
# no DNS for platos.com
# no DNS for playforprofit.com
# no DNS for pleaseread.com
X "pleasurecraft.com",
# no DNS for pleasureproducts.com
# no DNS for plusnow.com
# no DNS for powermarket.net
# no DNS for powertise.com
# no DNS for princess-diana-home.com
# no DNS for princess-to-all.com
# no DNS for prininfo.com
# no DNS for probasketball.com
X "probe2000.com",
X "profitwave.com",
# no DNS for proof.net
# no DNS for pure-lust.com
# no DNS for puresmut.com
# no DNS for pynet.com
# no DNS for quintessentialsinc.com
# no DNS for rainpartner.com
X "rapiddrug.com",
X "ratite-mall.com",
# no DNS for realmoneynow.com
# no DNS for realtimemedia.com
X "realtimesystems.com",
# no DNS for refcom.com
# no DNS for reichl.com
# no DNS for resumes-on-disk.com
# no DNS for rhokis.com
X "rkn.com",
# no DNS for robustcordless.com
# no DNS for romanceoutlet.com
# no DNS for roobar.com
# no DNS for rtsweb.com
# no DNS for runtouch.com
X "sabith.com",
# no DNS for samalama.com
# no DNS for samenet.com
# no DNS for samintlinc.com
# no DNS for savannahlakesvillage.com
# no DNS for savenergy.com
# no DNS for savetrees.com
# no DNS for scamford.com
# no DNS for scamford.net
# no DNS for scamford.org
X "schooltips.com",
X "scottees.com",
# no DNS for screwed-up.com
# no DNS for sdcfc.com
# no DNS for sdmr.com
X "seamaxx.com",
# no DNS for seduce.com
X "several.com",
# no DNS for sexcitychronicles.com
# no DNS for sexgeardesigns.com
X "sexland.com",
# no DNS for sexlink.com
X "sexmansion.com",
# no DNS for sexplex.com
X "sfedora.com",
# no DNS for sharit.com
# no DNS for shemalesex.com
# no DNS for shematech.com
# no DNS for ship-n-save.com
X "silveradopdx.com",
# no DNS for slmslm.com
# no DNS for spamford.com
# no DNS for spamford.net
X "spencepublishing.com",
X "stake-your-claim.com",
# no DNS for stobbs.com
# no DNS for stoneinc.com
# no DNS for strategicmail.com
# no DNS for strutyourstuff.com
# no DNS for stuffed.com
# no DNS for success-excellence.com
# no DNS for sultans-harem.com
X "sunrisetrading.com",
X "sunsetpark.com",
# no DNS for superfortress.com
X "superparty.com",
# no DNS for superweb.net
# no DNS for tactique.com
# no DNS for talktel.com
# no DNS for tamsmedia.com
# no DNS for taras-intl.com
# no DNS for tarasys-rdx.com
# no DNS for taser.com
X "teakusa.com",
# no DNS for techsol-chemical.com
# no DNS for temalloy.com
X "temple-x.com",
# no DNS for the-1.com
X "thebldg.com",
X "theduplicator.com",
X "theglobalmarketer.com",
# no DNS for thephotostudio.com
# no DNS for therightstart.com
# no DNS for thethornco.com
X "tickettime.com",
# no DNS for tiffanyxxx.com
# no DNS for tip-sheet.com
X "toptek-tmi.com",
# no DNS for tosguard.com
# no DNS for totallynude.com
# no DNS for tp-associates.com
# no DNS for tpitravel.net
# no DNS for tpnid.com
# no DNS for tradingroom.com
# no DNS for trueteam.com
# no DNS for tweakusa.com
# no DNS for twenty-firstsentry.com
# no DNS for ubs95.com
# no DNS for uncommonmarket.com
# no DNS for uprosper.com
# no DNS for vd.com
# no DNS for vianett.com
# no DNS for virtualblonde.com
# no DNS for virtualslut.com
X "visionquest.com",
# no DNS for vitamincity.com
# no DNS for viteal.com
# no DNS for wallstr278.com
X "wattmaster.com",
# no DNS for wbuilders.com
# no DNS for wealthexpress.com
# no DNS for webcruiser.com
# no DNS for webdirectusa.com
# no DNS for webevangelist.com
# no DNS for webnetbooks.com
X "webspecific.com",
# no DNS for webtradectr.com
# no DNS for weeklyhoroscope.com
# no DNS for well-ness2.com
# no DNS for wholesaleclubcybermall.com
X "wildcardstudios.com",
# no DNS for wilmingtonhomes.com
# no DNS for wiltechctr.com
# no DNS for wisdomnow.com
# no DNS for wisefool.com
X "wnyftz.com",
# no DNS for worldofserenity.com
# no DNS for worldwizard.com
# no DNS for wwins.org
X "wwmen.com",
# no DNS for x-18.com
# no DNS for x-ratedweb.com
X "xxx-search.com",
# no DNS for xxxbecky.com
# no DNS for xxxsc.com
X "y2kconsult.com",
X "yepitslegal.com",
# no DNS for yfrc.com
# no DNS for ynterpro.com
# no DNS for zearesservices.com
# no DNS for zlite.com
# no DNS for zorro-rojo.com
X
X # CyberTize Email (LLV)
X
# no DNS for 1daystar.com
# no DNS for 4netbiz.com
# no DNS for a1research.com
# no DNS for aa-money.com
# no DNS for aaanews.com
# no DNS for adt-services.com
# no DNS for adult-ads.com
# no DNS for af100.com
X "amcservices.com",
# no DNS for amorosoisland.com
# no DNS for aremis.com
# no DNS for atops.com
# no DNS for avidoutdoor.com
# no DNS for awardmail.com
# no DNS for bankcardservice.com
# no DNS for bbd.net
# no DNS for bebig.com
# no DNS for beetu.com
# no DNS for bei21.com
# no DNS for bignotes.com
# no DNS for bizemall.com
# no DNS for bizservice.com
# no DNS for bonsaipr.com
X "bulkemail.net",
# no DNS for bulseye.com
# no DNS for cache-in.com
# no DNS for carpet-barn.com
# no DNS for cash4u2.com
# no DNS for cashtown.com
# no DNS for cdpromo.com
# no DNS for chocolate-diet.com
X "citycity.com",
# no DNS for cjdmedia.com
# no DNS for cnntec.com
# no DNS for computebiz.com
# no DNS for cona.net
# no DNS for conceptsmktg.com
# no DNS for connectingamerica.com
# no DNS for connectingamerica.net
# no DNS for countryvillas.com
# no DNS for crazyjay.com
X "creditmds.com",
# no DNS for cyber-amish.com
# no DNS for cyber-tize-email.com
# no DNS for cyberbytes.com
# no DNS for cybertimesweekly.com
# no DNS for cybertize-email.com
# no DNS for dandestiny.com
# no DNS for dczinc.com
# no DNS for downlinesystem.com
# no DNS for dpcinfoserv.com
# no DNS for e-mail-help.com
# no DNS for e-mailhelp.com
# no DNS for e-offers.com
# no DNS for ebraun1948.com
# no DNS for econopromo.com
# no DNS for ecoship.com
# no DNS for elksrainbow.com
# no DNS for email-help.com
# no DNS for emailstore.net
# no DNS for emailxpress.com
# no DNS for entertainmentnetwork.com
X "ez-solutions.com",
X "faunafactory.com",
# no DNS for fgige.com
# no DNS for finpubs.com
# no DNS for first-star.com
# no DNS for footballbet.com
# no DNS for forgetmenotinc.com
# no DNS for framepub.com
X "freebiz.com",
# no DNS for freefun.com
# no DNS for friendlymail.com
# no DNS for frsco.com
# no DNS for futurejob.com
# no DNS for gallanewguy.com
# no DNS for gasaver.com
X "gaylesbiantips.com",
# no DNS for gentrace.com
# no DNS for global-prosperity.com
# no DNS for globalmarketinggroup.com
# no DNS for globalrealestate-lv.com
# no DNS for globalwebcasting.com
# no DNS for globesystems.com
# no DNS for gmgonline.com
# no DNS for goldencareers.com
# no DNS for goodinfo.com
X "gr8fx.com",
# no DNS for grandlottery.com
# no DNS for guardian-global.net
# no DNS for gulfco.com
# no DNS for hbfirst.com
# no DNS for herbalone.com
# no DNS for highrater.com
# no DNS for hitmasters.com
# no DNS for hornyharry.com
# no DNS for hostsystem.com
# no DNS for hotsuccess.com
# no DNS for iersc.com
# no DNS for imailit.com
# no DNS for imgi.com
# no DNS for in2surfin.com
# no DNS for infinitycash.com
X "inquest.com",
# no DNS for internet-privacy.com
X "inventorsdisplay.com",
# no DNS for jaysen.com
# no DNS for jehaldeman.com
# no DNS for jerrysmith.com
# no DNS for jjbyes.com
# no DNS for jointhenetwork.com
# no DNS for juice4u.net
# no DNS for kadosh.com
X "keystonemarketing.com",
# no DNS for kidswsn.com
X "kwsnews.com",
X "lasvegasmall.com",
# no DNS for lbnews.com
# no DNS for lcp-yoda.com
# no DNS for lcrv.com
X "lectricnet.com",
# no DNS for leipro23.com
# no DNS for letzlink.com
# no DNS for limitles.com
# no DNS for llv.com
# no DNS for llv.net
# no DNS for lostvegas.com
# no DNS for lunarlink.com
# no DNS for mail-help.com
# no DNS for mail-response.com
X "mailmaster.com",
# no DNS for makethatcallnow.com
# no DNS for many.com
# no DNS for mapsone.com
X "maritaltips.com",
# no DNS for marketing-pro.com
# no DNS for mdwst.com
X "mentalcompetency.com",
# no DNS for miroe.com
# no DNS for mlmail.com
# no DNS for mlmonline.net
# no DNS for mmsco.com
X "moderncrs.com",
# no DNS for moneymkr.com
# no DNS for mortgagemgr.com
# no DNS for motherlodeinternet.com
X "mountaincoin.com",
# no DNS for mpax.com
X "msoi.com",
# no DNS for mub.com
# no DNS for mynumber.com
# no DNS for nationsflooring.com
# no DNS for ndoki.com
# no DNS for net-privacy.com
# no DNS for netexpedite.com
# no DNS for netflyers.com
# no DNS for network-success.com
# no DNS for nevwest.com
# no DNS for new-start.com
X "nmcgold.com",
# no DNS for no-taxes.com
X "nudesgalore.com",
X "nutritionadvice.com",
# no DNS for offshorefortunes.com
# no DNS for okbombgrandjury.org
# no DNS for onvacation.com
X "onyourdesktop.com",
# no DNS for oppsunlimited.com
# no DNS for orderamerica.com
# no DNS for parcellink.com
X "picsmallbiz.com",
# no DNS for prntinfo.com
# no DNS for productlisting.com
X "proffer.com",
# no DNS for promoprint.com
X "psybertech.com",
# no DNS for psychics-reading.com
# no DNS for psychics-tarot.com
# no DNS for psychquestions.com
# no DNS for psychtips.com
# no DNS for publisherclearinghouse.com
# no DNS for qlink2info.com
# no DNS for qualitydentallab.com
# no DNS for readmenow.com
# no DNS for reportsrus.com
# no DNS for rivirkaienterprises.com
# no DNS for rmjent.com
# no DNS for robbieg.com
# no DNS for roxacom.com
X "scscc.com",
# no DNS for search-engine-news.com
# no DNS for search-engine-secrets.com
# no DNS for search-engine-tips.com
# no DNS for search-engine-update.com
X "searchengine-help.com",
X "searchengine-news.com",
# no DNS for searchengine-secrets.com
# no DNS for searchengine-tips.com
# no DNS for searchengine-update.com
X "searchenginehelp.com",
# no DNS for searchenginenews.com
X "searchenginetips.com",
# no DNS for searchengineupdate.com
# no DNS for seductress.com
# no DNS for serenityworld.com
X "sextips.com",
X "slamtech.com",
# no DNS for softfacts.com
# no DNS for speechrecognition.com
X "spfcorp.com",
# no DNS for sputum.org
# no DNS for striveforscss.com
# no DNS for successinternational.com
# no DNS for sunnycoast.com
# no DNS for sup-cou-svc.com
# no DNS for surf-city-usa.com
# no DNS for sweetmother.org
# no DNS for swissoffshore.com
# no DNS for taxesplus.com
# no DNS for tectel.com
X "tel-tech.com",
# no DNS for teleweb61.com
# no DNS for tennisodds.com
# no DNS for the-shack.com
# no DNS for the-web-presence.com
# no DNS for tkentertain.com
X "tokens.com",
# no DNS for tradersnet.com
X "treefree.com",
X "trueway.com",
X "ucworld.org",
# no DNS for urbornfree.com
# no DNS for urhealthy.com
# no DNS for uspacmall.com
# no DNS for valuplus.com
# no DNS for vegassluts.com
X "virtualuniverse.com",
# no DNS for vtek-email.com
# no DNS for wallstreetcoinbuyers.com
X "warpmail.com",
# no DNS for wbcards.com
# no DNS for wealth4u2.com
# no DNS for wealthwise.net
# no DNS for web-privacy.com
# no DNS for webcert.com
X "webdreamer.com",
# no DNS for webguides.com
# no DNS for webprivacy.com
# no DNS for wehelpyou.com
# no DNS for wesmark.com
X "whitenteeth.com",
X "wildwomen.com",
# no DNS for winatlife.com
X "wordmaker.com",
# no DNS for worldpowers.com
# no DNS for worldtrace.com
X "wsjr.com",
# no DNS for wtcwwide.com
# no DNS for wthomas.com
# no DNS for wvvw.com
# no DNS for wweagles.com
# no DNS for www-newvisions.com
X "xxxtimes.com",
# no DNS for zasoftsales.com
# no DNS for zeecom.com
# no DNS for zignzag.com
# no DNS for zontroop.com
X
X # Integrated Media Promotions Corp. (Nancynet)
X #Nancynet is a rogue site owned by Zack Everett, who has been known to
X #operate under the probable alias of Gladys Crocker. His known e-mail
X #addresses are: postm...@nancynet.com, ro...@nancynet.com,
X #gla...@nancynet.com, ma...@sallynet.com, postm...@sallynet.com,
X #ro...@sallynet.com, webm...@nancynet.com, ne...@nancynet.com,
X #b...@nancynet.com, uu...@sallynet.com, s...@sallynet.com,
X #webm...@sallynet.com, and c...@sallynet.com. Nancynet, known
X #also as Nancy's Network Name Services, is a member of the IEMMC.
X #
X #The true business address of Everett is at:
X #2735 Greenwich Street
X #San Francisco, CA 94123
X #US
X #
X #Extreme caution is advised if one wishes to contact Everett in person,
X #because of allegations that he has physically attacked his detractors.
X
# no DNS for 2020nuvision.com
# no DNS for 2promote.com
# no DNS for abanks.com
# no DNS for abenet.com
# no DNS for access20112.com
# no DNS for adult-info.com
X "adult-videos.com",
# no DNS for adult-websites.com
# no DNS for adv-int-mar-sys.com
# no DNS for advernetexpress.com
# no DNS for alderneynet.com
X "allvip.com",
# no DNS for amateurcds.com
X "apisco.com",
# no DNS for appreciated.com
# no DNS for arcturus.net
# no DNS for ascella.net
X "asian-babes.com",
# no DNS for astrobiz.com
# no DNS for bankofmail.com
# no DNS for bankomail.com
# no DNS for best-deal-magazines.com
# no DNS for biz-man.com
X "bjain.com",
# no DNS for bossuet.com
X "breze.com",
X "brokernet.net",
# no DNS for bsi-inter.com
# no DNS for bulk-e-mail.com
# no DNS for buy-co.com
# no DNS for bways.com
# no DNS for c-advertising.com
X "capella-systems.com",
X "capella.net",
# no DNS for cashflash.com
# no DNS for ccburns.com
X "center4mail.com",
# no DNS for chatpower.com
# no DNS for cheapo-intl.com
# no DNS for cheapointl.com
# no DNS for choice-biz.com
# no DNS for choicemail.com
# no DNS for chrise.com
# no DNS for clarie.com
# no DNS for college-easy.com
# no DNS for coolservices.com
# no DNS for cooltoy.com
# no DNS for crown-toss.com
# no DNS for ctynet.com
# no DNS for cybertecpro.com
# no DNS for dahlianet.com
X "deep-discount.com",
# no DNS for delapaz.com
# no DNS for demma.org
# no DNS for digital-coupons.com
# no DNS for direct-offer.com
# no DNS for directpublicoffer.com
# no DNS for directsend.com
X "dirtyteens.com",
# no DNS for dposonline.net
# no DNS for dpoticker.net
# no DNS for dragonindustries.com
# no DNS for dreamersonline.com
# no DNS for e-mail-it.com
# no DNS for electricbroker.com
# no DNS for electrictombstone.com
# no DNS for emailogram.com
X "engspalace.com",
# no DNS for equishare.com
# no DNS for evanns.com
# no DNS for fgjnet.com
# no DNS for fortune2000.com
# no DNS for gamelin.com
# no DNS for gascardman.com
# no DNS for getstuff.com
# no DNS for ginette.com
# no DNS for gosnet.com
# no DNS for hochelaga.com
# no DNS for homebiz-link.com
# no DNS for hootowl.com
# no DNS for hot-asians.com
# no DNS for hotname.com
X "howdee.com",
# no DNS for hugemall.com
# no DNS for hyperway.com
# no DNS for ibrainstorm.com
# no DNS for ideas4cash.com
# no DNS for ilast.com
# no DNS for ilovetexas.com
# no DNS for info-soup.com
# no DNS for infoceiling.com
# no DNS for infofloor.com
# no DNS for inforevo.com
# no DNS for infowall.com
# no DNS for innovated.com
# no DNS for inside-secrets.com
# no DNS for ipobiz.net
# no DNS for ipreneur.com
# no DNS for ispbuilders.com
X "jccorp.com",
# no DNS for ji4x.com
# no DNS for jiffyad.com
# no DNS for jmjd.com
X "johnholleman.com",
# no DNS for lacordaire.com
# no DNS for lawonet.com
X "lazypays.com",
# no DNS for lbtel.com
# no DNS for legitmail.com
# no DNS for liame.com
# no DNS for linktheworld.com
# no DNS for littlebig.net
# no DNS for livinghopemin.com
# no DNS for love-buyers.com
# no DNS for lovebuyers.com
# no DNS for luv-buyers.com
# no DNS for magicmailers.com
# no DNS for mail-to-go.com
# no DNS for master-graphics.com
X "mbvv.com",
# no DNS for meicms.com
# no DNS for mikeking.com
X "mitnet.net",
# no DNS for mitnetdpo.com
X "momma-says.com",
# no DNS for moneygroup.com
# no DNS for monoman.com
# no DNS for montreal-here.com
# no DNS for montrealnord.com
# no DNS for morefreestuff.com
# no DNS for mortgage-motivator.com
# no DNS for msmarketplace.com
# no DNS for nancynet.com
X "nasty-boys.com",
X "nasty-cheerleaders.com",
X "nasty-schoolgirls.com",
X "nastynet.net",
# no DNS for nat-biz-serv.com
X "nelsonpubl.com",
# no DNS for net-recon.com
# no DNS for netcell.com
# no DNS for netchievers.com
# no DNS for networkrecruiters.com
# no DNS for neuranet.com
# no DNS for newprofits.com
# no DNS for nutritionanalysts.com
# no DNS for odana.com
# no DNS for olem.com
# no DNS for olema.com
X "olma.net",
# no DNS for onlineofferings.com
# no DNS for osouthmk.com
# no DNS for otcnetbusiness.com
# no DNS for pacific-publishing.com
X "pamsex.com",
X "pamvideo.com",
# no DNS for patricianet.com
# no DNS for pcmatrix.com
X "pennymovers.com",
# no DNS for phone-talk.com
# no DNS for pieix.com
# no DNS for pkbnet.com
# no DNS for pointe-aux-trembles.com
# no DNS for pointeclaire.com
# no DNS for ponypress.com
# no DNS for primesolution.com
# no DNS for promanageco.com
# no DNS for promotions2000.com
# no DNS for psychic-astrology.com
# no DNS for psychic-tarot.com
# no DNS for pteclaire.com
# no DNS for public-offernet.com
# no DNS for publicoffer.net
# no DNS for pxme.com
# no DNS for quest-teletron.com
X "quinella.com",
# no DNS for rammaps.com
# no DNS for rcomputer.com
# no DNS for read-this-now.com
# no DNS for readthisnow.com
# no DNS for regulus.net
# no DNS for rensaw.com
# no DNS for reply2me.com
# no DNS for residual-income.com
X "robinwing.com",
X "russiansexy.com",
# no DNS for sallynet.com
# no DNS for sandgrabber.com
# no DNS for scottallen.com
X "searchforit.com",
# no DNS for selmark2.com
# no DNS for senneville.com
# no DNS for servinfo.com
# no DNS for sexbanner.com
# no DNS for sexy-cheerleaders.com
X "sexy-girls.com",
# no DNS for sexy-latinas.com
X "sexy-stars.com",
X "shilohpub.com",
# no DNS for shop-smart.com
X "sia-corp.com",
X "source-technology.com",
# no DNS for spacemail.com
# no DNS for spamnet.com
X "spica-it.com",
# no DNS for spica.net
# no DNS for spiderteam.com
# no DNS for st-lambert.com
# no DNS for st-leonard.com
X "stamps-america.com",
# no DNS for sterling-companies.com
# no DNS for stlambert.com
# no DNS for stleonard.com
# no DNS for stockbiz.net
# no DNS for stsim.net
# no DNS for summit-travel.com
# no DNS for sur-prise.net
# no DNS for svetlana-spb.com
# no DNS for sysopman.com
# no DNS for t3-com.com
# no DNS for tarsey.com
# no DNS for tech-shop.com
# no DNS for techtronix.com
# no DNS for teen-porn.com
X "teen-porno.com",
# no DNS for telcomnet.com
# no DNS for tellthem.com
# no DNS for the-educator.com
# no DNS for theegrail.com
# no DNS for thistlenet.com
# no DNS for toplis.com
# no DNS for truehealth.com
# no DNS for ultra-mail.com
# no DNS for ultramailweb.com
# no DNS for uniquepo.com
# no DNS for unisender.com
# no DNS for upsouth.com
# no DNS for urmailed.com
X "usa1-inc.com",
# no DNS for verenanet.com
# no DNS for vester.com
# no DNS for veuillot.com
# no DNS for videnet.com
# no DNS for videosucks.com
# no DNS for viger.com
# no DNS for viking-africa.com
# no DNS for wakemail.com
# no DNS for wbcglobal.com
# no DNS for we-sell-it.com
# no DNS for we-sell.com
X "wealthsource.com",
# no DNS for weesell.com
X "windansea1.com",
# no DNS for worldwidepromo.com
# no DNS for xservicex.com
# no DNS for yesofcourse.com
X "young-marketing.com",
# no DNS for youreceivemail.com
X
X # Prime Data Worldnet Systems (Vernon Hale)
X #Hale's known e-mail addresses are: st...@mail2.netfree.com.
X
# no DNS for a-1floodgate.com
# no DNS for clearpen.com
# no DNS for edcba.com
# no DNS for emailtek.com
# no DNS for fldgbest.com
# no DNS for flsupport.com
# no DNS for getrichfast.com
# no DNS for ineffable.com
# no DNS for internet4biz.com
# no DNS for lotsofmoney.com
# no DNS for lowestprices.com
# no DNS for mailout.com
# no DNS for netfree.com
# no DNS for pdwsi.com
# no DNS for prdasyin.com
# no DNS for primedatasystems.com
# no DNS for respondback.com
# no DNS for teksupp.com
# no DNS for vhfldg.com
X
X # Quantum Communications (Quantcom)
X #Quantcom is an unregistered corporation operated by Walt Rines, who
X #is the spokesman for the IEMMC, of which Quantcom is a member.
X #Rines may be reached at: st...@quantcom.com.
X
# no DNS for ads-are-us.com
# no DNS for ads-r-nicers.com
# no DNS for ansonline.com
# no DNS for barelylegals.com
# no DNS for bex.net
# no DNS for cityhotline.com
# no DNS for civuni.com
# no DNS for clubmates.com
# no DNS for columbus1492.com
X "contactdata.net",
# no DNS for cybermarketplace.net
# no DNS for cyberrunner.net
# no DNS for cybertools.net
# no DNS for e-portfolio.com
# no DNS for flconnect.com
# no DNS for fone-tastic.com
# no DNS for freesvcs.com
# no DNS for globalreachmktg.com
X "goyellow.com",
# no DNS for i-b-nicers.com
# no DNS for i-c-nicers.com
# no DNS for iemmc.org
# no DNS for inneraction.com
# no DNS for instantloans.com
# no DNS for inter-mail.com
# no DNS for inter-pro.net
# no DNS for iwannaknow-nicers.com
# no DNS for linkstrader.com
# no DNS for max2001isp-a.com
# no DNS for meritrecords.com
# no DNS for mmaildirect.com
# no DNS for modelsdaily.com
# no DNS for monthlywines.com
# no DNS for netsky.net
# no DNS for networker.net
# no DNS for outgoing.com
X "parlez-vous.com",
X "personalbest.net",
# no DNS for playboyxxx.com
# no DNS for playmatelive.com
# no DNS for quantcom.com
# no DNS for reallivesex.com
# no DNS for reallivexxx.com
# no DNS for requestedinfo.com
# no DNS for smfrankcoinc.com
# no DNS for starrecords.com
# no DNS for successmail.com
# no DNS for t-3net.com
# no DNS for tankset.com
# no DNS for usedbook.com
# no DNS for virtualvineyards.net
# no DNS for volupta.com
X "walkeradvertising.com",
# no DNS for webtimetv.com
# no DNS for will2win.com
# no DNS for winacar.net
# no DNS for zonman.com
X
X # Eric Ralls
X # Eric Ralls is only one of his aliases. He also goes by these names:
X # Erik Ralls, Eric Barrett, Eric Price, Pathway International,
X # Shawn Barrett, and Global Financial.
X #
X #Ralls' known e-mail addresses are: er...@globalfn.com,
X #gat...@1stchoicecom.com, gat...@gatewayint.com,
X #gat...@globalprosp.com, gat...@globalprosper.com,
X #gat...@pathinternational.com, hori...@newhorizonsads.com,
X #pat...@pathwayintl.com, postm...@globalprosper.com,
X #ra...@brobro.com (not listed with internic), ra...@goodnet.com,
X #tb...@netzone.com, twe...@gatewayfin.com (not listed with internic),
X #and glo...@globalfinc.com.
X
# no DNS for 1stchoicecom.com
# no DNS for brobro.com
# no DNS for fortunefive.com
X "gatewayfin.com",
# no DNS for gatewayfree.com
# no DNS for gatewayinc.com
# no DNS for gatewayint.com
# no DNS for globalfinan.com
# no DNS for globalfinc.com
# no DNS for globalfn.com
# no DNS for globalprosp.com
# no DNS for globalprosper.com
# no DNS for marketglobally.com
# no DNS for marketingsolution.com
# no DNS for newhorizonsads.com
# no DNS for nwhorizons.com
# no DNS for pathinternational.com
# no DNS for pathwayintl.com
# no DNS for progressfort.com
# no DNS for seriousincome.com
# no DNS for universal-teltech.com
X
X # WebCareers (thehitman.com)
X
X "2von.com",
# no DNS for 602-sexy.com
# no DNS for abc100bulletin30.com
X "advantage-mkt.com",
X "aimdirect.net",
# no DNS for alternativeproducts.com
# no DNS for alwaysinnature.com
# no DNS for amymktg.com
# no DNS for aol1.com
# no DNS for bestcoach.com
# no DNS for bestops.com
# no DNS for better-life.net
# no DNS for bitic.com
# no DNS for bizmkt.com
# no DNS for biznetcards.com
# no DNS for bizprom.com
# no DNS for c-mass.com
# no DNS for cashingin.com
# no DNS for casnetwork.com
# no DNS for changes4u.com
# no DNS for chardap.com
# no DNS for clinesworld.com
# no DNS for combiz.com
# no DNS for compsrv.com
# no DNS for compusrv.com
X "computec.com",
# no DNS for corporate-filings.com
X "corproadkill.com",
# no DNS for cosmicflyer.com
# no DNS for cp-grp.com
# no DNS for cpublishing.com
# no DNS for cyber-cd.com
# no DNS for cyber-edge.com
X "cyberamish.com",
# no DNS for dapconcepts.com
# no DNS for deaa.com
# no DNS for digitaltechnology.com
# no DNS for dna-1.com
X "dollarmagic.com",
# no DNS for drjohnenterprises.com
# no DNS for eagle-team.com
# no DNS for earthorbit.com
# no DNS for elan-vital.com
# no DNS for electricpostoffice.com
# no DNS for email-man.com
# no DNS for emailblaster.com
# no DNS for entertowin.com
# no DNS for exsoft.net
# no DNS for extractor-pro-company.com
# no DNS for extractor-software.com
X "extractor.com",
# no DNS for extractormarketing.com
# no DNS for extractorpro.net
# no DNS for extractorpro6.com
# no DNS for extractorsoftware.com
# no DNS for ez-cash.com
# no DNS for fastserver.com
X "flashflood.com",
X "floater.com",
X "foefoe.com",
# no DNS for free-2-choose.com
# no DNS for freeusa.com
# no DNS for futur-tec.com
# no DNS for futurebiz.com
# no DNS for futurecareers.com
# no DNS for futuretech-enterprises.com
# no DNS for genevision.com
# no DNS for giantheap.com
# no DNS for globalmarketingmgmnt.com
# no DNS for goldenadventures.com
# no DNS for goldminegroup.com
# no DNS for gottaknow.com
# no DNS for greenharvest.com
X "hitenter.com",
# no DNS for hitsrus.com
# no DNS for homepowerbiz.com
# no DNS for hot-secrets.com
X "hotemail.com",
# no DNS for idm-associates.com
# no DNS for imaging-ink.com
# no DNS for impactmarketing.com
X "incomeunlimited.com",
# no DNS for inetcareers.com
X "infounderground.com",
# no DNS for insideinfo.net
# no DNS for integrity316.com
# no DNS for intmktgrp.com
# no DNS for intquest.com
X "ipm.org",
# no DNS for isupport.com
# no DNS for jbsnetwork.com
X "joinmd.com",
# no DNS for kash-flo.com
# no DNS for kdenter.com
# no DNS for koolcom.com
# no DNS for kowabunga.net
# no DNS for lapruchase.net
# no DNS for lapurchase.com
# no DNS for lapurchase.net
# no DNS for lightningads.com
X "livecoral.com",
# no DNS for look2east.com
# no DNS for lotsmorehits.com
# no DNS for louisianapurchase.com
# no DNS for lvcpub.com
# no DNS for magicsand.com
# no DNS for magnoliainvest.com
# no DNS for mailads.com
# no DNS for mailformoney.com
# no DNS for mailformoney.net
X "marketingmaster.com",
# no DNS for megamoneymakers.com
X "message4u.com",
# no DNS for mgtsolutions.com
# no DNS for mjdenterprises.com
# no DNS for mkt-america.com
# no DNS for mkt-usa.com
# no DNS for mny.com
# no DNS for moreorders.com
# no DNS for musclelab.com
# no DNS for natronics.com
# no DNS for naturalinstincts.com
# no DNS for naturalone.com
# no DNS for netmarketer.com
# no DNS for netprol.com
# no DNS for netwealth.com
# no DNS for neuworld.com
# no DNS for newguru.com
# no DNS for newsyoucanuse.com
# no DNS for no-more.com
# no DNS for noblehouse.com
# no DNS for nuffmoney.com
# no DNS for numrouno.com
X "oilfieldtrash.com",
# no DNS for omegateam.com
X "online-group.com",
X "onlinebiz.net",
X "opportunityzone.com",
# no DNS for personal-fitness.com
# no DNS for planetwealth.com
# no DNS for po-no-mo.com
# no DNS for popcornmarketing.com
# no DNS for postamt.com
# no DNS for power-agents.com
# no DNS for powernetmarketing.com
# no DNS for ppdpangea.com
# no DNS for pplia.com
X "precisionathletics.com",
# no DNS for privatesite.com
X "pstt.com",
# no DNS for pussyzone.net
# no DNS for pwrmarket.com
# no DNS for rapidconnect.com
# no DNS for rapidconnect.net
# no DNS for rem2000.com
# no DNS for replyman.com
# no DNS for resell.com
# no DNS for residualimpact.com
# no DNS for rmlent.com
# no DNS for rocketman.net
X "roxxyy.com",
# no DNS for rtaak.com
# no DNS for secondincome.com
# no DNS for sexcareers.com
# no DNS for sheeva.com
# no DNS for shire.com
# no DNS for simpletonftp.com
# no DNS for simsmarketing.com
# no DNS for site-invite.com
# no DNS for smdiinc.com
# no DNS for sonicmail.net
# no DNS for sosmlm.com
X "spec-fx.com",
X "speedweb.net",
X "stagg11.com",
# no DNS for stardrifter.com
# no DNS for stateof.com
# no DNS for success4u2.com
# no DNS for systemtec.com
# no DNS for t3comm.com
# no DNS for taik.com
# no DNS for tanseyteam.com
# no DNS for team-inspire.com
X "telnetwork.com",
# no DNS for the-happy-shopper.com
X "thehitman.com",
# no DNS for theinfoman.com
X "themailman.com",
X "themoneygroup.com",
# no DNS for theparlor.net
# no DNS for theparlornetwork.com
# no DNS for thinking-of-you.com
# no DNS for tours2.com
# no DNS for tpfcan.com
# no DNS for treasuresntravel.com
# no DNS for ttpromote.com
# no DNS for veteransdistribution.com
X "virtual-stampede.com",
# no DNS for we-work-for-you.com
# no DNS for we2ez.com
# no DNS for webcallerid.com
X "webcareers.com",
X "webjail.com",
X "webmaster1.com",
# no DNS for websitecallerid.com
# no DNS for webspecials.com
# no DNS for westwindmerch.com
# no DNS for winetusa.com
# no DNS for winker-n-assoc.com
X "worldlaunch.com",
# no DNS for www-wildcard.com
# no DNS for you-are-right.com
X "zest4life.com",
X
X # bob williams/willie newel domains
# no DNS for chag.com
X "chancellor.com",
# no DNS for natureplus.com
# no DNS for netamerica1.com
X "stockpick.com",
# no DNS for zygn.com
X "zygon.com",
X
X # more alleged cyberpromo domains
# no DNS for 1stamend.com
# no DNS for bu1kemai1.com
X "gamut.com",
# no DNS for gohomeray.com
# no DNS for hereyougo.com
# no DNS for internetfree.com
# no DNS for mailreport.com
# no DNS for massemail.com
X "massmarket.com",
# no DNS for noblock.com
# no DNS for nocensorship.com
# no DNS for promocyber.com
# no DNS for randomdomain.com
# no DNS for reedrules.com
# no DNS for sanfordw.com
# no DNS for savepaper.com
# no DNS for sndsngnwgift.com
# no DNS for stoptheblock.com
# no DNS for swallace.com
# no DNS for yougotmail.com
X "youvegotmail.com",
X
X # camelot.net
# no DNS for davenda.com
# no DNS for eager4u.com
# no DNS for excited4u.com
# no DNS for hunkview.com
# no DNS for intense4u.com
# no DNS for lust4u.com
# no DNS for pleasure4u.com
# no DNS for rosepin.com
# no DNS for seemen.com
# no DNS for spicy4u.com
# no DNS for studline.com
# no DNS for xtc4u2c.com
X
X # AOL 1996.10.25 block-list
X "businesslink.net",
# no DNS for hotgrrls.com
# no DNS for ibb.com
# no DNS for l-e-n.com
# no DNS for luv2cu.com
# no DNS for snappy.com
# no DNS for sweinc.com
X
X # added by djp (personal experience)
X "6t9.com",
X "concentric.net",
X "cyberworldindustries.com",
# no DNS for shoppingplanet.com
# no DNS for sweeties.com
# no DNS for umark.com
X
X # Alleged smutsters...
X "adultchamber.com",
X "adultsights.com",
# no DNS for atlantis.net
X "babeview.com",
# no DNS for damsel.com
# no DNS for erotic4u.com
# no DNS for honeys.com
# no DNS for infiweb.com
# no DNS for lewd4u.com
X "overtheair.com",
X "pantless.com",
# no DNS for sensuousexotics.com
X "xtv.com",
X
X # Domains that have no anti-spam policy, or don't enforce it
X "dn.net",
X "globalent.net",
# no DNS for isp-inter.net
X "mailbank.com",
# no DNS for pin-point.com
X "twave.net",
X
X # following not attributed....
# no DNS for airmail.net
# no DNS for alliedsystems.com
X "alltel.net",
X "alpha.net",
X "asianmall.com",
# no DNS for bbbiiizzz.com
X "bigfoot.com",
# no DNS for bigprofits.com
# no DNS for cei.com
X "cei.net",
# no DNS for censuscd.com
X "centralregistry.com",
X "clever.net",
X "comp-sol.com",
X "csionline.com",
# no DNS for cyberpreneur.com
X "datadepo.com",
# no DNS for digtec.com
X "dutch-delight.nl",
# no DNS for dutchdelight.nl
X "electriciti.com",
X "emailpage.com",
# no DNS for eternal.net
X "expresslogic.com",
# no DNS for e-values.com
X "freedomstarr.com",
X "freeyellow.com",
X "fullmkt.com",
# no DNS for gemstarts.com
X "gen.com",
X "geocities.com",
# no DNS for getexcited.at
# no DNS for getrich.com
X "gilels.com",
# no DNS for gladys-net.com
# no DNS for gladysnet.com
X "glasscity.net",
X "good.com",
X "goodnet.com",
# no DNS for greatoffer.com
# no DNS for gte.net
# no DNS for hallgroup.com
# no DNS for hk.com
X "hk.net",
X "hkstar.com",
X "hmall.com",
X "hookup.com",
# "hotmail.com", # Kelly Roach alleges they have reformed...
X "idea4u.com",
# no DNS for iiu.com
X "imag.net",
X "imago.net",
X "integrityplus.com",
X "internet-mail.com",
# no DNS for internetfleamarket.com
# no DNS for iq-internet.com
# no DNS for ivbp.com
X "kcii.com",
# no DNS for len-update.com
# no DNS for lettucepatch
X "liberty.com",
# no DNS for lifeplus.at
# no DNS for loop.net
# no DNS for magical-mail.com
X "mailloop.com",
X "mailzone.com",
X "mainstrike.com",
X "market1.com",
# no DNS for marynet.com
X "memo.net",
# no DNS for meoksnet.com
# no DNS for mhclimited.com
X "mmb.com",
# no DNS for moneyworld.com
# no DNS for mortagemanager.com
X "mremail.com",
# no DNS for nancy-net.com
X "natmed.com",
X "netforward.com",
X "net-works.net",
# no DNS for nowhere.com
# no DNS for nethaus.net
X "n-i.com",
# no DNS for nnt.com
X "nyic.com",
X "owlsnest.com",
# no DNS for parkade.com
X "phazer.com",
# no DNS for phoenix.at
# no DNS for pipeline.com
X "planetnet.com",
X "pobox.com",
X "positive-thinking.com",
X "ppgsoft.com",
# no DNS for prodigy.net
X "qcnet.com",
X "pwrnet.com",
# no DNS for quantumcom.net
# no DNS for rcnet.com
# no DNS for remove-me.com
X "revenue.com",
X "satelnet.org",
# no DNS for savearth.com
# no DNS for sendmail1.com
X "softcell.net",
X "spiderlink.com",
# no DNS for spray.com
# no DNS for spray.net
# no DNS for spraynet.com
# no DNS for stock-spectator.com
X "supercomms.com",
X "sure.net",
X "survey.com",
# no DNS for t-1net.com
# no DNS for tara-helps.com
X "telysis.com",
X "tempting.com",
X "theguru.com",
# no DNS for themall.net
X "trader.com",
X "tricreations.com",
X "ultimate.org",
# no DNS for upx.net
X "usa.net",
# no DNS for vapors.com
X "vip.com",
X "virtual-adnet.com",
X "voyager.net",
X "web-america.com",
X "webcom.com",
X "webcreations.com",
X "web-fortune.com",
X "webpower.com",
X "webspinerz.com",
X "westworld.com",
# no DNS for wvbp.com
# no DNS for zilo.com
# no DNS for zrs.net
X
X # informatik.uni-kiel.de 1997.10.30:
# no DNS for 00412.com
# no DNS for 00800.com
# no DNS for 03606.com
# no DNS for 03995.com
# no DNS for 04676.com
# no DNS for 07420.com
# no DNS for 07556.com
# no DNS for 07667.com
# no DNS for 08009.com
# no DNS for 09324.com
# no DNS for 10129.com
# no DNS for 10199.com
# no DNS for 10506.com
# no DNS for 10811.com
# no DNS for 10956.com
# no DNS for 11038.com
# no DNS for 11325.com
# no DNS for 11406.com
# no DNS for 11847.com
# no DNS for 11982.com
# no DNS for 12448.com
# no DNS for 12823.com
# no DNS for 12824.com
# no DNS for 13276.com
# no DNS for 13645.com
# no DNS for 14512.com
# no DNS for 14746.com
# no DNS for 14929.com
# no DNS for 15445.com
# no DNS for 15510.com
# no DNS for 15787.com
# no DNS for 15831.com
# no DNS for 16174.com
# no DNS for 16313.com
# no DNS for 17182.com
# no DNS for 17671.com
# no DNS for 18095.com
# no DNS for 18113.com
# no DNS for 18883.com
# no DNS for 19318.com
# no DNS for 19802.com
# no DNS for 1floodgate.com
X "1stfamily.com",
# no DNS for 20874.com
# no DNS for 21031.com
# no DNS for 21185.com
# no DNS for 21254.com
# no DNS for 21720.com
# no DNS for 22382.com
# no DNS for 22850.com
# no DNS for 23174.com
# no DNS for 23363.com
# no DNS for 23993.com
# no DNS for 24080.com
# no DNS for 24491.com
# no DNS for 24673.com
# no DNS for 24hrplaymates.com
# no DNS for 25093.com
# no DNS for 25596.com
# no DNS for 26238.com
# no DNS for 30326.com
# no DNS for 30857.com
# no DNS for 31810.com
# no DNS for 32459.com
# no DNS for 32734.com
# no DNS for 4yourbiz.std.com
# no DNS for 800.4pussy
X "adultwatch.com",
X "aj2000.com",
# no DNS for ak-marketing.com
X "all-domains.com",
X "alluwant.com",
# no DNS for aloha2u.com
# no DNS for amateurnude.com
# no DNS for answermymail.com
# no DNS for antevetzse.com
# no DNS for areyouready.com
# no DNS for asiannude.com
# no DNS for asxcom2.net
# no DNS for atx-ssdigaa.com
# no DNS for auctionpromo.com
# no DNS for auto-relay.spamford.com
# no DNS for auto-relay2.cybermirror1.com
# no DNS for auto-relay2.spamford.com
# no DNS for auto1.cybermirror1.com
# no DNS for auto2.cybermirror1.com
# no DNS for auto3.cybermirror1.com
X "azgolf.com",
# no DNS for b16m5e.net
# no DNS for babeclub.com
# no DNS for bealeader.com
# no DNS for besenders.com
# no DNS for bestbiz.net
# no DNS for bestbuypc.com
# no DNS for bestshare.com
# no DNS for bestvalues.net
# no DNS for betterways.net
# no DNS for beyonddotcom.com
X "bigdeal.net",
# no DNS for bigfeet.net
# no DNS for bigmarketshare.com
# no DNS for bingo.edu
# no DNS for bitb.net
# no DNS for biz-leads.com
X "blastnet.com",
# no DNS for bmxi.com
# no DNS for breakthruproducts.com
# no DNS for bu1k-c-it.com
# no DNS for bu1k-eee-it.com
# no DNS for bu1kredit.com
# no DNS for bu1kseeit.com
# no DNS for bucsathom.std.com
# no DNS for bulk-c-it.com
# no DNS for bulk-e-it.com
# no DNS for bulk-seee-it.com
X "bulkemail.com",
# no DNS for bulkmail.com
X "bulkmail.net",
# no DNS for bulkread1t.com
# no DNS for bulkseeingit.com
X "businesslisting.com",
# no DNS for by.mail
# no DNS for careerist.com
# no DNS for casndrrasecret.com
X "cbt400.com",
X "ccom.com",
# no DNS for cdemo.net
X "cheapcalls.com",
# no DNS for chuck-biz.com
# no DNS for cindymccain.com
# no DNS for classhumor.com
X "clubmail.com",
# no DNS for clubmail2.com
# no DNS for cmestrip.com
# no DNS for cnn.net
# no DNS for cnninfo.com
X "cockatooconnection.com",
# no DNS for cockring.com
X "cocktails-n-dreams.com",
# no DNS for com.informatik.uni-kiel.de
# no DNS for computerterms.com
# no DNS for consumermoney.com
# no DNS for cosmoderoux.com
X "cp1.com",
# no DNS for cpemail.com
# no DNS for cpemail96.com
# no DNS for cpemail97.com
# no DNS for cpemail98.com
# no DNS for crownwell.com
# no DNS for crowsact.com
# no DNS for crushnet.com
# no DNS for csp4.com
X "cts.com",
# no DNS for curtsey.com
# no DNS for cvcom.net
# no DNS for cvue.com
# no DNS for cyber-1-1-1.com
# no DNS for cyber-1-i-l.com
# no DNS for cyber-1-l-i.com
X "cyber-action.com",
# no DNS for cyber-ddf-i1i-q.com
# no DNS for cyber-f-i-q.com
# no DNS for cyber-f-i1i-q.com
# no DNS for cyber-f-ii-q.com
# no DNS for cyber-i-1-l.com
# no DNS for cyber-i-i-i.com
# no DNS for cyber-i-l-1.com
# no DNS for cyber-l-1-i.com
# no DNS for cyber-l-l-l.com
# no DNS for cyber-li-i-qq.com
# no DNS for cyber-li-il1-qq.com
# no DNS for cyber-s-1-q.com
# no DNS for cyber-s-2-q.com
# no DNS for cyber-t-p-1.com
# no DNS for cyber-t-p-11.com
# no DNS for cyber-t-p-i.com
# no DNS for cyber-trade.com
# no DNS for cyber3.0
X "cyberclearance.com",
# no DNS for cybermailer10.com
# no DNS for cyberonline.com
# no DNS for cyberpr0m0ti0ns.com
# no DNS for cybersender10.com
# no DNS for cybersexbrothel.com
# no DNS for cybertrade1.com
# no DNS for cyberverts.com
# no DNS for d&d.net
# no DNS for danes.com
# no DNS for darcodistribution.com
# no DNS for dat179.com
# no DNS for data123.com
# no DNS for datkinson.com
# no DNS for daveweil.com
# no DNS for dekaetron.com
# no DNS for deliveryman.net
# no DNS for devoted2u.com
X "direct-call.com",
# no DNS for dm5d72.com
# no DNS for dnaconcepts
X "domain.com",
# no DNS for domaol.net
# no DNS for dontdelay.com
# no DNS for dowlinesystem.com
# no DNS for dowlinesystems.com
# no DNS for dxohls.net
# no DNS for e-serv.com
# no DNS for eaglenterprises.com
# no DNS for earthfriends.net
# no DNS for earthfriends.org
X "earthstar.com",
X "earthstar.net",
X "email-leads.com",
# no DNS for email-pro.com
# no DNS for email105.com
# no DNS for email4you.com
# no DNS for emailad.smart.com
# no DNS for emailadvertisingusa.now
# no DNS for emailmania.com
# no DNS for eo8i8n.net
# no DNS for eroticcitynet.com
# no DNS for exoticbabes4u.com
X "express.style.com",
# no DNS for fastcolor.net
X "ffinternet.com",
# no DNS for findfortune.com
# no DNS for fl50pro.com
# no DNS for fld50.com
X "fleamarket.net",
# no DNS for flosenders.com
# no DNS for flpro50.com
# no DNS for flsenders.com
# no DNS for foreclosuremagazine.com
# no DNS for forever.std.com
# no DNS for foryou.ca
# no DNS for framebob.com
# no DNS for freestuff4u.com
# no DNS for freestuffandmore.com
# no DNS for freesugar.com
X "freeview.com",
# no DNS for gasauek.com
# no DNS for genuinedraft.com
# no DNS for getstartedhomebased.com
X "gettingrich.com",
# no DNS for ghtr.net
X "globaltech2000.com",
# no DNS for glufco.com
# no DNS for glufcom.com
# no DNS for gmands.com
# no DNS for gmgmarketing.com
# no DNS for goddesseswaiting.com
# no DNS for goetze.de
# no DNS for grandid.com
# no DNS for gtridofyourdebt.com
# no DNS for gtwinc.com
# no DNS for gwf.net
# no DNS for happytoseeu.com
# no DNS for hardcorealley.com
# no DNS for hardview.com
# no DNS for heat4u.com
# no DNS for hilines.com
# no DNS for hmloan.com
# no DNS for hnclg.com
# no DNS for home2.com
# no DNS for host13.acun.cpbw
# no DNS for hot.deals
# no DNS for hotstrip.com
# no DNS for hudsonmarketing.com
X "hunks4u.com",
# no DNS for ia173.com
# no DNS for iceberg.fijord.dirkensens.org.jp
# no DNS for iemmc.net
# no DNS for imarketdirect.com
# no DNS for imbnet.org
# no DNS for inetarm.com
# no DNS for inetcomm.net
# no DNS for info-centre.com
# no DNS for infoallies.com
# no DNS for infotextinc.com
# no DNS for inhousebusiness.com
# no DNS for instatpc.com
X "intcomm.net",
X "interconnectivity.com",
X "internet-ici.com",
# no DNS for internet-income.com
X "intimatedesires.com",
# no DNS for intmarkings.com
X "iodmail.com",
# no DNS for iporegistrationlink#122.com
# no DNS for iporegistrationlink-122.com
# no DNS for isdeadwrongbud.com
# no DNS for itu1.com
# no DNS for j-advertising.com
# no DNS for joyeux.com
# no DNS for justfouru.com
# no DNS for kievi.com
# no DNS for klundgren.com
# no DNS for knocking.net
# no DNS for lanphere1.com
# no DNS for learningisfun.com
# no DNS for lestec.com
# no DNS for letsmarket.com
# no DNS for lifeasweknowit.com
# no DNS for livecenterfold.com
# no DNS for livecenterfolds.com
# no DNS for livekinkysex.com
# no DNS for lizer.com
# no DNS for lorymar.com
# no DNS for lucy.ppinet.de
# no DNS for lust2thous.com
# no DNS for maidmarion.com
# no DNS for mail183.com
# no DNS for mail192.com
# no DNS for mail98.com
# no DNS for mail99
# no DNS for mailexch.com
# no DNS for mailhub22.com
# no DNS for mailhubsend.com
# no DNS for mailman.com
# no DNS for mailnet2.com
# no DNS for mailout.net
# no DNS for mailout2.com
# no DNS for mailout4u.com
# no DNS for mailpost6761.com
X "makeit-so.com",
X "makeitso.com",
X "makeitsoinc.com",
X "makeitsosoft.com",
# no DNS for malenude.com
# no DNS for mandy.com
# no DNS for marathon4com.net
X "marcouscheaffer.com",
# no DNS for marketblast.com
# no DNS for marketing-associates.com
# no DNS for markettheworld.com
# no DNS for mass-email.com
# no DNS for matata.com
# no DNS for maxpolco.com
# no DNS for mbsale.com
X "mdw.net",
# no DNS for mentaltips.com
X "merchantacct.com",
X "merchantbroker.com",
# no DNS for merchantquest.com
X "merchantsoft.com",
# no DNS for mesend.com
# no DNS for mhbmarket.com
# no DNS for migasofterware.com
# no DNS for millenn2000.com
# no DNS for mirabilis.com
# no DNS for mirth.net
# no DNS for mjcl.com
# no DNS for mjcw.com
# no DNS for mlm-net.net
# no DNS for mmtx.com
# no DNS for mm_res1.ar4.fra.dlh.de
# no DNS for mnetinc.com
X "money.com",
# no DNS for money.net
# no DNS for moneyads.com
# no DNS for moneynow.com1
# no DNS for moneyreports.com
# no DNS for mowedmuff.com
# no DNS for mra4.com
# no DNS for mrmarket.com
# no DNS for mrmarketshare.com
# no DNS for msrnetworks.com
# no DNS for mvnet.ed
# no DNS for mxjca.com
# no DNS for mxtmil.com
# no DNS for nakedmen.com
X "nastymail.com",
# no DNS for naury.com
X "nauticom.net",
# no DNS for navigationstation.com
# no DNS for net.do
# no DNS for net.mail
# no DNS for netmail2000.com
# no DNS for netmailer2001.com
# no DNS for new.release.com
# no DNS for newark.nj.ms.uu.net
# no DNS for newera2001.com
# no DNS for newguide.com
# no DNS for northernlightsweb.com
# no DNS for nospam.primenet.com
# no DNS for nostoppingit96.com
# no DNS for nostp1996.com
# no DNS for nostp1997.com
# no DNS for noveltyi.com
# no DNS for now89.com
# no DNS for nowhere.moc
X "ntview.com",
X "ntz.com",
# no DNS for nudeimages.com
# no DNS for nudephotography.com
# no DNS for nudeporn.com
X "nudesexpictures.com",
X "nudeteens.com",
# no DNS for nudewoman.com
X "oak-leaf.com",
# no DNS for obscene4u.com
# no DNS for off-shore.today
# no DNS for offshoremarketing.com
# no DNS for ogsmx.com
# no DNS for ooolalala.com
# no DNS for opseek.com
# no DNS for oralsexpictures.com
# no DNS for orcaswater.com
# no DNS for otbridge.com
# no DNS for otbridge.org
# no DNS for ourgirls.com
# no DNS for outmail.com
# no DNS for outmail.net
# no DNS for outmail2.com
# no DNS for outmail4u.com
X "outworld.net",
# no DNS for outworlds.com
# no DNS for outworlds.net
# no DNS for papola.com
# no DNS for party6969.com
# no DNS for pc-xxx.com
X "peepshow.com",
# no DNS for penrod1.com
X "personalseek.com",
# no DNS for phantomcom.com
# no DNS for phoneworx.com
# no DNS for phsychicfriends.net
# no DNS for phychicfriend.com
# no DNS for phychicfriend.net
# no DNS for picturenames.com
# no DNS for planetnet.org
X "pleasuregirls.com",
# no DNS for plusisheref.com
# no DNS for plusisherefinally.com
# no DNS for porno4porn.com
X "porno4u.com",
# no DNS for pornographicpictures.com
X "ppginc.com",
X "prepaid-gas.com",
# no DNS for prepaidinternet.com
X "prescriptionsportswear.com",
# no DNS for pro1.net
# no DNS for prodis.com
# no DNS for promail34.com
# no DNS for prosenders.com
# no DNS for prosperforce.com
# no DNS for prosteps.com
# no DNS for prunj.com
# no DNS for psyberchild.com
# no DNS for psychicfriend.net
# no DNS for psyychicfriends.net
# no DNS for publicmail33.com
# no DNS for publicmail39.net
# no DNS for pubmail22.com
X "pussypictures.com",
# no DNS for pyruvateplusforyou.net
# no DNS for pyschtips.com
# no DNS for qjtoyh.net
# no DNS for r6-emt.com
# no DNS for rakkwzw.com
# no DNS for rakl.net
# no DNS for rasha.com
X "rbmail.com",
# no DNS for rbmall.com
# no DNS for rea1return.com
# no DNS for rea1return2.com
# no DNS for rea1return3.com
# no DNS for reachingyou.com
# no DNS for readthis.net
# no DNS for readytopartybaby.com
# no DNS for reaireturn.com
# no DNS for reaireturn3.com
# no DNS for reaireturn4.com
# no DNS for reaireturn5.com
# no DNS for reaireturn6.com
# no DNS for realreturn2.com
# no DNS for realreturn3.com
# no DNS for recipesinternational.com
# no DNS for refill.now
# no DNS for reliefaroni.com
# no DNS for remmo.net
# no DNS for remove.org
# no DNS for replybyphone.com
# no DNS for residualimpact.net
# no DNS for residualincome.com
# no DNS for returnmail.com
X "reunion.net",
# no DNS for rnkenter.com
X "rorap.com",
# no DNS for rrdse.com
# no DNS for s2mgs4.com
# no DNS for s2mrgsdnt4.com
X "sabrin97.org",
# no DNS for sandkconsulting.com
# no DNS for sc1996.com
# no DNS for sc21996.com
# no DNS for sc31996.com
# no DNS for sc41996.com
# no DNS for sc51996.com
# no DNS for sc5l986.com
# no DNS for sc5l996.com
# no DNS for sc996.com
# no DNS for sc997.com
# no DNS for scanfran.com
# no DNS for scaol.com.net
# no DNS for sdl0997.com
# no DNS for se-inc.com
# no DNS for secretsunknown.net
# no DNS for seemeestrip.com
X "seemestrip.com",
X "seinc.net",
# no DNS for sender1996.com
# no DNS for sender1997.com
# no DNS for sender1998.com
# no DNS for sender34.com
# no DNS for sendercyber96.com
# no DNS for sendercyber97.com
# no DNS for sendercyber98.com
# no DNS for senderthree.com
# no DNS for sendertp0.com
# no DNS for sendertp1.com
# no DNS for sendertp2.com
# no DNS for sendertp3.com
# no DNS for sendertp34.com
# no DNS for sensual4u.com
X "serveramerica.com",
# no DNS for sexnude.com
# no DNS for sexphoto.com
# no DNS for sexysearch.com
# no DNS for sherwoodforest.net
# no DNS for shoni.com
# no DNS for showuthemoney.com
X "signsrus.com",
X "smickandsmodoo.com",
X "smokingbabes.com",
# no DNS for smtp.out-atx-ggttfew.com
# no DNS for smutmail.com
# no DNS for snothere.com
# no DNS for softwareoutlet.worldnet.att.net
# no DNS for solmio.net
# no DNS for somehost.somedomain
# no DNS for spambuster.com
# no DNS for special.pricing
# no DNS for spiritualbliss.com
X "sua.net",
# no DNS for submit-your-site.com
# no DNS for submitking.com
X "subweb.com",
# no DNS for suger.com
# no DNS for sultry4u.com
# no DNS for supergood.com
# no DNS for survus.com
# no DNS for svenska.net
# no DNS for swedesmarketing.com
# no DNS for swq4-g.net
# no DNS for t7j5m3.net
# no DNS for tabmarketing.com
# no DNS for takealook.com
# no DNS for taxhtr.com
# no DNS for taxshltr.com
# no DNS for tazzz-manium.com
# no DNS for tc51986.com
# no DNS for tc5l986.com
# no DNS for teamwealth-ii.net
# no DNS for teecomnet.com
X "tenthhouse.com",
# no DNS for thedatezone.com
# no DNS for thefourthplanet.com
# no DNS for theinfodoc.com
# no DNS for themoneyqroup.com
# no DNS for the_edge.com
# no DNS for timesav.net
# no DNS for todial.com
X "tollfree.net",
X "totcon.com",
# no DNS for tpionline.com
# no DNS for traveler1.com
# no DNS for trog.org
# no DNS for troyfree.com
X "ultragrafix.com",
# no DNS for unabomber.bom
# no DNS for underlig.com
# no DNS for underlind.com
# no DNS for undertimes.com
# no DNS for unfairadvantages.com
X "unidial.com",
# no DNS for unknown.domain
# no DNS for unstop1996.com
# no DNS for unstop1997.com
# no DNS for unstop1998.com
# no DNS for unstop1999.com
# no DNS for unstoppable1996.com
# no DNS for upthr.com
# no DNS for uscom.com
# no DNS for utkform.com
# no DNS for vaginasexpictures.com
X "vbox.com",
X "vcity.net",
# no DNS for vdocam.com
# no DNS for velezonlinemarketing.com
# no DNS for vigina.com
# no DNS for vsub.com
# no DNS for vulva.com
X "want2win.com",
# no DNS for warmups.com
# no DNS for we-deliver.net
# no DNS for wealth.kit.net
# no DNS for webprofile.com
# no DNS for wedo2.com
# no DNS for wedo2.net
# no DNS for wedoit2.com
# no DNS for wemailemail.com
# no DNS for wigi-morman.com
# no DNS for wigi-woman.com
# no DNS for wilshireblvd.com
# no DNS for windowtouch.com
# no DNS for winnerslink.com
# no DNS for within.message
# no DNS for wokid6.net
X "wwcd.com",
X "wwd.org",
# no DNS for wwexchange.com
# no DNS for wwexchangepro.com
# no DNS for x-toys.com
X "xps.com",
# no DNS for xtc42u2c.com
X "xtremeradio.com",
# no DNS for xxdoe.net
# no DNS for y5gvrp.com
# no DNS for yeaowzaaas.com
# no DNS for youget.com
# no DNS for your.friends
# no DNS for youraccount.com
# no DNS for yourdomain.com
# no DNS for yourhealthisimportant.com
# no DNS for yourmarketshare.com
# no DNS for yoursavings.com
X "yourstruly.com",
# no DNS for yoursuccess.com
# no DNS for yrbizman.com
# no DNS for z6lpr8.com
# no DNS for zapback.com
# no DNS for zzdoe.net
X
X # webeasy.com 1997.10.30
X "123go.net",
X "4u.com",
X "4u.net",
# no DNS for aaaapix.com
# no DNS for aacmenc.net
# no DNS for abvintel.com
# no DNS for actionlawn.com
# no DNS for advogate.com
X "afirstlook.com",
X "afterhoursmag.com",
# no DNS for agency.ru
X "aj1.com",
# no DNS for am-deltapalace.com
X "amateurknight.com",
# no DNS for anatole.com
# no DNS for anotherdomain.com
X "aplay2.com",
X "apwcogan.com",
# no DNS for asiabusiness.net
X "asian-pussy.com",
# no DNS for bisopps.com
# no DNS for blowjobsex.com
X "briarwood.com",
# no DNS for bulkinquiries.com
# no DNS for bulkinternet.com
X "bulkpower.com",
# no DNS for bulkreadit.com
# no DNS for bulkresponses.com
# no DNS for bulkseeit.com
# no DNS for bulksendit.com
# no DNS for bulletproofvoicemail.com
# no DNS for buytime.com
# no DNS for bwsales.com
# no DNS for c-flash.net
# no DNS for c-y-b-e-r-p-r-o-m-o.com
# no DNS for cableguy
X "california-heat.com",
# no DNS for californiakid.com
X "carcar.com",
# no DNS for cbt.com
X "ccdirect.com",
X "cefali.com",
# no DNS for celebritypussy.com
X "ch-non-food.com",
# no DNS for choice-mill-2000.com
X "clanorchids.com",
X "classifiedcentral.com",
# no DNS for claythay.com
X "clubelite.com",
X "contempogroup.com",
X "cpci.net",
X "crystalpalace.com",
X "cumasyouare.com",
# no DNS for cvcom.com
# no DNS for cyber-broadcasting.com
# no DNS for cyber-l-i-1.com
# no DNS for cyber-mail.com
# no DNS for cyber-o-0-o.com
# no DNS for cyber-promo.com
# no DNS for cyber-s-i-q.com
# no DNS for cyber-t-p-l.com
# no DNS for cyber-times.com
X "cyberfamily.net",
# no DNS for cyberout.com
# no DNS for cyberout96.com
# no DNS for cyberpr0m0.com
# no DNS for cyberpr0mo.com
# no DNS for cyberprom0.com
# no DNS for cyberpromotions.com
# no DNS for cyberramp.com
# no DNS for cybersyst.com
# no DNS for cybertimes.org
X "danlaw.net",
# no DNS for data.iq-internet.com
X "datablast.net",
X "datatamers.com",
X "dboard.com",
# no DNS for diode.com
# no DNS for dirtylittlenymphos.com
X "dm1.com",
X "dml.com",
# no DNS for domaindealer.com
# no DNS for domainsellers.com
X "effectiveinventory.com",
X "eih.com",
X "elfworks.com",
# no DNS for ema12u.com
# no DNS for emai12u.com
# no DNS for emai1srus.com
# no DNS for email2you.com
# no DNS for emailpromo.com
X "emailsrus.com",
# no DNS for emaster.com
# no DNS for empowerlabs.com
X "erosisland.com",
X "escorts-on-line.com",
# no DNS for famailcrt.com
# no DNS for fight4rights.com
X "finance-net.com",
# no DNS for fincon.com
X "flasexnet.com",
X "forfree.com",
# no DNS for freeconnect.com
# no DNS for freetapes.com
# no DNS for ftpftpftp.com
# no DNS for fundsrecovery.com
X "gcproductions.com",
X "general.net",
X "genesiscom.com",
# no DNS for georgewalthers.com
# no DNS for getit.com
# no DNS for gigilo.com
# no DNS for goldenapples.com
X "goldennyc.com",
# no DNS for golfballsunlimitedusa.com
X "gracefully.com",
# no DNS for graves.com
X "gruber.com",
# no DNS for haht.com
# no DNS for helpnet.net
X "hi-cap.com",
# no DNS for hipcrime.com
# no DNS for hoek.com
# no DNS for hollywoodcenterfolds.com
# no DNS for hpp.com
# no DNS for iiua.org
X "indusnet.net",
X "info4you.com",
X "jackpots.com",
# no DNS for juice1.net
# no DNS for krazymirror.com
X "kustom.on.ca",
X "lasvegasxxx.com",
# no DNS for ldelivery.net
X "linkminder.com",
X "lipsnet.com",
X "lostintime.com",
# no DNS for lstamend.com
# no DNS for lustx20.com
X "mail.t-1net.com",
# no DNS for mailpromo.com
# no DNS for mallmaster1.com
X "manda1.com",
# no DNS for mariner.com
# no DNS for marketbiz.com
X "mconsult.com",
# no DNS for mens-club.com
X "micon.com",
X "millions.com",
X "mitnet.com",
X "mlmall.com",
X "mlsacomline.com",
# no DNS for mlvnyrd.com
# no DNS for momentum.com.hk
# no DNS for money-smart.com
# no DNS for moonlink.com
# no DNS for moremoneynow.com
# no DNS for moremoneynow.com1
X "mortgagemanager.com",
# no DNS for mrp.cz
# no DNS for mrp.sk
X "mysource.com",
X "namecard.com",
# no DNS for nasty-snatch.com
X "nasty-teens.com",
# no DNS for nastysouthernchicks.com
X "nationalguild.com",
# no DNS for naturalinstints.com
# no DNS for nb1ock.com
# no DNS for ndmedia.com
# no DNS for neo-axiom.com
# no DNS for netbound.com
# no DNS for netinformant.com
# no DNS for netramp.com
X "newmed.org",
# no DNS for nob1ock.com
X "npi.net",
# no DNS for nudenude.com
# no DNS for nw-oralsurgery.com
X "o-c-s.com",
# no DNS for offer4u.net
# no DNS for onlinekey.com
# no DNS for out.now
# no DNS for paradigmcap.com
# no DNS for paradigmcaps.com
X "paradigmcompanies.com",
X "paradigmdirect.com",
# no DNS for paradigmsecurities.com
X "pnm.org",
# no DNS for power-store.com
# no DNS for pussypussypussy.com
# no DNS for pwrsite.com
# no DNS for quadfun.com
# no DNS for quantcom.net
# no DNS for realreturn.com
X "ribbon-exchange.com",
# no DNS for rnmg.com
# no DNS for sandfordw.com
X "savetree.com",
X "savvy.com",
X "selfhelpnet.com",
# no DNS for sender3.com
# no DNS for senderthree3.com
X "sexdungeon.com",
# no DNS for sexsexsexsex.com
# no DNS for sexy-teens.com
# no DNS for shopplanet.com
X "slipinside.com",
X "slutpics.com",
X "smtp.web-visions.com",
# no DNS for snailmail.com
# no DNS for space-explorers.com
# no DNS for sprimt.com
X "statom.com",
# no DNS for superiormall.com
X "tarz.com",
X "taxx.com",
X "tdt.net",
# no DNS for teenagecherrys.com
# no DNS for telecom-plus.com
# no DNS for telecom-plus.net
X "theadnet.com",
X "thehost.com",
# no DNS for themailpro.com
# no DNS for ticketsonthenet.com
X "timg.net",
X "todaysmoney.com",
X "top7.com",
# no DNS for travelbyways.com
# no DNS for ultramax.net
X "unicomp.net",
# no DNS for us2u.net
# no DNS for validreturn.com
# no DNS for vaprnet.com
X "village21.com",
X "virtual.eldosales.com",
# no DNS for web-watch.com
X "webersmall.com",
# no DNS for webexposure.net
X "well-ness.com",
X "wellness2.com",
X "wideinc.com",
X "wji.com",
X "workload.com",
# no DNS for wow.now.com
X "xxx-mall.com",
# no DNS for youroppurtunity.com
# no DNS for zzzdoe1.com
# no DNS for zzzdoe2.com
X
X # from Ralf Hildebrandt, R.Hild...@tu-bs.de 2-Feb-1998
X "1-global.com",
X "100t.lauderdale.net",
X "121world.com",
X "180096hotel.com",
X "1888wwsports.com",
X "1on1xxx.com",
X "1second.com",
X "1st.net",
X "2099.com",
X "22nd.com",
X "3diinc.com",
X "4websites.com",
X "69her.com",
X "7cities.net",
X "800cookies.com",
X "a1.mr.mvcc.edu",
X "aad.net",
X "abc-achieversnetwork.com",
X "abcads.com",
X "absmart.com",
X "acils.com",
X "acmenet.net",
X "adult-nights.com",
X "adultdream.com",
X "adultinter.net",
X "advertise.com",
X "advn.com",
X "adzone.com",
X "aeneas.net",
X "agetech.net",
X "airtech.net",
X "aiusa.com",
X "algnet.algonquinc.on.ca",
X "alice-compusystems.com",
X "all-domains.net",
X "allinfosys.com",
X "alphawave.com",
X "aloe.com",
X "americasnet.com",
X "amyda.foe.co.uk",
X "anonymous.com",
X "anv.net",
X "ao.net",
X "applewize.com",
# no DNS for armigeron.com
X "artoflove.com",
X "asoftware.com",
X "atlantic.net",
X "atlonline.com",
X "auntmimi.net",
X "avaworld.com",
X "avicom.net",
X "axp15.iie.org.mx",
X "azlink.com",
# no DNS for babenet.com
X "babequest.com",
X "bag.com",
X "barevideo.com",
X "barnworth.com",
X "bedroomvideo.com",
X "bedroomwindow.com",
X "bestfares.com",
X "bestfriends.net",
X "bienlogic.com",
X "bigdawg.com",
# no DNS for bignet.net
X "bigtime.net",
X "binarybus.com",
X "bizglobal.net",
X "black-hole.com",
X "bluemarble.net",
X "blueshift.com",
X "bn.com",
X "bolt.lakeheadu.ca",
X "boomerinc.com",
X "boulevards.com",
X "brainstorm.net",
X "bsd.cbd.net",
X "btci.org",
X "buck.net",
X "bulkcenterpro.com",
X "busche.com",
X "bytebabes.com",
X "bytewe.com",
X "c-corp.net",
X "cabre.com",
X "cache.net",
X "calinet.com",
X "call.com",
X "camdenmg.com",
X "carlson.net",
X "catalyst.net",
X "cavecreek.net",
X "cftech.com",
X "cftnet.com",
X "cgicafe.com",
X "ch.promega.com",
X "challenge-dm.lauderdale.net",
X "chatvideo.com",
X "choicemall.com",
X "christmasforest.com",
X "chunkstyle.com",
X "ckinc.com",
X "clickbucks.com",
X "clickin.com",
X "clpgh.org",
X "coastline.net",
X "cobsweb.net",
X "colpal.com",
X "comfind.com",
X "community.net",
X "condomsetc.com",
X "conninc.com",
X "conru.com",
X "contactpro.com",
X "content.net",
X "contestsource.com",
X "correy.com",
X "covesoft.com",
X "crawford.com",
X "creator.ceta.es",
X "creditnet.com",
X "csil.com",
X "ctct.com",
X "ctech.net",
X "cumcravers.com",
X "cuttingedge-tech.com",
X "cyber-media.com",
X "cyber-pages.com",
X "cyberbundle.com",
X "cyberbyte.com",
X "cybercon.com",
X "cyberdesires.com",
X "cyberdude.com",
X "cyberellas.com",
X "cyberhammer.com",
X "cyberhammer.net",
X "cyberhardcore.com",
X "cyberhost.net",
X "cyberhost3.com",
X "cyberhost5.com",
X "cyberinch.com",
X "cyberjunkie.com",
X "cybermirror.com",
X "cyberpeek.com",
X "cyberplex.com",
X "cyberpwr.com",
X "cyberrealm.net",
X "cybersensual.com",
X "cybersets.com",
X "cybershopclub.com",
X "cyberthrills.com",
X "cyberweb1.com",
X "cyperinfo.com",
X "dac1.com",
X "daltek.net",
X "dateline.net",
X "dawnsdungeon.com",
X "deltavex.com",
X "deltavex.net",
X "detroit-windsorcasinos.com",
X "dev-com.com",
X "devontax.com",
X "dhc.net",
X "did-it.com",
X "digimark.net",
X "digiserve.com",
# no DNS for digitalage.com
X "digitalstarlight.com",
X "digop.com",
X "digprod.com",
X "dilley.com",
X "dillonforce.com",
X "dmjl.com",
X "dnai.com",
X "dns1.netgate.nl",
X "dnsservices.com",
X "doctor.nl2k.ab.ca",
X "doi.com",
X "domainit.com",
# no DNS for domelive.com
X "dr.cgocable.ca",
X "draco.bv.sgi.net",
X "drawbridge.net",
X "dynsys.com",
X "e-mail.com",
X "e-net.com",
X "earthwins.com",
X "easyway.net",
X "ecards.org",
X "eclipse.freemanchester.com",
X "ecom.net",
X "eiffel.com",
X "eldec.com",
X "eldosales.com",
X "electronicmail.com",
X "ellijay.com",
X "emagnet.com",
X "email.com",
X "emailmagnet.com",
X "emailmedia.com",
X "emailondemand.com",
X "emailwizard.com",
X "emke.com",
X "empowertech.com",
X "energymizer.com",
X "enteract.com",
X "entrepreneur.com",
X "epcom.com",
X "epresence.com",
X "escape.com",
X "escortguide.com",
X "escortscalgary.com",
X "escortsrus.com",
X "espdirect.com",
X "espressocom.com",
X "everywhere.com",
X "experts-exchange.com",
X "explodingopp.com",
X "extravaganza.net",
X "ez2.net",
X "ezl.com",
X "ezn.com",
X "ezpro.com",
X "falconsoft.com",
X "family-net.net",
X "fantasiesinc.com",
X "farmgirls.com",
X "fastlane.net",
X "fiber.net",
X "fitertown.com",
X "firmament.com",
X "firstgear.com",
X "firstsystem.com",
# no DNS for fisc.com
X "fishclass.com",
X "fisher1.com",
X "fishertowne.com",
X "fishmarket.com",
X "fishschool.com",
X "fissiontech.com",
X "fitnesoft.com",
X "fiveoaks.com",
X "fivepoints.com",
X "fix.net",
X "fixation.com",
X "fizbin.com",
X "flipag.net",
X "flochart.com",
X "flury.com",
X "foe.co.uk",
X "foliage.com",
X "formor.net",
X "forsuccess.com",
X "fox.plaza.nl",
X "france-travel.com",
X "free-market.com",
X "free-stuff.com",
X "free-thought.com",
X "free-vacation.com",
X "fredrick.com",
X "freemark.com",
X "freeyellowpages.com",
X "fsonline.com",
X "fujipub.com",
X "fulbright.com",
X "fun.com",
X "funmirror.com",
X "fwi.com",
X "gate.net",
X "gcg.com",
X "genesys.net",
X "genghis.com",
X "gilroy.com",
X "girlieshow.com",
X "girlsontheweb.com",
X "globaldialog.com",
X "globaldiscount.com",
X "globaldns.com",
X "globalhealthcorp.com",
X "globalthink.com",
X "go-to.com",
X "goplay.com",
X "gottibros.com",
X "greatdeals.net",
X "grgig.net",
X "gslink.com",
X "guaranteed.com",
# no DNS for gw2kbbs.com
X "gyral.com",
X "happytime.com",
X "hardhunks.com",
X "harris-marketing.com",
X "healthynwealthy.com",
X "hfnet.com",
X "higherideals.net",
# no DNS for hinet.net
X "hni.net",
X "home-media.com",
# no DNS for homecom.com
X "hops.com",
X "horny.net",
X "houtx.com",
X "iaavc.com",
X "ias.net",
# no DNS for ic2do.com
X "icanect.net",
X "ics-online.net",
X "idir.net",
X "iecbal.com",
X "ientertain.com",
X "imall.com",
X "imbc.com",
X "img-force.com",
X "impulsive.com",
X "imsday.com",
X "in7.com",
X "inav.net",
X "inch.com",
X "indirect.com",
X "inet.net",
# no DNS for inetcomm.com
X "inetnebr.com",
X "inettech.com",
X "inetwave.com",
X "infi-pos.com",
X "inficad.com",
X "inficad.net",
X "info-internet.net",
X "info.com",
X "infolite.com",
X "information4u.com",
X "infozech.com",
X "inspire-net.com",
X "instorm.ni.net",
X "intellimg.com",
X "interax.com",
X "internet-designs.com",
X "internetbuy.com",
X "internetmedia.com",
X "internetmedia.net",
X "internetpromotions.net",
X "internix.net",
X "interramp.com",
X "intersessions.com",
X "interspeed.net",
X "inthe.net",
X "io.com",
X "iocc.com",
X "ipns.com",
X "iqpc.com",
X "issue.com",
X "istar.ca",
X "iwebb.net",
X "iworld.net",
X "iwsc.com",
X "jjj.com",
X "jmbest.net",
X "joemast.com",
X "jointventure.com",
X "jointventuremarketing.com",
X "joinusnow.com",
X "jsf-inc.com",
X "jtsr-stock.com",
X "kalamazoo.net",
X "karemor.net",
X "kcsmarketing.com",
X "kjl.com",
X "knowledgeexpress.com",
X "kpi-group.com",
X "krieger.net",
X "ktc.com",
X "kyoko.mpx.com.au",
X "lambdatel.com",
X "laposte.bsf.alcatel.fr",
X "launcher.com",
# no DNS for lconn.net
X "ldrs.com",
# no DNS for lemis.com
X "link-n-win.kn",
X "linked.net",
X "listinglink.com",
X "live.net",
X "livegirls2u.com",
X "livewhorehouse.com",
X "logicom.com",
X "lustyladies.com",
X "madampams.com",
X "mail.com",
X "mail.mty.itesm.mx",
X "mail.nl2k.ab.ca",
X "mailexcite.com",
X "mailmarket.com",
X "mailworld.net",
X "marinet.com",
X "marketingmasters.com",
X "marketniche.com",
X "masteryellowpages.com",
X "mavericknet.com",
X "maxpol.com",
X "mcgnet.com",
X "mckauffman.com",
X "mclafmall.com",
X "mcwebnet.net",
X "media3.net",
X "mediabuy.com",
X "meer.net",
X "merida.net",
X "metromane.com",
X "microserve.com",
X "microsyssolutions.com",
X "mile.net",
X "mktaccess.com",
X "mlmpro.com",
X "mnsi.net",
X "modelz.com",
X "modemmaidens.com",
X "modernshopping.com",
X "mohawk.net",
X "moneymaker.com",
X "moosehead.com",
X "morbrandnames.com",
X "moreinfo.com",
X "mountainmicro.com",
X "mpowernet.com",
X "mtco.com",
X "muff.net",
X "multix.com",
X "mwksm.com",
# no DNS for my.com
X "myownemail.com",
X "mypicks.com",
X "nasi.com",
X "naspa.net",
X "nbachampionshipodds.com",
X "nedco.com",
X "neosoft.com",
X "nerc.com",
X "net1plus.com",
X "net56.net",
X "netacc.net",
X "netbiz.com",
X "netcomi.com",
X "netcreations.com",
X "neter.com",
X "netgate.net",
X "netlabs.net",
X "netpromo.net",
X "netsleuth.net",
X "netstakes.com",
X "netvent.com",
X "netviewtech.com",
X "netway.net",
X "netwerks.com",
X "networkthenation.com",
X "netzilla.net",
X "newedge.net",
# no DNS for newerastrategies.com
X "newsdelivers.com",
X "newton.isa.de",
X "nhbinc.com",
X "nhlodds.com",
X "nmarcom.com",
X "nnc.net",
X "noic.org",
X "norwich.net",
# no DNS for notfalse.com
X "novagate.net",
X "ns.calvacom.fr",
X "ntouch.net",
X "nts-online.net",
X "ntx.net",
X "offshoreinvesting.com",
X "oklahoma.net",
X "oldguns.com",
X "omnes.net",
X "one.net",
X "onecom.com",
X "online-marketing.com",
X "onlinenow.net",
X "onramp.net",
X "onthestreet.com",
X "open-mkt.com",
X "opportunitygroup.com",
X "optel.net",
X "osiris.isys.ca",
X "osmweb.com",
X "owlseye.com",
X "oxyfresh.net",
X "pageup.net",
X "palmnet.net",
X "pamsplayhouse.com",
X "passionatevideo.com",
X "pathway.net",
X "pdi.com",
X "per.cybercity.dk",
X "petite-magazine.com",
X "pgh.net",
X "phase3.com",
X "pinkpussyclub.com",
X "pnwnet.com",
X "poconos.net",
X "pookies.com",
X "pornlink.net",
X "pouch.com",
X "powercenter.com",
X "powernethk.com",
X "powerpageinc.com",
X "powerpoint.com",
X "powerup.com.au",
X "presys.com",
X "prizes.com",
X "productpartners.com",
X "progcons.com",
X "promega.com",
X "promotion.com",
X "promotions.com",
X "pu55y.com",
X "public.net",
X "pussylooky.com",
X "putpeel.com",
X "q-com.com",
X "q-tek.net",
X "qn.net",
X "qni.com",
X "qtm.net",
X "quantumcom.com",
X "racer.net",
X "raines.com",
X "realestatejointventure.com",
X "register.com",
X "relaxed.com",
X "religionline.com",
X "reporters.net",
X "reportz.com",
X "rnjdist.com",
X "rock-dlc.com",
X "rockfetish.com",
X "rogue.net",
X "romoidoy.com",
X "rtuh.com",
X "s-1.com",
X "s2.iway.fr",
X "saltmine.com",
X "sbt.net",
X "scanvec.com",
X "scanvecusa.com",
X "scorecheck.com",
X "scourby.com",
X "scruznet.com",
X "seemepee.com",
X "sendad.com",
X "serenity-playtime.com",
X "servtech.com",
X "sevenseas.com",
X "sexfantasy.com",
X "sexxxvision.com",
X "sexzilla.com",
X "shared.net",
X "shelby.net",
# no DNS for shopthenet.net
X "siege.net",
X "silkspin.com",
X "sim.qc.ca",
X "singlet.buck.net",
X "singnet.com.sg",
X "sirron.org",
X "sitecheck.com",
X "skinpeeks.com",
X "slaton.com",
X "smartserv.com",
X "smtp.wanadoo.fr",
X "sockets.net",
X "softimport.com",
X "sonalex.com",
X "sordidvideo.com",
X "soundworks.com",
X "southwindnet.com",
X "sparknet.net",
X "speakeasy.org",
X "spearhead.net",
# no DNS for special-fx.com
X "sportsite.com",
X "sportsnuts.com",
X "spry.com",
X "stockscape.com",
X "stocksmart.com",
X "stocksmartpro.com",
X "stockwiz.com",
X "stripline.de",
X "studsonline.com",
X "submissions.com",
X "submit2000.com",
X "success-online.com",
X "success.net",
X "sultansharem.com",
X "superb.net",
X "superbowlodds.com",
X "supernews.com",
X "supranet.net",
X "swcbbs.com",
X "swell.net",
X "swissinfo.net",
X "t3cyber.com",
X "t-1.net",
X "technologist.com",
X "tele.com",
X "telstra.net",
X "temptationstation.com",
X "the-mail.com",
X "the-money-mall.com",
X "thehoneypot.com",
X "theibc.com",
# no DNS for thejetset.com
X "thenerve.com",
X "theoffice.com",
X "theone.net",
X "thepostoffice.com",
X "theweb1.com",
X "thuntek.net",
X "tiberias.com",
X "tmi.org",
X "tntcomtec.com",
X "togo.com",
X "tollfreenumbers.com",
X "tomsnet.com",
X "tony.net",
X "top-10.com",
X "torridheat.com",
X "total-access.net",
X "transport.com",
X "triax.com",
X "trillion-resources.com",
X "tsf-industries.com",
X "twistedpair.net",
X "tmninc.com",
X "txdirect.net",
X "ubs95.net",
X "ultramax.com",
X "umakarate.com",
X "unclaimed-property.com",
X "uniscape.com",
X "uplinkpro.com",
X "urbiz.com",
X "us.net",
X "usatech.com",
X "usfirms.com",
X "uslink.net",
# no DNS for usweb.com
X "valhalla-net.com",
X "valinet.com",
X "vance.net",
X "vault.cosmos.net.au",
X "vbsolutions.com",
X "vcart.com",
X "vegaslines.com",
X "vegasodds.com",
X "veicon.com",
X "venturesys.com",
X "videobedroom.com",
X "videoerotica.com",
X "videofantasy.com",
X "videoladies.com",
X "videopleasure.com",
X "videosecrets.com",
X "videosextacy.com",
X "videotex.com",
X "vidx.com",
X "vie.com",
X "vircomcomputers.com",
X "virilite.com",
X "virtual-cafe.com",
X "virtualcunt.com",
X "virtualgirl.com",
X "virtualgirls.com",
X "virtualserving.com",
X "virtualthrills.com",
X "virtualvirgins.com",
X "virtualvoyeurs.com",
X "visionunl.com",
X "vitamins.com",
X "voraxweb.com",
X "voye.com",
X "vwm.com",
X "wallysworld.com",
X "wantabe.com",
X "warehouse.com",
X "waseca.com",
X "wbs.com",
X "wcc.net",
X "wdn.com",
X "web-hosting.com",
X "web-visions.com",
X "webex.net",
X "webjunkie.com",
X "webmole.com",
X "webprecision.com",
X "webserve.net",
X "webspawner.com",
X "webwomen.com",
X "west.net",
X "westcoast.idc.uvic.ca",
X "westcoastmemory.com",
X "where.com",
X "whereareyou.com",
X "winternet.com",
X "wishing.com",
X "wiznet.ca",
X "world-services.com",
X "worldramp.net",
X "worldreach.net",
X "wwems.com",
X "x-statik.com",
X "xe.com",
X "xe.net",
X "xxxjournal.net",
X "xxxstorage.com",
X "your-house.com",
X "yourcomputer.com",
X "yourinfo.com",
X "yourmail.com",
X "yourname.com",
X "yuhoo.com",
X "zone.net",
X "zr1.com",
X );
X
X if (0) {
X # Look for valid DNS entries; do before sorting for sanity
X for ($i = 0; $i < @SPAMMERS; $i ++) {
X ($name, $aliases, $type, $len, $thataddr) = gethostbyname($SPAMMERS[$i]);
X if (!defined($name) || $name eq "") {
X print "# no DNS for $SPAMMERS[$i]\n";
X }
X else {
X print "\t\"$SPAMMERS[$i]\",\n";
X }
X }
X }
X
X @SPAMMERS = sort @SPAMMERS; # needed for bsearch to work
X if (0) {
X # Check the sorted list for weirdnesses
X for ($i = 0; $i < @SPAMMERS; $i ++) {
X print "uppercase in $SPAMMERS[$i]\n"
X if $SPAMMERS[$i] =~ /[A-Z]/;
X next if $SPAMMERS[$i] ne $SPAMMERS[$i + 1];
X print "duplicate spammer: $SPAMMERS[$i]\n";
X }
X print "$#SPAMMERS spammers\n";
X for ($i = 0; $i < @SPAMMERS; $i ++) { # verify that bsearch is sane
X if (!&is_spammer($SPAMMERS[$i])) {
X print "is_spammer failed on $SPAMMERS[$i]\n";
X }
X }
X }
X
} # initialize
X
#-----------------------------------------------
# Create standard text for a response.
sub insert_standard_text {
X local ($response);
X
X $name = '$RCSfile: adcomplain.pl,v $'; # filled in by RCS
X $pat = 'RCSfile:'; # have to fool rcs
X $name =~ s/\$$pat (.*),v \$/$1/;
X $rev = '$Revision: 3.5 $'; # filled in by RCS
X $pat = 'Revision:'; # have to fool rcs
X $rev =~ s/\$$pat (.*) \$/$1/;
X $response = "[generated by $name $rev]\n\n";
X
X if ($header_analysis ne "") {
X $response .= "I am complaining about ";
X if ($chainmode) {
X $response .= "an illegal chain letter ";
X }
X else {
X $response .= "a commercial advertisement ";
X }
X if ($mailmode) {
X $response .= "sent to my e-mail address.";
X }
X else {
X $response .= "posted to $newsgroup.";
X }
X $response .= "\n";
X $response .= <<'END';
This message apparently passed through your site. It may even have originated
with you. However, there are logical inconsistencies in the RFC-822 mail
headers. It is possible that a mail program was buggy or misconfigured, but it
is much more likely that the sender has committed criminal wire fraud,
deliberately obscuring the message's true origination:
X
END
X $response .= "$header_analysis";
X } # $header_analysis
X else { # legit headers
X $response .= "Please ";
X if ($recipient != $complain_to_only) {
X $response .= "don't ";
X }
X else {
X $response .= "advise this user not to ";
X }
X if ($mailmode) {
X $response .= "mail ";
X }
X else {
X $response .= "post ";
X }
X $response .= "these ";
X if ($chainmode) {
X $response .= "illegal chain letters ";
X }
X else {
X $response .= "unsolicited commercial advertisements ";
X }
X $response .= "to ";
X if ($mailmode) {
X $response .= "people's e-mail addresses. ";
X }
X else {
X $response .= "$newsgroup. ";
X }
X $response .= "My site must pay to receive and store them.\n";
X if (@spammer_list != 0) {
X $response .= "Furthermore, the headers refer to known spammers";
X $response .= "($spammer_domain.)\n";
X }
X } # legit headers
X if (!$chainmode && !$mailmode && !$quiet) {
X $ans = &get_answer("Is \"$subject\" relevant to $newsgroup (y/n)?",
X "n");
X if ($ans eq "n") {
X $response .= "\nIn addition, \"$subject\"\n";
X $response .= "has nothing to do with $newsgroup.\n";
X }
X }
X if (!$noinclude || $recipient ne $poster_only) {
X $response .= "\nI forward the entire text of the message, with ";
X $response .= "headers, to the end of this message.\n";
X }
X $response .= "\n";
X
X if ($chainmode) {
X $response .= <<'END';
This sort of chain letter is a pyramid scheme, which in turn is a form of fraud.
It violates a U.S. federal statute, 18 U.S.C. sec. 1343.
X
If at any point the U.S. Mail is used, this is also a violation of 18 U.S.C
sec. 1302, the Postal Lottery Statute. See
X
X http://www.usps.gov/websites/depart/inspect/chainlet.htm
X http://www.usps.gov/websites/depart/inspect/usc18/mailfr.htm
X
This sort of chain letter is outlawed in Canada under the Section 206(1)(e) of
the Criminal Code and under Section 55 of the Competition Act.
X
END
X }
X else { # advertising
X if ($mailmode) {
X $response .= <<'END';
These advertisements are illegal in many countries; please consult an attorney
for your applicable statutes.
X
END
X }
X else { # Usenet
X if ($recipient != $complain_to_only) {
X $response .= <<'END';
The biz.marketplace and ads newsgroup hierarchies are the correct places for
commercial ads. (Ads may be inappropriate in some biz newsgroups, so please
check first.)
X
For more information about Usenet etiquette, see news.announce.newusers.
X
END
X }
X } # Usenet
X } # advertising
X
X if (!$mailmode && $recipient != $complain_to_only) { # cancel your post
X $response .= <<'END';
Most text-based newsreaders will allow you to cancel a posting by finding your
article and pressing 'C' or 'D'.
X
(Netscape users can select 'Cancel Message' in the 'Edit' menu.)
If you need help, contact
END
X if ($postmaster ne "") {
X $response .= "your postmaster at\n\n";
X $response .= " <$postmaster>.\n";
X }
X else {
X $response .= "postmaster.\n";
X }
X $response .= "\n";
X } # cancel your post
X
X $response .= "Thank you.\n\n";
X
X if ($recipient == $complain_to_only && $header_analysis eq ""
X && @spammer_list ne 0) {
X $response .= <<'END';
Note: I did not contact this user directly because I do not wish to be
mailbombed, threatened, or have my my e-mail address
collected for (further) commercial use.
X
END
X }
X
X # batchmode
X if ($batchmode) {
X $response .= <<'END';
X
P.S. -- I used the questionable "batch mode" in adcomplain to create
this message. If this message was addressed improperly, it is because I
did not proofread the list of recipients before mailing. Direct
your complaints to me, not to the authors of adcomplain. Thank you.
END
X }
X # format the response
X $response = &fmt($response, 72);
X
X return $response;
X }
X
#-----------------------------------------------
# compose a message out of all of the elements so far
sub compose_message {
X local ($response);
X
X return &insert_standard_text if $complaintFile eq "";
X $response = "";
X if ($complaintFile ne "") {
X if (-f $complaintFile) {
X if (!open(TEXTFILE, "$complaintFile")) {
X print "adcomplain: cannot open $complaintFile: $!\n";
X }
X else {
X @text = <TEXTFILE>;
X $response = join('', @text);
X close TEXTFILE;
X @text = (); # garbage collection
X }
X }
X else {
X print "adcomplain: $complaintFile: no such file.\n";
X #require "getcwd.pl";
X #$cwd = &getcwd;
X #print "adcomplain: (current directory is $cwd)\n";
X }
X
X # interpolate perl variables into the response string
X $response = eval "\"" . "$response" . "\"";
X return $response;
X } # $complaintFile given
} # compose_message
X
#-----------------------------------------------
# Ask a question and get a reply from /dev/tty, use default if no reply given:
sub get_answer {
X local($prompt, $default) = @_;
X local($ans);
X local($/) = "\n";
X
X print "$prompt [$default] ";
X $ans = <STDIN>;
X chop($ans);
X return $ans if ($ans ne "");
X return $default;
X }
X
#-----------------------------------------------
# format a string into paragraphs with given maximum line length.
sub fmt {
X local($str, $len) = @_;
X local(@lines) = split(/\n/, $str);
X # local(@paras) = split(/\n{2,}/, $str);
X local(@paras);
X local($para, $result, $left, $word);
X local($last_was_bullet, $is_bullet, $junk);
X
X # split into paragraphs
X @paras = ();
X $para = "";
X for (@lines) {
X if ($_ eq "\n" || $_ eq "") {
X # blank line delimits beginning of paragraph
X push(@paras, $para);
X push(@paras, "");
X $para = "";
X next;
X }
X $_ =~ s/\n/ /g;
X if ($_ =~ /^[\s]+.*/) { # so does a line beginning with white space
X push(@paras, $para) if $para ne "";
X $para = "";
X }
X
X # Join the line, using proper respect for punctuation
X if ($para =~ /.*\.\s*$/) { # ends in a period
X $para =~ s/(.*\.)\s*$/$1 /;
X }
X elsif ($para =~ /.*:\s*$/) { # ends in a colon
X $para =~ s/(.*:)\s*$/$1 /;
X }
X elsif ($para =~ /.*!\s*$/) { # ends in an exclamation
X $para =~ s/(.*!)\s*$/$1 /;
X }
X else {
X $para .= " " if $para ne "";
X }
X $para .= $_;
X }
X push(@paras, $para) if $para ne "";
X
X # Reformat the paragraphs
X $result = "";
X $last_was_bullet = 0;
X $junk = $bullet;
X $junk =~ s/(\W)/\\$1/g; # remove special characters
X $junk = "^$junk.*";
X for (@paras) {
X $left = $len;
X $is_bullet = ($_ =~ /$junk/) ? 1 : 0;
X
X # special case: indentation at beginning of paragraph is preserved
X if ($_ =~ /^\s+/) {
X ($word = $_) =~ s/^(\s+).*/$1/;
X $left -= length($word);
X $result .= $word;
X }
X
X # Now start adding the words
X while ($_ =~ s/^\s*(\S+\s*)//) {
X $word = $1;
X if (length($word) < $left) {
X $result .= $word;
X $left -= length($word);
X }
X else {
X if ($is_bullet) {
X $result .= "\n$bullet2$word";
X }
X else {
X $result .= "\n$word";
X }
X $left = $len - length($word);
X }
X }
X $result .= "\n" if !$last_was_bullet;
X $last_was_bullet = $is_bullet;
X }
return $result;
}
X
#-----------------------------------------------
sub display {
X local($my_name, $start, $count, @lines) = @_;
X local($i, $max);
X
X if ($start + $count <= $#lines) {
X $max = $start + $count;
X }
X else {
X $max = $#lines;
X }
X for ($i = $start; $i < $max; $i ++) {
X print $lines[$i];
X }
X printf "- $my_name: %d/$#lines: ", $start + 1;
X }
X
# an internally implemented pager
sub moref {
X local($tempname) = @_; # the file to display
X local($my_name) = "moref";
X local ($line_count) = 0;
X local ($lines_per_screen) = 22;
X local ($kbd_cmd, $front, $back);
X local (@all_lines);
X
X if ($pager ne "") {
X if ($os_kind eq "unix") {
X system "$pager $tempname <$CONSOLE";
X }
X elsif ($os_kind eq "winnt" || $os_kind eq "win32") {
X system "$pager $tempname";
X }
X else {
X die "how do I run your pager on this system?";
X }
X return;
X }
X
X if (defined($ENV{"LINES"}) && $ENV{"LINES"} != 0) {
X # Unix termcap convention
X $lines_per_screen = $ENV{"LINES"} - 1;
X }
X
X open (MOREF, "<$tempname") || die "$my_name: can't open $tempname: $!";
X @all_lines = <MOREF>;
X close MOREF;
X
X # At this point it's still possible that some of the lines may be oversize,
X # because we don't format the original mail message from the sender; we go
X # the entire message and break up any oversized lines.
X for ($i = 0; $i <= $#all_lines; $i ++) {
X next if length($all_lines[$i]) < 80;
X $front = substr($all_lines[$i], 0, 79);
X $back = substr($all_lines[$i], 79);
X $all_lines[$i] = "$front\n";
X splice(@all_lines, $i + 1, 0, $back);
X }
X
X $line_count = 0;
X for (;;) {
X &display($my_name, $line_count, $lines_per_screen, @all_lines);
X $kbd_cmd = <STDIN>;
X chop($kbd_cmd);
X if ($kbd_cmd eq "") {
X $line_count += $lines_per_screen;
X $line_count = $#all_lines if $line_count > $#all_lines;
X next;
X }
X elsif ($kbd_cmd =~ /^\?.*/) {
X print "? - this message\n";
X print "<enter> - next page\n";
X print "b - back a page\n";
X print "nnnn -- start with given number line\n";
X print "q - quit\n";
X print "press enter to continue... ";
X $kbd_cmd = <STDIN>;
X }
X elsif ($kbd_cmd =~ /^b.*/i) {
X $line_count -= $lines_per_screen;
X $line_count = 0 if $line_count < 0;
X next;
X }
X elsif ($kbd_cmd =~ /^q.*/i) {
X last;
X }
X elsif ($kbd_cmd =~ /^\d+$/) {
X $line_count = $kbd_cmd - 1; # take input as one-based line number
X $line_count = $#all_lines if $line_count > $#all_lines;
X next;
X }
X else {
X print "what? (\"?<Enter>\" at the prompt for help): ";
X print "for now, press enter to continue... ";
X $kbd_cmd = <STDIN>;
X }
X }
}
SHAR_EOF
chmod 0755 adcomplain.pl ||
echo 'restore of adcomplain.pl failed'
Wc_c="`wc -c < 'adcomplain.pl'`"
test 175436 -eq "$Wc_c" ||
echo 'adcomplain.pl: original size 175436, current size' "$Wc_c"
fi
exit 0
--
Bill McFadden Tektronix, Inc. P.O. Box 500 MS 50-350 Beaverton, OR 97077
bill.m...@tek.com http://www.rdrop.com/users/billmc
CAUTION: Don't look into laser beam with remaining eye.
Any opinions expressed above are not necessarily those of Tektronix, Inc.