You are on page 1of 18

============================

[ Blat ChangeLog Legend: ]


[ + Added feature
]
[ * Improved/changed feature ]
[ - Bug fixed (we hope)
]
============================
3.2.12
[+] Added a new command line option -IMAF to Ignore Missing Attachment Files.
If Blat is told to attach files to the outgoing message, and if the search
criteria fails to find a file, Blat normally stops to allow the user to
fix their problem with the requested attachment filename. This new option
will tell Blat to continue with the process of sending the email even if
the requested attachment filename cannot be found. Blat will still log a
message that the requested filename was not found, but Blat will not stop
when this option is used. This request came through SourceForge from
Robert Widdicombe.
[-] Corrected UTF-8 text conversion to Unicode. Some valid values were being
flagged as invalid. This was found when saving a Chinese text file as
Unicode and as UTF-8, then comparing the UTF-8 conversion to the original
Unicode file saved from Notepad.
[-] Correctly handle empty Unicode files that contain only the BOM.
[-] Corrected the help text for IMAP UserID and IMAP Password.
------------------------------------------------------------------------------3.2.11
[-] Alain Loubert found a problem with processing a plain text file for the
message body, resulting in a UTF-8 byte order marker (BOM) being sent as
part of the message. I fixed this oversight and added more test cases to
my validation batch file.
------------------------------------------------------------------------------3.2.10
[-] R Massey found a problem with processing a subject file that resulted in
garbled subject text. This was exposed as a problem with the most recent
changes, but there was a latent bug in the source code for a while which
actually caused problems for R Massey.
------------------------------------------------------------------------------3.2.9
[*] If the message body is from keyboard input, and if the user enters Ctrl-Z
without anything else before it, then a carriage return / line feed will be
the message body. This forces the program to add attachments properly.
[-] Checking the message body for Unicode was causing every other character to
be lost. This should be fixed now. At the same time, Unicode files
without a Byte Order Marker (BOM) should be properly handled. Version
3.2.6 was an attempt to fix this last piece, but it broke non-Unicode file
handling.
------------------------------------------------------------------------------3.2.8
[-] When impersonating (-f option) and the message content is formatted, it was
possible to get two Date: header lines in outgoing email.
------------------------------------------------------------------------------3.2.7
[*] Look for non-ASCII hyphen (hex code 0x2013) in the first position of
command line options, and replace it with ASCII hyphen (hex code 0x002D).
------------------------------------------------------------------------------3.2.6
[-] When checking file content for Unicode, if the second byte of every pair is
binary zero, then strip the binary zeroes before proceeding. It is
possible to create a Unicode file with the echo command such that a Unicode
Byte Order Marker (BOM) is not present in the file. Without the BOM, Blat
was not properly handling these Unicode files.

------------------------------------------------------------------------------3.2.5
[-] After closing the server connection, clear the authenticated user flag to
force reauthentication.
------------------------------------------------------------------------------3.2.4
[-] Changed X- header processing to use Buf definition rather than a fixed
array. The change is made to organization and aheaders, to prevent
memory overruns.
[-] If using alternate text, such as when sending plain text and HTML, and if
that alternate text is Unicode, be sure to set the charset for the
alternate text section and set Content-Transfer-Encoding: 7BIT or 8BIT
as needed and available.
[-] If the message body charset is UTF-8 or UTF-7, and MIME is expected, set
Content-Transfer-Encoding: 7BIT or 8BIT as needed and available instead of
setting Content-Transfer-Encoding: quoted-printable. The Unicode message
body can then be sent as-is, if 8-bit is allowed, or sent as UTF-7 if 8-bit
is not available from the server.
[-] Ensure message headers are properly sent when sending multiple attachments
across multiple messages, and the charset is UTF-8 or UTF-7.
[-] Ensure the closing boundary marker is sent, when needed.
------------------------------------------------------------------------------3.2.3
[+] Added -logcmds option to write the command line arguments to the log,
or to the screen, when also using -log option.
[*] RFC 6152 spells out that SMTP clients and servers must use "8BITMIME"
when support for 8-bit octects is requested and/or supported. However,
some SMTP software is responding with "250-8 BITMIME" instead, with an
embedded space in violation of RFC 6152. "8 BITMIME" is now accepted as if
it were "8BITMIME".
[-] If UTF-8 is selected with -charset option, and neither 8BITMIME nor
BINARYMIME are supported by the server, then UTF-7 will be used instead.
------------------------------------------------------------------------------3.2.2
[-] Fixed message body handling for Unicode / UTF-8.
[-] Fixed the -af option to read Unicode / UTF-8 files. The change was in a
routine common to several options.
[-] Fixed a variable initialization in the sockets code.
[-] Fixed attachment filename encoding for UTF-8 where the name does not
contain Unicode characters, but also is not strictly US ASCII.
[-] -LOG does not require a filename. If no filename is given, then Blat will
write everything to the stdout (screen). Fixed.
------------------------------------------------------------------------------3.2.1
[*] Completely removed "reply-type=original" from the source, so it cannot be
added to any message headers. No reference to this text was found in any
RFC at ietf.org.
[*] Add the whole server name/address to the Message-ID header. Before, only
the domain portion of the server name was added to the header. In testing
a multithreaded program, the routine that attempted to identify the domain
was causing a crash. The crash condition goes away if I just use the
server name as given by the user.
[-] When checking user input for Unicode, the buffer length should already be
set, therefore set the buffer length only if not already set. This allows
users to send binary files as their message body like older versions.
------------------------------------------------------------------------------3.2.0
[+] First attempt to make Blat.dll thread safe, meaning that a multithreaded
program that uses Blat.dll should be able to send emails with each thread
without stomping on each other. One caveat, if logging is desired, each

