RBLcheck version 2.3
====================

Documentation
-------------

TOC
===
1.  What is it
2.  Installation
3.  Configuration of RBLcheck
3.1 Editing the configuration
3.2 Profiles
3.3 Configuration parameters
4.  Configuration of email program
4.1 PMMail/2
4.2 RexxMail
4.3 MR2Ice
4.4 Post Road Mailer
4.5 Weasel
4.6 Thunderbird
4.7 Other
5.  Tuning
5.1 Start with care
5.2 After some time
5.3 Add a RBL
6.  Working
7.  Info about RBL's to use
8.  Problem determination
8.1 Log file
8.2 Spam message
8.3 Normal message
9.  Legal stuff
9.1 Copyright
9.2 Disclaimer
10. Changelog
11. Contact


1.  What is it
==============
RBLcheck is a program that might help against the annoyance of spam email.
It can be used to check email messages whether they were sent though
well-known open mail relays, or other frequently used hosts on the Internet.
It does so by checking the hops the email message went against some real-time
blacklists. If found, it tags the message with the score. What you want to do
with the message, is up to you; you can build filters to check the tags added
by RBLcheck, and act upon them.


2.  Installation
================
Place RBLcheck.cmd, RBLcheck.ini and RBLqDNS.cmd somewhere on your hard drive.
They must be in the same directory.
You can change the name of RBLcheck.cmd. The name before the dot should be the
same for the script and the ini file!
You can call RBLcheck like this:
- RBLcheck [options] message [options]
where 'message' is the full path to the message to scan.
Each option starts with '/' or '-'.
Currently, RBLcheck understands one option:
- </|->p:profile
  where 'profile' is the name of the profile in the ini file to use. The
  profile name can't contain spaces.
Examples:
- RBLcheck message.txt
- RBLcheck /p:provider message.txt
- RBLcheck message.txt -p:provider
Set up your mail client to run RBLcheck.cmd on received messages, before
other filters run.


3.  Configuration of RBLcheck
=============================

