2000-02-13 (D. J. Hagberg): First real release 1.0.0

  Decided "hey, what the heck, let's call this 1.0 in time for the 
  Tcl conference...".

  Lots of documentation cleanups, moved docs from .txt to .html
  added lots of cross-references and links to RFCs as necessary.

  Added -replyto and -replytolist options to ezsmtp::send to 
  simplify specification of `Reply-To:' headers.


1999-11-01 (D. J. Hagberg): Pre-Release version 0.9.0

  New feature: -charset option to ezsmtp::send, which, when supported
  by Tcl and the SMTP server, allows non-us-ascii 7-bit characters
  to be transmitted correctly.  There are a bunch of caveats about
  this, and I'm not sure about data in the headers.  This is probably
  not completely compliant with the RFC's listed at:
  http://www.oac.uci.edu/indiv/ehood/MIME/
  but we're getting closer...

  Should keep our non-US friends happier.

1999-10-28 (D. J. Hagberg): Pre-Release version 0.8.1

  Fixed errorCode and errorInfo handling when an error occurs inside
  the private_smtp_begin procedure.  errorCode and errorInfo are now
  logged at debug level 9 and their contents are set as part of the
  `error' command to re-throw the exception.

1999-10-27 (D. J. Hagberg): Pre-Release version 0.8.0

  POTENTIAL INCOMPATABILITY: Removed -readwait and -initwait options
  from ezsmtp::config.  No longer needed, as I removed non-blocking
  timed I/O stuff.

  Finally figured out how to read multi-line responses without using 
  non-blocking I/O and the unix behavior of [read $socket].  RFC 821 
  appendix E clearly states how multi-line responses are supposed to
  work (last line has three digits followed by space, preceeding lines
  have a dash instead of a space).  Getting rid of non-blocking I/O 
  crap got the code back down under 1000 lines...  :-)

  Fixed-up install.tcl to act a little more like an InstallShield 
  wizard when run under wish.

  Tested on: Tcl 8.3a1 on Linux 2.2, Tcl 8.0.4+ on Solaris 2.6, Tcl
  8.0.3+ on NT4SP4, Tcl 8.0p2 on MacOS 8.0.

1999-10-26 (D. J. Hagberg): Pre-Release version 0.7.3

  Fixed output of user-set Date:, From:, and Subject: headers which 
  were output as Tcl list elements instead of bare text, caused by 
  changes for storing multi-line headers as a Tcl list.  Refactored
  header output code to a new proc private_send_header to ensure 
  consistency.

1999-10-25 (D. J. Hagberg): Pre-Release version 0.7.2

  Reverted to non-strict address validation and, instead of -addrregexp
  option, a new -strictaddr 0|1 option is documented, which allows the
  user to turn strict RFC 821-compliant address checking on or off.
  No hooks for user to override regexp any more.

  Moved email address validation to a private procedure so all addresses
  (-from, -to, ...) are validated and trimmed w/ the same code.