thread must provide a unique filename for the log file, so that the threads
do not corrupt each other's log entries. To make this thread safe version,
I took all of the global variables and made a structure of these, which a
pointer to the structure being passed to all routines. Each thread calling
Blat.dll will cause a new structure to be allocated, initialized, and used
for that thread's process. Some features of this change have not been
tested because I do not have the GSS library, nor have a need to use that
library for my home testing. The person who originally requested a thread
safe version of Blat.dll should have the means to test this change, and I
will attempt to contact that person to shake it out.
------------------------------------------------------------------------------3.1.2
[*] Changed the MultiByte to Unicode support calls to use CP_ACP instead of
CP_OEMCP, because the latter was not working for some folks using Cyrillic
code pages natively.
[*] Changed the ordering of attachments so that embedded attachments come
first, inline attachments are second, text attachments are third, and
binary attachments are last. It was reported that the prior ordering did
not work for some users, and the new ordering now works for the user who
reported an issue.
[*] -LOG does not require a filename. If no filename is given, then Blat will
write everything to the stdout (screen).
[-] Fixed the Try count INFINITE to work as intended.
[-] Removed some code that attempted to use the shortest encoded attachment
name that spanned multiple lines. The change returns the encoded lines
back to the same as done with versions 3.0.0 through 3.0.4.
[-] Found UTF-7 encoding was adding an extra hyphen in some cases.
------------------------------------------------------------------------------3.1.1
[-] Fixed a problem with parsing the command line and email addresses that have
an ampersand (&) or a percent sign (%) by themselves, not using HTML
formatting.
------------------------------------------------------------------------------3.1.0
[+] Added support for Blat.wcx in Total Commander (http://www.ghisler.com)
[*] Blat 64-bit includes GSS encryption support once again. gssapi64.dll can
be downloaded from http://web.mit.edu/kerberos/dist/testing.html#kfw-3.2.3
Download kfw-3-2-3-amd64.zip and extract the files. gssapi64.dll is in
the kfw-3-2-3-final/bin folder.
[+] Added more support for HTML in email addresses, such as %20 in place of
spaces, or &lt; and &gt; in place of < and >, respectively. This should
make the email parser more compatible with web servers. I do not know if
there is currently a problem, but I saw a change from someone else that
made a quick effort to support %20 in email addresses, so I took that idea
and expanded it.
[+] The ability to have multiple -body options used for each session was an
undocumented "feature" in versions 2.6.2 through 2.7.6, but this was
dropped when version 3.0.0 was developed to support Unicode. A user on
SourceForge.net complained that this "feature" was missing from version
3.x, so I added this back in and now it is being documented in this
Change log.
http://tinyurl.com/alx3z7z
[+] Replace the user's login password in blat's log file with "*****" when
using -debug. -superdebug is not effected, because this mode will write
the individual bytes in HEX mode, which the user can then validate if their
login credentials are being rejected.
[-] Fixed inline attachments to remove "reply-type=original", making the
headers look like they did with Blat version 2.6.1. The test message
received by Windows Live Mail looks as expected -- inlined text attachments
are viewed as if part of the original message.

[-] RFC 2046 says that if "Content-Type:" is message/rfc822, then only 7BIT,
8BIT, and BINARY are permitted encoding types. If an attachment is found
to have this content type defined, then the attachment will be treated as a
text file, and the encoding will be either 7BIT or 8BIT. However, the
content of the attachment will not be validated for RFC 822 compliance.
[-] Fixed a missing terminator byte for text attachments that sometimes allowed
text attachments to be longer than expected, and/or incorrectly converted
to UTF-8.
------------------------------------------------------------------------------3.0.7
[-] Removed a line of debug code that printed command line arguments to the
screen, always.
------------------------------------------------------------------------------3.0.6
[+] Added error messages for attachment problems. These include: no file was
found for a given search string, a name that matches the search string does
not appear to be an actual file, a file that is larger than 4 GB, a file
that cannot be opened, and a file that cannot be read. These extra
messages should help people understand why their attachment(s) did not get
sent, or why Blat exits with error code 12.
[+] Add more intelligence for checking UTF-8 byte sequences when the UTF-8 Byte
Order Marker (BOM) is not present. This helps reduce the likelihood of
incorrectly marking the charset as "UTF-8" or not.
[-] Forgot to properly set charset= in headers when Blat determines the message
body is UTF/Unicode. Blat will now set charset= to UTF-8/UTF-7 as needed.
[-] Fixed options file parsing that I broke in 3.0.5, trying to support UTF-8
and Unicode files that may not have a BOM.
------------------------------------------------------------------------------3.0.5
[*] Text attachments will be sent in their entirety, even if the message is
supposed to be multipart. This change allows UTF/Unicode files to be
processed correctly so that all characters of the file should be received
and decoded without issue.
[-] Extensive changes related to how Unicode is handled versus 7-/8-bit
characters in English, European, and some other languages. These changes
include fixes to salutations, postscripts, the subject line, text
attachments, and attachment file names. Additional changes identify 7-bit
data for text messages and text attachments.
------------------------------------------------------------------------------3.0.4
[+] If 32-bit Unicode code is run with Windows 9x/ME, exit with error code 14
because Unicode is not supported with Windows earlier than Windows 2000.
[+] Try to support non-ANSI computer names, as found with a Russian version of
Windows 7.
------------------------------------------------------------------------------3.0.3
[-] Per Thomas Beutlich, changed how the blat log file is opened, to create
this file as UTF-8 when Blat is compiled with Microsoft Visual Studio 2005
or newer. When compiled with Visual Studio 2003, or earlier, Unicode
strings will be converted to UTF-8 before being written to the log. If the
log is created, the first three bytes will be a UTF-8 marker. Testing with
Visual C++ 6.0 in Unicode showed that VC could not write Unicode strings
correctly, which required that strings be converted to UTF-8 before writing
to the log.
[-] Fixed yEnc encoding to work properly with binary files. One line of code
needed to be moved about eight (8) lines lower.
------------------------------------------------------------------------------3.0.2
[+] Changed subject handling to use Buf class, and to convert to UTF-8 right
away, if necessary.

[+] Added "*** Warning ***" to certain messages related to authentication


and message size. Added "*** Error ***" to additional messages related to
authentication.
[*] Changed error messages related to opening / reading files to more
accurately tell what the problem is. Previously, these messages simply
said "Error reading ...".
[-] Fixed a potential crash with the network connection code when an error
occurs with the network.
[-] Fixed -tf/-cf/-bf option to permit Unicode file content.
------------------------------------------------------------------------------3.0.1
[+] When printing messages to a log, or to the screen, convert UTF-8 strings
to Unicode when possible before writing to the log or screen. This allows
the user's strings to appear as readable text to that user, hopefully.
[*] Removed dependance on MSVCRT.DLL and MSVCR100.DLL. The program size is
larger, but Blat now does not need these .dll files to be distributed.
[*] Blat 32-bit is being built with Microsoft Visual C++ 6.0, and should still
run under Windows 98 and Windows 2000.
[*] Blat 64-bit is being built with Visual Studio 2010, and should run under
any Windows 64-bit edition.
[*] Blat 64-bit does not include GSS encryption support.
[*] Dropped the "w/GSS encryption" version suffix.
[-] Fix base64 encoding of message headers to issue a line break on the nearest
space character to a 72 character line length. Before this change, some
Unicode strings were not interpreted correctly by some email clients. With
this change, email clients like Thunderbird can decode the headers
properly.
[-] Fixed the message output for blat.dll to use a caller's print function
when it is available.
[-] Fixed blat.dll functions printDLLW(), printDLLA(), BlatA(), BlatW(),
SendA(), and SendW() to correctly convert from/to Unicode strings.
------------------------------------------------------------------------------3.0.0
[+] Allow Unicode domain names, which will be made compliant with RFC 5890.
[+] Converted the source code to use Unicode throughout. As a result, I added
both MBCS and Unicode interfaces for the .DLL. Developers will need to
adapt or include blatdll.h into their projects so they can call the .DLL
properly. Blatdll.h is included in the release package.
[+] Blat will write to its log file in UTF-8 format when possible. This will
allow the log file to show Unicode filenames instead of showing a series
of question marks (?). The log file can still be opened with Notepad
without any issues. Thanks to Thomas Beutlich for this suggestion.
[+] Unicode filenames will be converted to UTF-8 before being included into
the message body and/or message headers.
[+] When storing login and password registry keys, Unicode values will be
converted to UTF-8 before encoding to base64. This makes Unicode login
and password values compliant with RFC 4616. Existing keys from Blat 2.xx
should continue to work just fine.
[+] Blat can be compiled as either 32-bit or 64-bit. The 64-bit version will
look for its registry keys first under SOFTWARE\Wow6432Node\Public Domain
before looking under SOFTWARE\Public Domain. This allows users to keep
their existing profiles should they change from using 32-bit Blat version
to the 64-bit version.
[+] The version of DLLs that are required for Blat will be included with the
release package. For example, building Blat with Visual Studio 2010 means
that MSVCR100.DLL will be called, and thus I will be including the required
version with the release package.
[+] Allow HTML in salutations. For example:
-to "1st <some@> \"<img src=\\\"cid:banner.gif\\\"><BR>Hey 1st,\""

Here's why -- the three backslashes and quotation mark are actually taken
as two different character sequences, the double backslash is first, then
the backslash and quotation mark is next. What you see above on the
command line will be initially seen in Blat as this:
1st <some@> \"<img src=\\\"cid:banner.gif\\\"><BR>Hey 1st,\"
Then when I go to parse this to look for a name, an email address, and a
salutation, the result will be these three parts:
Name:
1st
Email:
<some@>
Salutation: "<img src=\"cid:banner.gif\"><BR>Hey 1st,"
The escaped quotation mark in front of the '<' is the tell Blat this is not
the next email address. Instead, '<' is to be taken as part of a
salutation. Otherwise, '<' is normally seen as the start of the next email
address.
Note now that the salutation has internally to it an escaped quotation
mark. The next step is for me to remove the leading and trailing quotation
marks, to make it presentable in an email message. Lastly, I remove the
escape characters leaving this final text to be put into the outgoing
email:
<img src="cid:banner.gif"><BR>Hey 1st,
During testing, I run Blat from .bat files with a variety of options. I
had to make a small change, or enhancement, to permit HTML in salutations
when using .bat and .cmd files to run Blat. The issue is that Windows 7
command processor does not like < or > in command lnes, except as used for
keyboard input and screen output redirectors. This is not a problem if the
< and > are used around email addresses, but it is a problem when used as
part of HTML. The workaround that I came up with is to allow square
brackets '[' and ']' to be used in place of '<' and '>', respectively, when
in salutations. In salutations, Blat will convert square brackets '[' and
']' to '<' and '>', expecting them to be used as HTML.
Applications that call Blat to send emails might be able to use '<' and '>'
properly. However, if you find a situation where these do not work, try
using square brackets instead.
[*] Keep the server connection open until the email has been sent to all
recipients. Previously, the server connection was closed after each
message, even when sending to multiple recipients.
[*] Changed how the command line is processed in processOptions(), so that only
options will have forward slashes (/) changed to hyphens (-) automatically.
This feature was introduced in version 2.5.
------------------------------------------------------------------------------2.7.7
[-] Abort the program if an attachment is not found. The return code is 12.
[-] Aligned the help text for -level option.
------------------------------------------------------------------------------2.7.6
[*] Make sure all uses of strncpy() properly terminate the target string, to
eliminate a potential memory overrun.
[-] Attempt to fix a potential problem with time zone adjustments in the Date:
header for locations that do not have daylight savings time.
[-] Fixed a memory leak in gensock_connect(), introduced at version 2.6.0.
------------------------------------------------------------------------------2.7.5
[-] Fixed a problem with looking for default extension types. The instruction

ordering was backwards, causing a crash if the file type was not listed in
our source file (filetype.cpp).
------------------------------------------------------------------------------2.7.4a
[+] Removed first attempt at wide char/unicode for the time being. I do not
have any way to test it.
[+] Added X-MimeOLE: header for Blat with its version number when adding header
X-MSMail-Priority.
[-] Fixed the help text for spelling error and alignment.
------------------------------------------------------------------------------2.7.4
[+] First attempt at making the code compatible with wide character / Unicode
compiles.
[*] Small changes for encoding headers when 8-bit characters are used.
------------------------------------------------------------------------------2.7.3
[*] OpenWatcom v1.8 can now build Blat after making changes to makefile.w32 and
some of the source files.
[*] I made some preliminary changes for compiling as 64-bit with Visual Studio
2005, but there needs to be more changes so VS 2k5 will build in 64-bit
mode. For now, the changes do not affect the 32-bit builds. When I get
the 64-bit build working, Blat will identify itself as "a Win64 (AMD64)
SMTP mailer" instead of "a Win32 SMTP mailer". I am running Vista 64-bit
so I can test Blat when I have it building as 64-bit. The goal is to have
both 32-bit and 64-bit versions available to choose from.
[-] Fixed a memcpy() bug in options.cpp that I introduced with version 2.7.2; I
had used an ampersand (&) with the first argument when I should not have.
[-] Removed ampersands from the fifth (5th) argument to RegQueryValueEx() in
regs.cpp. These ampersands have existed from before I took on the source.
------------------------------------------------------------------------------2.7.2
[*] When delaying between messages, and if POP3 access is requested, then delay
after the POP3 access before sending the first SMTP message. Some service
providers require a delay after POP3 access before they will acknowledge
and allow SMTP access. This time delay is unknown, so a little testing is
required to find what delay value works and what does not.
[-] Use "strncpy" instead of "memcpy" to avoid potential page faults in
gensock.cpp and options.cpp.
------------------------------------------------------------------------------2.7.1
[*] Allow -log to be used without a filename. When no filename was specified
before, this could have caused problems with Blat.
[*] Force the -contenttype option to be available for all builds *except* LITE.
[-] If the body filename is not specified with the -bodyf option, allow Blat to
continue without crashing.
------------------------------------------------------------------------------2.7.0
[+] Added "-nomd5" option to disable CRAM-MD5 authentication. This is for
users who know their SMTP server/service provider has a flawed CRAM-MD5
implementation.
[+] Added "-contentType <string>" option so users can specify the ContentType
header for attachments that do not have a registered content type for the
extension. For example: -contenttype "text/calendar"
[*] Removed an extra "m" in the word "comments" associated with the -comment
help text.
[*] If the POP3 server name has not been specified, and POP3 access is
requested, then use the SMTP server name as the POP3 server name. In some
cases this is true, but most cases I have seen these functions are handled
by different servers and using the SMTP server name as the POP3 server name
would fail the POP3 access. Using POP3 access without specifying the POP3

server name should be used carefully.


[*] When an error message is written to the log, preface it with
"*** Error ***" so these messages can be found more easily.
[*] Allow "-mps" / "-multipart" option to be used without a specified size,
and to use the SMTP server's maximum message size to be the guide for
breaking up attachments for multiple part messages.
[-] Changed "ISO-8859-1" to "iso-8859-1".
[-] Changed base64 encoding and quoted encoding to use lower case 'b' and 'q'
respectively, even though the RFC that I read originally had upper case.
This was causing some email clients and/or servers to have problems with
encoded headers.
------------------------------------------------------------------------------2.6.3
[+] Added "-pwd" option for -password. It was pointed out that this was
mentioned in text somewhere.
[-] Changed the way email addresses are encoded for headers to encode only the
name, not the email address itself. This was causing some servers to have
problems, where the server was expecting the email address itself to be in
the clear.
[-] When closing the POP3 session, make sure to send QUIT to the server before
disconnecting, and wait for a possible response.
------------------------------------------------------------------------------2.6.2
[+] Add -overwritelog option to delete an existing log file and start writing
a new log. This is used with the -log option.
[+] Add -bodyF option to specify a filename that contains the message body.
This could be used in an options file to specify a default text file.
[*] Use MSVCRT.DLL instead of MSVCRT71.DLL.
[*] Allow command line -t/-to options to override and eliminate -t/-to settings
from a default options file. This change also effects -c/-cc, -b/-bcc,
-tf, -cf, and -bf. Previously, if any of these were specified in the
options file, users could not override them from the command line.
[*] Allow zero length attachments to be sent, as a notification that such files
were created by some other activity.
[*] Changed the method of checking Windows version. The new method was found
at Microsoft's MSDN website.
[-] Checking for a message body file has been improved to not leave files
locked. Files that have been opened will be closed. This was overlooked
before.
[-] Fix memory leak, by removing the last allocated block of memory.
------------------------------------------------------------------------------2.6.1
I started to make changes to support Microsoft Visual Studio 2005. The
changes are to define some global compile time switches so I won't have to
make source level changes. The code still builds from Visual Studio 6.0 and
Visual Studio .Net.
[+] When the user requests authentication, if that authentication fails for
CRAM-MD5, try to use AUTH PLAIN. If authentication fails for AUTH PLAIN,
try using AUTH LOGIN. I do not check if the server supports AUTH LOGIN,
just try it anyway if earlier authentication methods do not work. This was
done to get around bugs in servers that advertise CRAM-MD5 but do not
support it correctly.
[-] Encoding of headers for non-USASCII values has changed so client programs
can interpret the headers correctly. This has been tested with Outlook
Express, and Blat's output has itself been compared to the output from OE.
[-] The change I made for 2.6.0 to open files with the Microsoft recommended
32-bit API call does not work for Windows 98/ME. Its been reported that
this change failed to open files under Win2000, also, although I have not

experienced any problems with my Win2000 on my office laptop. This version


will use the old 16-bit type Windows function call for Windows versions up
to and including Win2000, but use the recommended 32-bit call for Windows
XP and beyond.
------------------------------------------------------------------------------2.6
[+] support for XTND XMIT command for Eudora users. This is a shortcut to use
a POP3 server as an SMTP server. The non-standard option was created as an
extension for the Unix Popper server. Without this command support, users
are unable to use SMTP with their ISP's Popper server. -B recipients are
put into a Bcc: header line so the Popper server software knows how to send
messages to those recipients since the server does not support the RCPT TO:
SMTP command. The command line option is -xtndxmit.
[+] support IMAP before SMTP, similar to POP3 before SMTP.
[+] add support for message sensitivity using the Sensitivity: header. The
command line option is -sensitivity=x where x is 0 for personal, 1 for
private, and 2 is for company confidential.
[+] add Priority: and Importance: headers for Lotus Notes users.
[+] add the CPU clock count (rdtsc) to the Message Id: header value. This is
useful in cases where multiple copies of Blat are running. Nothing is
foolproof, but this is better than before, for making unique message id
values.
[*] added Reply To: header when the -reply option is used with the -i option.
[*] moved the cram-md5 support to its own function so it can be called for
IMAP login as well as SMTP login.
[*] server responses are recognized faster, almost instantly now, which means
email is sent quicket.
[-] fix the makefile for md5.obj, to put it into the correct directory.
[-] clear the socket handle when the connection is closed. This will allow
Blat to open a new connection instead of trying to reuse a closed/old
socket connection.
[-] fix the -install option to accept normal command options to specify the
server, from address, etc. For example:
blat -install -server smtp.example.com -f me@mozilla -u abc -pw xyz
[-] fix Unicode support.
------------------------------------------------------------------------------2.5
[+] when parsing the command line, if the first character is a forward slash
(/), this is changed to a hyphen. BEWARE that this _will_ effect text
within strings, such as your subject line and message body.
[+] allow the use of normal command line options with -install. For example:
blat -install -server smtp.xyz.com -u me -pw goaway -try 1 -port 900
-f myemailaddy
[+] added -nomps to disable automatic multipart messages. If the message is
larger than the SMTP allows, Blat will exit with code 14.
[+] added support for Unicode files as the message body. The file content will
be converted to UTF-7 and the Charset changed also.
[+] added -attachI to allow inline text attachments, similar to the former
definition of -attachT.
[+] for the .DLL, created a cSend() entry point that uses C style entry/exit
code, for an Oracle database application.
[*] changed some of the help text, hoping to make it clearer.
[*] -attachT changed to use "Content-Disposition: ATTACHMENT".
[*] allocate enough memory to contain the encoded attachments, rather than
continually realloc memory as the buffer grows. This can speed up the
encoding process significantly on Win9x systems.
[*] perform smarter header encoding when headers have quotable characters.
[*] message IDs will include the process ID value, so two or more copies of

blat may execute at the same time on the same system.


[*] Try count will be used when attempting to establish a connection to the
server. Previously, this was used only for the sending of messages after
a connection was established. The purpose is to allow Blat to connect to
busy or slow response servers.
[*] any text sent to the server will have a carriage return for each line feed,
and a line feed for each carriage return. Messages without carriage
returns have caused problems for some servers.
[-] when adding a new boundary layer, the last byte of the boundary marker is
incremented within the limits of the defined boundary character set.
[-] changed the attachment sorting sequence to have embedded attachments first,
binary attachments second, then text and inline attachments. This fixes a
bug in the boundary headers with adding attachments to messages.
[-] remove the space between "MAIL FROM:" and the From address, to be aligned
with the RFCs. At least one mail server did not like a space after the
colon (:), and rejected the messages.
[-] remove the space between "RCPT TO:" and the To address, to be aligned
with the RFCs.
[-] fix up file positioning for Win9x. Multipart messages was causing
problems for Win98 users.
------------------------------------------------------------------------------2.4
[+] support multihomed servers. No visible change for this, it is done
at the connection state. If the primary IP address does not answer,
alternate IP addresses will be attempted, if available.
[+] added "To: Undisclosed recipients:;" when only using the -bcc option.
This is in RFC 2822. Use -ur option if you want this.
[+] added "forced" authentication for NNTP if -u/-pw options are used. This
means that if the server does not specifically request authentication,
Blat will attempt it anyway if the userid is specified on the command
line.
[+] added support for format=flowed when adding alternate text. This was
not added for the regular message body since the message could be
binary.
[+] added -af, -atf, and -aef options that take a filename parameter. These
new options are for using a file that contains a list of attachments to
be sent. -Af is for binary files, similar to using -attach. -Atf is
for text files, like using -attacht. Lastly, -aef is for embedded files
in the same way as using -embed option. Each attachment named can be on
separate lines, or be separated by commas. Quotation marks (") are not
needed. Do not use two backslash characters for your path delimiter.
[+] added content-type defaults for these filename extensions: pdf, xls,
gif, jpg, bmp, png. This was done in case the registry does not have
them defined.
[+] support packet sizes up to 64240 bytes. This will allow more efficient
data transmission than using only 512 byte packets.
[+] print how many parts of a message will be sent if more than one.
[*] disable -base64 if attachments are included. This only effects the
message body so that it does not get encoded with base64 *if* there are
any attachments/embedded files.
[*] changed the Content-Type header when adding alternate text and embedded,
to be compliant with RFC 2387.
[*] changed the access mode when opening a message file, to allow sharing on
read and write mode. This was needed to send files that may still be
open by another application.
[*] increased the transmit buffer size to almost 64K, and ask Windows for
the size of its send buffer. This allows Blat to be more efficient when
transmitting.
[*] when adding a plain text message with -alttextf, the message will not be

[*]
[*]
[*]
[*]
[-]

[-]
[-]

converted to quoted printed if the text contains only US-ASCII, tab,


carriage return, and newline characters. Any other control character,
or 8-bit byte will be converted as before.
some code cleanup to support 64-bit compilation for AMD Opterons.
makefile.w32 tweaked for Watcom C/C++ 10.6 and newer.
makefile.g32 tweaked for Gnu gcc.
yEnc will display the original filesize in the subject line, so people
who are math challenged can determine if they want to spend dial-up time
to download files.
changed how the different parts of a message are constructed when
sending attachments, especially when also sending html with embedded
objects. This now lets Outlook and Outlook Express show their paperclip
when attachments are included. Thanks to Richard (a.k.a. crazymitchuk2)
for alerting me to this problem with Outlook.
increased the server timeout when looking for responses from one second
to the global timeout value, which by default is 30 seconds.
clear _all_ global variables at initialization, do not expect them to be
preset. This will allow blat.dll to be called multiple times without
unloading it between calls.

------------------------------------------------------------------------------2.3
[+] add support for GSSAPI authentication using Kerberos v5. This change also
supports encrypted packets using Kerberos. You need gssapi.dll from MIT.
http://web.mit.edu/kerberos/www/
Joseph Calzaretta from MIT provided the code.
[+] new command line options for GSSAPI: -k, -kc, -service, -level.
------------------------------------------------------------------------------2.2.2 (2004.02.26)
[-] fixed a bug where a socket was being left open after sending mail. A break
instruction in a for() loop needed to be removed, in sendmail.cpp. Thanks
go to Tim Musson for the suggestion, and Denis Mikhailitsky for reporting
it.
[-] fixed a bug in parsing email addresses where the address is 31 bytes long.
Thanks to Doug Jenkins for reporting this issue.
[-] minor changes to the options list.
------------------------------------------------------------------------------2.2.1 (2003.12.20)
[+] more command line options have been allowed for cgi script support, such as
-debug and -log options.
[+] support a comment character in options files and recipient list files. The
command line option for this is -comment <char>, where <char> is the
character to be used as the start of a comment. In DOS batch files, this
would be the semicolon (;), which is the default character in Blat. In
Perl scripts, this would be a hash or pound sign (#). If the comment
character is found in an options file, or recipients list file, the rest
of that line will be ignored. You can use the comment character to add
comments to your recipients list that would help you remember important
items about each recipient.
[+] support accessing a POP3 server prior to sending to SMTP. Use the new
-installPOP3 to place your server name, login name and password values into
the registry. The format of this command line option is:
blat -installPOP3 servername - - port {profile} loginname password
The profile in the above line is optional. If not needed, then replace it
with a hyphen. The other hyphens mean those values are not used with
-installPOP3. The default value for the port number is 110.
When Blat wants to send a message to the SMTP server, if a POP3 server has
been defined for the profile being used, Blat will perform the following

[+]

[+]

[+]
[+]

[*]

[*]

steps:
1. Connect to POP3 server.
2. Send USER xxxx using the user's POP3 login name, wait for +OK.
3. Send PASS yyyy using the user's POP3 password, wait for +OK.
4. Send STAT command to get a count of messages, wait for +OK.
5. Send QUIT, wait for +OK.
After the Quit is issued, Blat will proceed to send email to the SMTP
server.
The requirement for POP3 before SMTP is an attempt by some ISPs to stop
spam from originating through their service. They justify this tactic by
requiring people to have a paid account, but do not enforce any real kind
of SMTP authentication or tracking.
added -alttext and -alttextf options. These should be more meaningful
than -althtml or -htmaltf options. The latter two take a filename argument
that contains the plain text to be associated with the intended message
body. -Alttext takes text on the command line as its argument,
while -alttextf takes a filename. It is my intention to drop -htmaltf
and -althtml options at some future date. The usage text already drops
them both in favor of -alttextf. The original code to use -althtml was a
hack, to get something quick for testing. Changing the name to -alttextf
seems to be more meaningful and has wider application.
Please stop using -htmalf and -althtmf, use -alttextf instead because it
should make this clearer. The -alttext is new, it accepts text on the
command line only, like between quotation marks ("). If the pipe character
is in the text, it will be effected by the -binary option just like it
would be if used with the -body option.
added -hkcu to -install[SMTP|NNTP|POP3] to place Blat's values into
HKEY_CURRENT_USER instead of HKEY_LOCAL_MACHINE. -hkcu has also been
added to the -profile -delete command line options to delete Blat's values
from HKEY_CURRENT_USER. An example of its use might look like this:
blat -install server emailaddy -hkcu
or
blat -profile -delete -hkcu oldisp oldnntp
When listing profiles from the registry, if any profiles exist in
HKEY_CURRENT_USER, Blat will first print "Profile(s) for current user --".
When listing profiles from HKEY_LOCAL_MACHINE, Blat will first print
"Profile(s) for all users of this computer --" if it finds there are
profiles in HKEY_CURRENT_USER. The -hkcu option is not accepted when
listing the profiles; it will be ignored if found.
Blat will look for its values in HKEY_CURRENT_USER before it looks in
HKEY_LOCAL_MACHINE, but will not generate any errors if it cannot find
profile data in HKEY_CURRENT_USER.
when storing profile data to the registry, if Blat encounters an access
denied error when trying to use HKEY_LOCAL_MACHINE, Blat will try to store
the profile data to HKEY_CURRENT_USER. The purpose for this is to allow
users of multiuser machines to keep their personal Blat preferences and
system administrators to put access restrictions on HKEY_LOCAL_MACHINE.
A request for this came from 'wolfgangbeyer2' on the Blat mailing list.
added "<all>" and "<default>" to -profile -delete, to delete all profiles
and the default profile, respectively. Use the quotation marks to ensure
the < and > characters are included. Without the quotation marks, Windows
will interpret these characters as something else.
crtdll.dll will no longer be used by blat.exe. Instead, Blat will use
msvcrt.dll after it was discovered that msvcrt.dll is significantly faster
than crtdll.dll. According to Microsoft, only Windows 95 was shipped
without msvcrt.dll. By this time, Win95 users should have installed this
.dll as a result of some other program they installed in the intervening
years. The speed difference between the two DLLs is most apparent when
using large amounts of memory. Otherwise, the size of Blat's executable
increased by only 512 bytes.

[*] if authentication is required for the server, and no password is given,


the username will still be sent. Not all users have a password.
[*] If there is no default profile and the user creates a profile (eg. test),
there is a possibility Win2K will return garbage in the userid/password
variables when trying to read the default profile. Checks were added to
reg.cpp to look for this condition. Windows XP does not exhibit this bad
behavior.
[*] when building headers for attachments, Blat will not include the pathname
in those headers. It will now look for the last path delimiter or a colon
to remove the pathname. Your recipients do not need to know where you
store your files.
[*] options for cgi support have been moved out of blatcgi.cpp and into
options.cpp next to their respective command line names. This should allow
new cgi options to be added or turned on easier. In the process, usage.cpp
has been removed, the help text moved to options.cpp, so that as new
command line options are added, the corresponding help text can also be
added at the same time in the same file. This will help eliminate adding
options in one area of Blat and forgetting to add them in another.
[*] allow binary files to be sent as the message body with base64 encoding for
email systems that do not understand normal attachment rules. This was
identified by "mduitz" on the blat mailing list on September 3, 2003.
[*] some minor changes to the usage text, mostly for consistency.
[-] changed "MAIL From:" and "RCPT To:" commands to all uppercase. These two
commands have been in Blat as shown since at least 1.9.4. A problem with
them appeared recently when a Yahoo proxy program would not accept the
lowercase versions.
[-] Blat can now send a file as your message body to SMTP and NNTP servers at
the same time. Blat used to close the file during the SMTP process, which
caused the NTNP process to fail.
[-] Blat no longer causes a GPF when quoted header lines exceeds 80 characters.
Quoted headers has been improved. Please test this very thoroughly and
report any issues you find. Credit goes to Pavel Savara from the Czech
Republic for finding this issue.
[-] the requirement for quoted headers has been relaxed a bit, in case all the
characters are lower ASCII. Bert/blatax pointed out on the Blat mailing
list that his ancient fax software was not able to accept quoted subject
lines.
[-] fixed the command line parsing for blat.dll so it can accept a single
backslash (\) character as a path delimiter, just as the blat.exe command
line does.
[-] when sending to a long list of email addresses, Blat will not GPF. The GPF
was caused if the length of the email addresses exceeded 8190 bytes. Tim
Kustner found this issue on October 16.
[-] fixed a bug that resulted from a cut/paste operation, then forgetting to
remove an argument to a function. It causes no stability issues, but when
viewing the received email it was noticed the charset= said html instead of
ISO-8859-1.
[-] added the -delay option to the usage text.
[-] the first command line option for blat.exe must be a hyphen or a filename.
[-] blat has been tested with IIS6 under Windows 2003 Server, and is now
working after a few minor changes to how variables are defined internal to
blat source code.
[-] when blat is run from other applications, blat will return back gracefully.
In previous versions, blat would issue a hard exit when it processed a
-install or -profile command, which caused the calling program to exit.
------------------------------------------------------------------------------2.2.0 (2003.09.17)
[+] attempt to support binarymime. If the SMTP indicates 250-BINARYMIME, and
the message is using quoted-printable mime, then only two bytes will be

[+]
[+]
[+]

[+]

[*]

[-]

converted to quoted-printable: the equals sign (=), and binary zero. All
other byte values will be sent as-is.
add Message-ID: to the headers.
add support for -delay <seconds> to pause between messages when using
the -maxnames option or when sending multipart messages. It is used only
for sending mail, not for posting to newsgroups.
add support for -maxnames <count> to send messages to blocks of <count>
recipients. This is useful for home-based email lists with restrictions
from their ISP on how many names can be sent to per message. It does not
change the To: or Cc: lines in the message, it only changes how many RCPT
names are sent to the SMTP server.
support for alternative plain text messages has been added. Use the
-htmaltf <filename> option to specify a plain text file that should be used
with your HTML message. Recipients who do not have html email support will
see the plain text. Others will see the HTML.
when adding a new profile, the opposite server (SMTP v NNTP) will not be
created at the same time. If creating a new SMTP profile, NNTP server
information will not be created in the registry. If creating a new NNTP
profile, SMTP server info will not be created.
fixed a bug that prevented binary files being sent as the message body. To
send binary files as the body of a message, the -uuencode or -base64 option
must be used. For example: blat binfile.exe -to me -s test -base64.

------------------------------------------------------------------------------2.1.1 (2003.08.13)
[*] removed support for gwinsock.dll and gensock.dll, since that functionality
is built into blat.
[*] when using the -profile option to list available profiles, quotation marks
(") will be surround the email address, just in case a people name is used
with it.
[-] one global and one static buffer variables are now being initialized /
cleared properly in the .DLL.
[-] parsing email addresses was causing memory to be corrupted if the list of
email addresses did not include people names.
[-] when checking options for missing arguments, check each argument against
the list of known options and stop if one is found. This will allow
hyphens to be used at the beginning of arguments if those arguments are
not also known option names. For example,
blat - -body "-testing-" -s "subject matter" -to me.
[-] userid/password variables cleared if there is an error reading these
values from the registry. In this condition, Win2K placed garbage in
these variables, while WinXP does not.
------------------------------------------------------------------------------2.1.0 (2003.07.22)
[+] lite version selectable with a compile option.
[+] add support for comma delimited filenames with -attach or -attacht or
-embed. For example, -attach *.jpg,*.gif
[+] support for signature files. Blat will include the '-- '. Use the new
option '-sigfile' or '-sig' followed by a filename.
[+] support for a random tagline through a compile-time switch. Use '-tag'
or '-tagfile' followed by a filename. This file must be text. Each
tagline must be on a single line. To have line breaks in the outgoing
email, use "\n" in the text. For example: "This is a line break.\nChip"
would become
This is a line break.
Chip
[+] support for postscript lines (PS.), like instructions for how to
unsubscribe from a mailing list. Use the option '-ps' followed by a
filename.

[+] support for automatic detection of salutations. When an email address for
the -to option has text that follows the '>', this is used as a salutation
for the message body. If the salutation has a comma, the text must be
surrounded with quotation marks.
For example: blat file -to "Chip <nul@localhost> \"Dear Chip,\"" In this
example, the "Dear Chip," will be the first line of the message, which will
be sent to "Chip <nul@localhost>". Please notice the \ before each
quotation mark, this is to tell the command line parser to keep the next
character. The two quotation marks at the end are for delimiting the
salutation, and for delimiting the whole name/email/salutation text. If
the salutation does not have a comma, then you do not need an extra pair
of quotation marks.
Salutation support does not work with -cc or -bcc names.
[+] support for the 250-pipelining option at compile time. The net effect is
to increase the .exe size by 1K without gaining anything useful at runtime.
In other words, do not bother with it.
[+] multipart message support at compile time. When the sum size of
attachments exceeds the server's maximum message size, or the size
pecified with the -mps/-multipart option, each attachment will be sent in
a separate message, split as necessary. The resulting messages can be
ieced back together by client software that is aware of multipart messages
(see RFCs 1341 and 2046). To make this work, messages will be sent encoded
with UUEncode (default) or yEnc (user selected).
[+] support for -embed option, used with sending html with embedded images and
other ojects into the message. Usage is:
-embed <filenames>
[*] -plain removed since the SMTP server responses are now parsed properly,
and the AUTH options recognized.
[*] -penguin with attachments only works when using -uuencode or -yenc, and
then only when all attachments can be sent in a single message.
Multipart messages and -base64 will cancel -penguin.
[*] modular source files.
[*] .rc changes from Tim Musson.
[*] authorization will now look for "PLAIN" and "LOGIN" options to the
"250-AUTH" response from the EHLO command. This should eliminate the need
for -plain command line option.
[*] when the server rejects a recipient address, blat will continue until all
the recipients have been checked. The log will reflect errors for all bad
recipient addresses. The server's actual error message will be listed with
each address. In some cases, it may be necessary for the user to supply
-u/-pw options to authenticate themselves to the server.
[*] blat's title line will be put into the log file as well as printed to the
screen, to make it easier to identify which version built which part of
the log.
[*] the chosen/default character set will be included in message headers as a
separate line item.
[-] supply '<' and '>' surrounding the email address for the "Mail from:"
command sent to the SMTP server. Some servers require this, while others
do not.
[-] newsgroups will be listed in the "Sending to..." message when sending to
NNTP. The message used to list SMTP recipients if present.
[-] error logging fixed so SMTP server information prefetch ruotines do not
halt the program prematurely.
[-] dll Send() function now exported.
[-] SMTP and NNTP authorization now account for slow servers, and does not
issue empty AUTH/AUTHINFO commands. It was found that when a server issues
the welcome line, it may not include the remaining "250-" option messages
immediately. One server in particular delayed sending the rest of the
multiline response for about 1/2 second (500ms). If a multiline response
is received, blat will now wait up to one second for the rest of the

response before timing out and processing what it received.


[-] -a1 and -a2 support has been put back in, except that these user defined
custom headers will be added _after_ the regular headers instead of before
the regular headers. Prior versions placed these custom headers at the
beginning, but this could be used for spamming by allowing forged header
lines. Placing the custom header lines at the end of the list reduces the
chances that a spammer will use Blat successfully.
[-] error values are now being properly returned for processing after blat
exits.
Special notes for version 2.1.0:
When multipart support is enabled at compile time, the following conditions
will exist when sending attachments.
1. If the combined size of the message and all attachments exceeds the maximum
size allowed for the SMTP server, or the size specified by the -mps option
(for SMTP or NNTP), then each attachment will be sent in a separate message
with its name added to the subject line. If an attachment itself is too
large for a single message, the attachment will be sent in a series of
messages, with the subject line showing each part in the series.
The format of the subject line will be:
subject_text {file xx of yy} {yEnc} filename [aa/bb]
xx of yy shows which file this is (xx) out of the total (yy).
If there is only one file to send, this text will not be added to the
subject line.
aa/bb shows this part is (aa) of how many parts (bb).
If there only one part (single message), this text will not
be added to the subject line.
yEnc is included when the attachments are encoded with yEnc.
This is useful when you know the intended recipient has trouble receiving
attachments, such as my friend who lives on a farm miles/kilometers from
town.
2. When the combined size of all attachments plus the message body is less than
the maximum size allowed by the SMTP server, or less than the size specified
by the -mps option, then a single message with all attachments will be sent
without adding the attachment names to the subject line. This is in keeping
with previous versions of Blat.
3. When you want to force the attachment filename into the subject line, use
-mps with a size value that is less than the total size of all attachments
to be sent.
4. Sending a single attachment may not put that attachment's name into the
subject line, unless it meets #1 above.
It is recommended that you use -yenc only when you know the recipient has a
mail reader with yEnc support built in. Outlook and Outlook Express do not
support yEnc attachments.
With the changes to attachment support, Blat will not send a zero length file.
Blat will not send files that exceed 4G bytes. If the total size of all
attachments exceeds 4G bytes, Blat will exit.
Prior versions of Blat would load all attachments into memory before sending

the message. In this version, with multipart support enabled, when the
combined size of all attachments meets criteria #1 above, Blat will load only
as much of each attachment as it needs to send an individual message. This
could result in lower memory use by Blat.
------------------------------------------------------------------------------2.0.1 (2003.06.29)
[+] -ua to include User-Agent: header line instead of X-Mailer:
[+] yEnc for attachments as a compile time option. A separate set of binaries
has been provided.
[*] option parsing has been improved to catch malformed options easier.
[*] blat only displays full help with the -h switch, but if other switches are
malformed, it lists the first one it had a problem with. Yes, you can send
this to the log also!
[*] parsing of email addresses has been moved to its own function, to make it
easier to call for the Mailfrom: and RCPT: server commands.
[*] Content-description: header line for newsgroups will now say "News message
body" instead of "Mail message body" when appropriate.
[-] when sending to newsgroups with yEnc attachments, the
Content-Transfer-Encoding: will say "8BiT" instead of "7BIT".
[-] Before exiting the program, if a log file is open, an "End of Session"
message will be written.
------------------------------------------------------------------------------2.0.0 (2003.06.26)
[*] New order for the syntax output when running Blat with no parameters.
[+] -of <filename> : text file containing more options (also -optionfile)
[+] -ss : suppress subject line if not defined
[+] -charset <cs> : user defined charset. The default is ISO-8859-1
[+] -hdrencb : use base64 for encoding headers, if necessary
[+] -hdrencq : use quoted-printable for encoding headers, if necessary
[-] When building headers, certain fields were being fixed to conform to RFC
standards. The fixes were implemented in place, which could have caused
problems if blat is used to send smtp and nntp at the same time. This has
been corrected.
[*] The encoder routines have been modified to use Buf constructs instead of
relying on malloc(). The Buf construct will automatically issue malloc() as
needed.
[*] One routine was consolidated into its only caller, for minor efficiency.
This was done for the -sf option.
[*] The various encoder routines have been moved to the top of the file, to
eliminate the predefinitions of these routines. This also made it much
easier to implement Buf style parameter passing along side char*
parameters. C++ allows function overloading, so the quoted-printable and
base64 encocders have been overloaded to facilitate buffer encoding versus
header line encoding.
[*] If no recipient email addresses and no newsgroups are specified, an error
message is displayed and the program aborts.
[*] Extra carriage returns and line feeds in the log file have been removed by
scanning the resulting string for duplicate line feeds.
[*] The timestamp delimiter line has been put back in, with a new format to say
"Start of Session/End of Session".
[+] -timestamp : when -log is used, a timestamp is added to each log line
[+] -binary : do not convert ASCII | (pipe, 0x7c) to CrLf in the message body
[*] Blatcgi now knows 'ORGANIZATION' and 'CHARSET' values. The original code
knew 'ORGANISATION', now the US spelling has been added.
[+] -dsn to request a change in default delivery status notification behavior.
The default behavior is to receive a notification for all failed and
delayed deliveries. -dsn allows this to change so only the status
notifications you want will be sent back, if at all. The available options
for this are: n (never), s (successful), f (failed), and d (delayed).
These can be used in any combination, but n will always take precedence.

[+] -installSMTP to install SMTP related server information. This is a


duplicate of -install option.
[+] -installNNTP to install NNTP related server information. This has the same
syntax and format as -install, but this information is strictly for NNTP
servers.
[+] -groups <usenet groups> : list of newsgroups (comma separated)
[+] Added support for storing user login and password information into the
registry. These two fields will be encoded with base64 just to make it
unreadable from casual viewing of the registry. This allows a user to
remove these cleartext values from their batch files.
[-] -uuencode applies to attachments, not to the message body.
[+] yEnc has been added to use this encoding scheme for binary attachments. It
will likely only work for systems that fully support 8-bit data since there
is no provision to support 7-bit data streams in the protocol. There is a
failsafe check that if the SMTP server does not explicitly state 8bitmime,
then yEnc will be disabled for that email message. This has no effect on
NNTP traffic, yet. NNTP impact will have to be investigated a little
further to see if there is an equivalent EHLO command to give back extended
option support messages.
[*] -charset does not require -mime for it to take effect.
===============================================================================
See changes-194.txt (or http://www.blat.net?changes-194.txt) for older changes.
===============================================================================
(2003.06.15)
[*] Moved to http://www.blat.net at SourceForge.net, managed by Tim Musson,
coded by many (credit given where due...)
-------------------------------------------------------------------------------

You might also like