3.1 Editing the configuration
-----------------------------
Edit RBLcheck.ini with a text editor. Everything can be configured with this
ini file. Please do not edit RBLcheck.cmd: the values in the script are only
used as default values (if you don't specify them in the ini file).
The last line in the ini file should be completely empty!

3.2 Profiles
------------
It is possible to create different sets of parameters, while a set can be
chosen with the command line parameter </|->p:profile. In this way, you can use
different parameters for RBLcheck with each email account.
The start of a new profile in the ini file is indicated by a line that consists
of the profile name between square brackets. All parameters that follow below
the profile header will only be used if RBLcheck is started for that profile.
General parameters, which will be used with each profile should be above the
first profile header.
If RBLcheck is started without mentioning a profile name, the name 'default'
will be used.
A profile name can't contain spaces.
Example ini file:
  parameter a
  [ISP]
  parameter b
  [hosting]
  parameter c
  [default]
  parameter d
'RBLcheck message.txt' will use parameter a and d.
'RBLcheck /p:ISP message.txt' will use parameter a and b.
'RBLcheck message.txt -p:hosting' will use parameter a and c.
If you only have one email account, you can simply leave all profile headers
out and start RBLcheck without the /p:profile option. In this way it is
downwards compatible with previous versions of RBLcheck.

3.3 Configuration parameters
----------------------------
Format of any line in the script (except the profile headers):
keyword parameter
or
keyword parameter parameter parameter
or
;any comment
Keywords and parameters are separated by one or more spaces or tabs.
It recognizes the following keywords, which may occur once:
- Logfile
  Description: lets you set a logfile.
  # parameters: 1: path and filename for logfile.
  Default: c:\RBLcheck.log.
- Loglevel
  Description: lets you set the level of detail for the log.
  # parameters: 1
  Possible values: 0-4.
  Meaning: 0: none. 1: minimal. 2: normal. 3: extended. 4: debug.
  Default: 2.
- Conlevel
  Description: lets you set the level of detail for output on the console
  (screen).
  # parameters: 1
  Possible values: 0-4.
  Meaning: 0: none. 1: minimal. 2: normal. 3: extended. 4: debug.
  Default: 4.
- Triggerlevel
  Description: sets the level to check the final score for a message against.
  # parameters: 1
  Possible values: any positive value.
  Default: 10.
- SkipLastHops
  Description: The last x hop(s) in the chain will be skipped. As with each hop
  a "Received: " header is added above all existing headers, the first x hops
  from the top op the header lines will be skipped. This can be used if your
  mail is being forwarded to your pop box and you don't want to check the
  forwarding host, or if your provider forwards your mail internally to an
  other host and you don't want to check your provider.
  # parameters: 1
  Possible values: any integer >= 0.
  Default: 0.
- HaltAtTrigger
  Description: This lets you choose whether you want to see the complete score
  or want to stop testing as soon as the triggerlevel is reached. Especially
  when you have many RBLs in the ini file, you might want to stop at the
  triggerlevel, as checking all hops against all RBLs takes some time.
  Please note that, when enabled, the final score isn't logged or saved
  in the message any more, as this would not make much sense.
  # parameters: 1
  Possible values: 0, 1.
  Meaning: 0: disabled, check everything. 1: enabled, halt at triggerlevel.
  Default: 0.
- VersionStamp
  Description: This lets you choose whether you want the RBLcheck version
  number added in a separate line to the headers.
  # parameters: 1
  Possible values: 0-1.
  Meaning: 0: no version added. 1: version added.
  Default: 1.
- LookupTimeout
  Description: This lets you set the time to wait for answers from the DNS
  lookups at the RBL's.
  # parameters: 1
  Possible values: any integer >= 0.
  Meaning: Number of seconds to wait for results. Received results after this
  time will be ignored.
  Default: 30
- ReturnCode
  Description: This lets you set how much detail the script should return as a
  return code (error level) to the calling program.
  # parameters: 1
  Possible values: 0-3.
  Meaning: 0: Always return 0. 1: Return 1 if trigger reached. 2: Return 1 if
  some hits, 2 if trigger reached. 3: Return final score (rounded down).
  Default: 0.
- Xheaders
  Description: This lets you choose the sort of X-RBLcheck headers that will be
  added to the message.
  # parameters: 1
  Possible values: 0-1.
  Meaning: 0: Use the headers as in pre-v2.2 (X-RBLcheck-version, X-RBLcheck-
  hits, X-RBLcheck, X-RBLcheck-score and X-RBLcheck-trigger-reached). 1: Use
  bayesian filters optimized headers (all headers start with 'X-RBLcheck:',
  after that: v2.x..., RBLcheck-hit-at-[RBL name], RBLcheck-no-hits,
  RBLcheck-some-hits, RBLcheck-score, RBLcheck-trigger-not-reached,
  RBLcheck-trigger-reached). This set of headers are optimized for bayesian
  filters to be used as tokens, possibly eliminating the need to build filters
  for the X-RBLcheck headers yourself.
  Default: 0.
- ReportInSubject
  Description: With this keyword you can choose to report to the subject line.
  This might be needed for email clients that lack filtering on any header
  line, like for example Outlook Express.
  # parameters: 1
  Possible values: 0-1.
  Meaning: 0: Don't report to subject line. 1: Report to subject line. If there
  are hits, the subject will be prepended by "*** SPAM? (score) *** " (if the
  trigger was not reached) or "*** SPAM! (score) *** " (if the trigger was
  reached).
  Default: 0.
It also recognizes the following keywords, which may occur more than once:
- RBL
  Description: defines a real-time blacklist.
  # parameters: 3
  Parameter 1: name (descriptive), it will be used in tagging and logging.
  Parameter 2: dns zone name. All RBL's on the Internet have a name defined
  like this. This is where the real test will take place.
  Parameter 3: score for this RBL.
- SkipIP
  Description: defines an IP address that should not be tested.
  # parameters: 1: IP-address
- HitIP
  Description: defines an IP address that will result in a hit.
  # parameters: 3
  Parameter 1: name (descriptive), it will be used in tagging and logging.
  Parameter 2: IP address. This is where IP addresses of the received lines
  will be checked against.
  Parameter 3: score for this IP address.
The distribution has an ini file, containing some RBL's. This is just a set of
RBL's I use, feel free to add, modify or delete any of them. Please read
chapter 5 for tuning tips.


4.  Configuration of email program
==================================
If you use RBLcheck with POPprxy, you can skip the 'Add RBLcheck' parts below.
All filter examples below assume you use (the default) 'Xheaders 0' in the ini
file. If you use 'Xheaders 1', make sure you use the right headers to check.

4.1 PMMail/2
------------
(version 2.20.2380, older version may be different)
Add RBLcheck:
- Menu Account -> Account Settings... -> Tab REXX
- Check the box for Message Receive Exit.
- At Script to Run, fill in drive, path and filename. PMMail will add the
  parameter, you won't see this.
Create filter(s):
- Menu Account -> Filters...
- Click 'New'
- Choose a description, e.g. RBLcheck trigger reached
- Check Enabled
- Search: select <Header>
- For: enter X-RBLcheck header to filter on (see chapter 5)
- Type: Incoming (and Manual, if you want)
- Actions: select appropriate action(s)

4.2 RexxMail
------------
Full instructions to use RBLcheck with RexxMail, are included in the RexxMail
documentation. If you don't have it (any more), get the latest version at
<http://www.degeus.com/rexxmail/>.

4.3 MR2Ice
----------
(version 2.41, other versions may differ)
Add RBLcheck by making a filter without actions:
- Menu Utilities -> Filter maintenance...
- Create a new filter, name it "RBLcheck run".
- Search type: select REXX.
- REXX Script: Enter path and filename of RBLcheck.
- Filter Type: select Inbound.
- Tab Actions: select none of the options.
- Tab Disposition: select Show, don't check other options.
Create filter(s):
- Create new filter(s) as above.
- Search type: Simple.
- Uncheck All areas, check Header
- Enter X-RBLcheck header to filter on (see chapter 5).
- Complete filter settings with appropriate actions and disposition.

4.4 Post Road Mailer
--------------------
(version 3.0, other versions may differ)
Add RBLcheck:
- Menu File -> Settings... -> Tab User Exit Programs
- In the upper part (Receive message exit), fill in drive, path and filename of
  RBLcheck
- Check Exit is active
- You probably want to run the script in the Background
- Close the Settings window by double clicking upper left corner, or Alt-F4
Create filter(s):
- Menu Features -> Filters
- Double-click 'Add a new message filter'
- Choose a Description, e.g. RBLcheck trigger reached
- Search String: enter X-RBLcheck header to filter on (see chapter 5)
- Below Reaction: select appropriate action(s) and fill in the other
  required fields for that specific reaction
- Below Search, choose Message headers
- Below Options, select Filter is active

4.5 Weasel
----------
- Create a cmd file containing something like this:
  call RBLcheck.cmd %2
  echo : errorlevel : %?
  iff errorlevel ge 1 then
    echo 554 Mail rejected due to RBL hits. >%1
    exit 4
  endiff
  exit 0
- Edit RBLcheck.ini, so it contains the line:
  ReturnCode 1
- Add the created cmd file as a stage 4 filter to Weasel.
I have tested this once and it worked. Depending on your situation,
you might have to add the path to RBLcheck.

4.6 Thunderbird
---------------
There are two ways to use the added headers to filter spam out.
1: Use the bayesian junk filter within Thunderbird.
Place 'Xheaders 1' in the ini file. Configure Thunderbird to do bayesian
filtering (already by default?). Thunderbird then should use the
added headers as tokens while deciding to mark a message as junk or not. It
might take some time for the filters to learn the value of each header.
2: Create filter(s):
- Create a new filter
- Choose a description, e.g. RBLcheck trigger reached
- From the left drop down menu, select 'Customize...'
- Enter the header you want to filter on (see chapter 5), only the part up to
  (but not including) the ':' (e.g. 'X-RBLcheck-trigger-reached'), then click
  'Add', then 'OK'.
- From the left drop down menu, now select the header you added.
- Select the conditions to match (e.g. 'X-RBLcheck-trigger-reached', 'is',
  'true')
- Perform these actions: select appropriate action(s) (e.g. 'Set Junk Status
  to', 'Junk')
The procedure might be similar for Mozilla.

4.7 Other
---------
For other email programs: consult the documentation for your email program. I
hope to add more here, but since I only use PMMail, I haven't tested them.
If you got it working on an email program not mentioned here, please let me
know!


5.  Tuning
==========

This program is not "fire and forget"! You might loose mail if tuned wrong!
Please read this chapter carefully!
(I know you probably won't read it, and, if you do read it, you won't follow
the recommendations... but... don't blame me for loosing mail!)

5.1 Start with care
-------------------
Create two folders, "Maybe Spam" and "Probably Spam"
With Xheaders set to 0, add two filters in your email program:
- "X-RBLcheck-trigger-reached: true" -> move to "Probably Spam"
- "X-RBLcheck-trigger-reached: false" -> move to "Maybe Spam"
With Xheaders set to 1, add two filters in your email program:
- "X-RBLcheck: RBLcheck-trigger-reached" -> move to "Probably Spam"
- "X-RBLcheck: RBLcheck-trigger-not-reached" -> move to "Maybe Spam"
Now, see what happens. If messages get sorted to the wrong folders, check the
headers of that message to see by which RBL it was found. Then, adjust the
score for that RBL in the ini file. Depending on the amount of spam you tend
to receive, you should do this for some days up to some weeks.

5.2 After some time
-------------------
After some time, if you are happy with the way it filters, you can change the
first filter ("X-RBLcheck-trigger-reached: true" or
"X-RBLcheck: RBLcheck-trigger-reached") to move the message to the trash folder
or to delete it.
You should keep a "Probably Spam" folder for the
"X-RBLcheck-trigger-reached: false" or
"X-RBLcheck: RBLcheck-trigger-not-reached".

5.3 Add a RBL
-------------
You can add a RBL to your ini file, but, as you probably don't know yet how
well it works, you should give it a score 0. This way, it will be logged and
added as headers in the messages, but won't influence the final score. After
some time, not before you have a good feeling about it, you could give it a
score larger than 0. From then on, it will be counted and might influence the
reaching of the trigger level.


6.  Working
===========
First, all current headers starting with X-RBLcheck will be deleted. (So you
can run the script over the same message again and again.) All headers that
RBLcheck will add, start with X-RBLcheck.
All Received:-lines from the message will be checked against all RBL's defined
in the ini file. For each hit, a header will be added:
  X-RBLcheck-hits: [IP address] found at [RBL name] (score: [score])
or:
  X-RBLcheck: RBLcheck-hit-at-[RBL name] [IP address]
After all checking, a header will be added, whether a hit was found or not.
If no hit was found:
  X-RBLcheck: negative
or:
  X-RBLcheck: RBLcheck-no-hits
No other headers will be added in this case.
If one or more hits were found:
  X-RBLcheck: positive
  X-RBLcheck-score: [score]
or:
  X-RBLcheck: RBLcheck-some-hits
  X-RBLcheck: RBLcheck-score [score]
This header will indicate the cumulative score of all hits.
Finally, the cumulative score will be checked against the trigger level.
If the trigger level is reached:
  X-RBLcheck-trigger-reached: true
or:
  X-RBLcheck: RBLcheck-trigger-reached
If the trigger level is not reached:
  X-RBLcheck-trigger-reached: false
or:
  X-RBLcheck: RBLcheck-trigger-not-reached
For two examples of what could be added, see chapter 8.


7.  Info about RBL's to use
===========================
There are lots of RBL's. Some contain only very few spamming hosts, some
contain extensive lists. Some test hosts themselves, some add hosts because
users ask them to add that host.
Some don't list hosts that send spam, some list hosts that don't send spam,
some maybe do both!
So, the quality of RBL's are quite different!
There are a few RBL's in the ini file within the package. They work for me.
They might work bad for you...
Please check the following internet resources for more info about various RBL's.
http://www.declude.com/JunkMail/Support/ip4r.htm - up-to-date list of RBL's
http://rhols66.adsl.netsonic.fi/era/rbl/rbl.html - out of date list of RBL's
http://www.openrbl.org/ - try multiple RBL's
http://rbls.org/ - try multiple RBL's
You could also search the Internet for RBL or DNSBL.


8.  Problem determination
=========================

8.1 Log file
------------
Each line within the log file has this general layout:
[ID] [time] [phase] [message]
ID: Each message will receive an ID, which will be used in every log line. This
is to be able to identify log lines when two or more instances of RBLcheck ran
at the same time. It is created by using the current time, up to milliseconds.
This makes the ID rather unique and makes it easy to sort the log file.
Phase: RBLcheck normally goes through 7 phases:
Phase 1: Initialization, read ini file.
Phase 2: Read message headers, find IP addresses.
Phase 3: Check IP addresses at the RBL's.
Phase 4: Add RBLcheck headers.
Phase 5: Read message body.
Phase 6: Write message headers.
Phase 7: Write message body.
Message: Depending on LogLevel defined in the ini file, more or less logging
will occur. To identify which log line was added because of which level, the
message is indented, one space for each level.

8.2 Spam message
----------------
This is an example of a spam message and the corresponding log file.
Header lines of the message:
  Return-Path: <zenaarrasmithlakeshaanneke@surfpure.com>
  Received: from besse.nl (cm-tvcidade-rec-C8B14B90.brdterra.com.br [200.177.75.144])
  	by bert.icmc.nl (8.12.1-20030917/8.12.1) with SMTP id i0I3ukwr000723
  	for <webmaster@besse.nl>; Sun, 18 Jan 2004 04:56:57 +0100
  Received: from a213-22-153-106.netcabo.pt (a213-22-153-106.netcabo.pt [213.22.153.106] ) by mail.vanovost.com
      (Hethmon Brothers Smtpd) ; Fri, 16 Jan 2004 09:58:56 +0100
  Received: from [213.22.153.106] by 3001hosting.comIP with HTTP;
  	Fri, 16 Jan 2004 03:48:15 -0500
  Received: from [127.0.0.1] by 3001hosting.comIP with HTTP;
  	Fri, 16 Jan 2004 03:48:15 -0500
  Received: (qmail 74594 invoked from network); 19 Jan 2004 23:07:24 -0000
  Message-Id: <200401180356.i0I3ukwr000723@bert.icmc.nl>
  From: "zenaarrasmithlakeshaanneke@surfpure.com" <zenaarrasmithlakeshaanneke@surfpure.com>
  To: "zenaarrasmithlakeshaanneke@surfpure.com" <zenaarrasmithlakeshaanneke@surfpure.com>
  Subject: Hi, i changed my email adress :), (1A463DCFC)
  Date: Sun, 18 Jan 2004 04:56:51 
  X-Priority: 3
  Mime-Version: 1.0
  X-Mailer: Microsoft Outlook Express 6.00.2800.1106
  Content-Type: multipart/mixed;
  	boundary="----=_NextPart_fdece94a-8fcd-4611-8593-05869f80f1d0"
  X-Virus-Scanned: by AMaViS at ICMC Hosting BV
  X-UIDL: ?#]!!2\<"!_Yd!!:Sd"!
  X-RBLcheck-version: 2.0 (see http://rblcheck.besse.nl/)
  X-RBLcheck-hits: 200.177.75.144 found at blitzed (score: 5)
  X-RBLcheck-hits: 200.177.75.144 found at njabl (score: 5)
  X-RBLcheck-hits: 200.177.75.144 found at abuseat (score: 5)
  X-RBLcheck-hits: 200.177.75.144 found at dsbl (score: 10)
  X-RBLcheck-hits: 213.22.153.106 found at dsbl (score: 10)
  X-RBLcheck: positive
  X-RBLcheck-score: 35
  X-RBLcheck-trigger-reached: true
Entries in logfile:
  2004110510115264 10:11:52.64 01 --- RBLcheck started, version 2.0, loglevel 2
  2004110510115264 10:11:52.66 02  From: "zenaarrasmithlakeshaanneke@surfpure.com" <zenaarrasmithlakeshaanneke@surfpure.com>
  2004110510115264 10:11:52.66 02 Subject: Hi, i changed my email adress :), (1A463DCFC)
  2004110510115264 10:11:53.68 03  Hit: 200.177.75.144 found at blitzed: 127.1.0.20 (score: 5)
  2004110510115264 10:11:53.68 03  Hit: 200.177.75.144 found at njabl: 127.0.0.9 (score: 5)
  2004110510115264 10:11:55.70 03  Hit: 200.177.75.144 found at abuseat: 127.0.0.2 (score: 5)
  2004110510115264 10:11:56.71 03  Hit: 200.177.75.144 found at dsbl: 127.0.0.2 (score: 10)
  2004110510115264 10:11:57.75 03  Hit: 213.22.153.106 found at dsbl: 127.0.0.2 (score: 10)
  2004110510115264 10:11:57.75 04 RBLcheck positive: some hits.
  2004110510115264 10:11:57.75 04  Final score: 35
  2004110510115264 10:11:57.75 04 Trigger reached.
  2004110510115264 10:11:57.75 07 --- RBLcheck finished

8.3 Normal message
------------------
This is an example of a normal message and the corresponding log file.
Added headers by RBLcheck:
  X-RBLcheck-version: 2.0 (see http://rblcheck.besse.nl/)
  X-RBLcheck: negative
Entries in logfile:
  2004110510081409 10:08:14.09 01 --- RBLcheck started, version 2.0, loglevel 2
  2004110510081409 10:08:14.11 02  From: "*****" <*****>
  2004110510081409 10:08:14.11 02 Subject: Re: *****
  2004110510081409 10:08:23.29 04 RBLcheck negative: no hits.
  2004110510081409 10:08:23.29 07 --- RBLcheck finished


9.  Legal stuff
===============

9.1 Copyright
-------------
Copyright (C) 2004,2005 Jeroen Besse
All code was written by me, Jeroen Besse, and remains my property. You have the
right to use the unmodified script. You may not sell, trade, redistribute or
give away the script to others.

9.2 Disclaimer
--------------
This program comes without any warranty whatsoever. Although it was created
to do certain things, you have no guarantee that it will do that. In fact, the
only guarantee I give when you download the program, it that it will take up
some disk space.
Extra warning: the program was created to alter each message that it works on.
Although (see above) you don't have any guarantee that it will, chances are
quite high that it will alter any message you feed to it. So, as it changes
your message, there is also chance that it corrupts it. So you have been
warned: any data corruption or deletion is the user's responsibility, not the
responsibility of the author.
Short: the user is responsible for anything that the program does. The author
isn't responsible for anything that the program does.


10. Changelog
=============
v2.3 - 2005-06-09
- FEATURE: Report to subject line (for clients with limited filter
  capabilities)
v2.2 - 2005-02-02
- FEATURE: New set of X-RBLcheck headers, optimized for bayesian filtering (as
  used in Thunderbird).
- FEATURE: Profiles, selectable from a command line parameter.
- FIXED: Some DNS servers return an IP address of a 'page not found' website
  if the name cannot be resolved. RBLcheck now checks whether the resulting
  IP address is in the 127.x.x.x range.
v2.1 - 2005-01-03
- CHANGED: Header parsing has improved, it now first tries to find an IP
  address according to the RFC, if not found it will grab the last string that
  looks like an IP address. The keyword ReceivedRFC has been dropped because of
  this.
- FEATURE: New keyword HitIP, which is the opposite of SkipIP. If the trigger
  is reached by use of HitIP, and HaltAtTrigger is set to 1, no DNS lookups
  will occur. (Fast!)
v2.0 - 2004-11-07
- FEATURE: Parallel DNS requests; major performance gain!
- FEATURE: Adjustable DNS lookup timeout
- FEATURE: Each handled email gets a unique id, which is used on every log
  line. This helps identifying log entries when 2 or more instances of RBLcheck
  run at the same time.
- FEATURE: Follows RFC to find IP-address in header line or (configurable)
  use anything that looks like an IP-address anywhere within header line.
- FEATURE: Return code (error level) can be configured to reflect the result.
- CHANGED: Default for TriggerLevel is now 10. All score values in the shipped
  RBLcheck.ini are now integers (in fact they are multiplied by 10).
v1.5 - 2004-07-27
- FIXED: Files are closed as soon as possible to prevent file locking.
- FIXED: Large messages were handled very slow.
v1.4 - 2004-04-23
- FIXED: Tabs are now allowed in ini file
- FEATURE: Use RxSock.dll instead of host.exe, better error handling of
  lookup conditions
- FEATURE: Logging to screen, independent of logging to logfile
- FEATURE: Version number of RBLcheck can be added in header
- FEATURE: Sample ini file has new/changed RBL's, as used by author
  (multihop.dsbl and unconfirmed.dsbl removed, because dsbl is quite slow)
v1.3 - 2004-03-21
- FEATURE: Stop checking as soon as triggerlevel is reached
- FEATURE: Last hops of message can be skipped
v1.2 - 2004-02-01
- FIXED: If hit(s) found but final score is 0, it creates the header
  X-RBLcheck: negative
v1.1 - 2004-01-24
- FIXED: Better error handling
- FIXED: Check each IP address only once, even if found in more Received
  headers
- FIXED: Only 1st line of folded header line was interpreted
- FIXED: Now only the from field of the Received header is being searched
  for an IP address
- FIXED: Don't check private, reserved or loopback IP address ranges
- FEATURE: Levels of logging, including no logging
- FEATURE: Configurable IP addresses to not test (SMTP servers of
  provider)
v1.0 - 2004-01-11
- First public version


11. Contact
===========
Visit http://rblcheck.besse.nl/ for the latest version, support forum etc.
You can contact the author at os2software@besse.nl