1999-10-25 (D. J. Hagberg): Pre-Release version 0.7.0 

  Re-added support for addresses trailing after all options, but log
  as a Depreciated construct.  Should make library users happier.

  Added support for RFC 1891-style return-receipt delivery status
  notifications.  See the docs on the ezsmtp::send -receipt option.

  Added support for users to intercept the log output.  See the docs
  for ezsmtp::config -logproc

  Added tight regexp to validate email addresses and parse them out of
  `Full Name <addr@a.com>' constructs.  Users may override the strict
  address validation with ezsmtp::config -addrregexp option [NOTE: removed
  as of version 0.7.2].  See docs for suggested non-strict regexp.

  License and code cleanup.  Now conforms tightly to the Tcl license
  and coding conventions, pretty closely matching the http library
  that ships w/Tcl.

1999-10-21 (D. J. Hagberg): Pre-Release version 0.6.0

  Eliminate specifying recipients after the end of all options
  (POTENTIAL INCOMPATABILITY) in favor of a newer, more flexible set
  of options: -to, -cc, -bcc, -tolist, -cclist, -bcclist, as
  documented in the ezsmtp.txt file.  The -XXlist options are much
  more efficient with large numbers of recipients than prior
  implementations.

  Increased the default -readwait interval to 20 seconds (was 5).
  Should work better with overloaded email servers now.

  Patches from kvetter for logging and batching behaviors.

1999-10-11 (D. J. Hagberg): Pre-Release version 0.5.0

  Darn near complete rewrite.  Here are some of the major highlights and 
  incompatabilities:

  Documentation! I've started docs in the esmtp.txt file.

  Namespace is now fully-qualified in all locations as ::ezsmtp.

  Rewrite of header handling (POTENTIAL INCOMPATABILITY).  Headers are
  now specified in a key/value list like:

    ezsmtp::send -headers [list name1 value1 name2 value2] . . .

  similar to the built-in Tcl http::geturl -headers... behavior.
  Header values may have multiple lines, separated by newline
  characters and will be sent according to the RFC 822 spec, with a
  leading tab (\x09) on continuing lines.  Header names are now
  enforced to match the RFC 822 spec.  I chose not to enforce the
  ASCII requirement on header values for now.  A warning is printed if
  the header lines are > 64 characters if -verbose mode is on, but no
  further action is taken.

  Header names are now case-insignificant and proper-cased before
  sending (POTENTIAL INCOMPATABILITY).  For example, `x-flubber: 1.0'
  will be sent as `X-Name: 1.0'.  Header values are left un-altered.
  Note that only the last header value for a given case-insensitive
  name, if specified with -headers, will be sent.  E.g.:

    ezsmtp::send -headers [list X-flubber 1.0 x-flubber 2.0 X-YZ ABC]

  will send the following header output:

X-Flubber: 2.0
X-Yz: ABC

  Note that case-wise, MIME-Version is treated specially, sent in that
  case, in order to comply with RFC 1521.

  Now attempts to ensure that the MAIL FROM: output and From: header
  contain an `@hostname' to comply with the spam-proofing in recent
  sendmail implementations.  If none is found, `@[info hostname]' is
  tacked onto the From address.

  An attempt at a valid `To:' header is made if none is specified by
  the user in -headers.  It is constructed as the list of recipient
  addresses for each batch (see below), each separated by an
  RFC-compliant comma/newline/tab sequence.

  Full switch names are now required in the ezsmtp::send command
  (POTENTIAL INCOMPATABILITY).  E.g.,

    ezsmtp::send -f vern -s "My subject" -b "My body" addr

  will fail.  It now needs to be specified as:

    ezsmtp::send -from vern -subject "My subject" -body "My body" addr.

  This was done to simplify switch processing code and minimize future
  incompatabilities.

  Better deliniation of package configuration and single-send SMTP
  conversation configuration, so switches from a prior ezsmtp::send
  will no longer affect subsequent ezsmtp::send's. (POTENTIAL
  INCOMPATABILITY.  Use the ezsmtp::config command for persistent
  configuration changes).

  When sending to a large number of addresses, one can break up the
  SMTP conversations into "batches" of recipients, as many sendmail
  implementations exhibit significant slowdowns with more than 10-20
  recipients per email.  See the ezsmtp::config `-batchsize'
  documenation.

  Long messages from Tcl channels are now handled more efficiently by
  reading/sending the message line-by-line from the channel.  Note
  POTENTIAL INCOMPATABILITY that if configured with a non-zero
  -batchsize and a recipient list larger than the -batchsize, the
  channel *MUST* support a rewind operation via tell/seek.  E.g., one
  must use a file, not a pipe, in this case.

  Lines longer than 1000 characters will be broken at 1000 characters,
  per the RFC 821 spec (POTENTIAL INCOMPATABILITY).  This is done very
  crudely (does not look for a whitespace character for a clean
  break).

  The default Content-Type header no longer has quotes around
  the charset=... parameter, per the RFC 1521 spec.

  ezsmtp::config command to get/set package-wide configuration values
  such as the From address, default servername/port, and timeouts.
  See the docs for details.

  Beginnings of support for ESMTP by attempting a EHLO to start the
  conversation and parsing the responses to determine available ESMTP
  extensions (needed for future delivery status notification stuff).

  Now uses non-blocking socket I/O and fileevents to allow for
  timeouts and multi-line responses from the SMTP server (required for
  ESMTP).

  Now attempts to ensure that SMTP socket connection is closed upon
  return from ezsmtp::send.  Prior version would have leaked socket
  descriptors on errors.  The new version catches any errors, closes
  the socket, and re-throws the error message.  Note that some
  errorInfo and errorCode info may be lost in this case.

  Input/output logging changes, seen when -verbose configuration is >
  0.  Output now prefixed with "S: ", received input prefixed with 
  "R: ".

1999-10-10 (D. J. Hagberg)

  Added full attribution and indemtity stuff for Keith Vetter and 
  UC to the license.terms file.

1999-10-08 (D. J. Hagberg)

  Renamed package  to "ezsmtp" to avoid collisions with the 
  MIME/SMTP package recently released by Marshall Rose
  (http://www.oche.de/~akupries/soft/mail/).

  Fix-up from lduperval for From/from handling.

  Bumped up version to 0.3.0 to reflect name change & bug fixes.

  Bumped up version again to 0.3.1 to reflect namespace change.

1999-10-07 (D. J. Hagberg)

  Packaged up with license terms and README file.  

  Get username and hostname from Tcl 8.0 facilities (better cross-
  platform behavior).

  Implement changes suggested by lduperval: throw errors instead of
  exiting, clean up header regular expressions, ensure headers get
  sent, allow different From: and MAIL FROM: names, etc.

- - -

Notes from the original author:
##+##########################################################################
#
# TkMailer
#
# by Keith Vetter <keithv@cs.berkeley.edu>
#
# An smtp client similiar to unix mail in sending mail. Talks to the
# smtp server on a given host and posts a mail message with given
# subject to the recipients specified.
#
# Designed for Win95 so values such as hostname and username must
# be changed by hand.
#
# To-do:
# o could be made faster for multiple recipients if we kept the socket
#   connection open instead of opening and closing for each recipient
#
# Usage: mail ?-q? ?-v*? ?-s subject? recipient ?recipients...? < file
#     or mail ?-q? ?-v*? ?-s subject? -f filename recipient ?recipients...?
# -v gives verbose info, -vv gives more, -vvv even more, etc.
#
# KPV Sep 13, 1998 - ported to Windows
# KPV Mar 30, 1998 - rewrote from an old, stale version
# KPV May 05, 1998 - put user strings to front of file for easy editing
