This is a document that records what was done between releases. As always, thank you to everyone who contributed code, documentation, bug reports, and feedback.

Version 2.2.0

Released 15 June 2004

Below are some highlights of features and changes already available:

  • mbox support
  • Mail attributes
  • JavaMail 1.3.1
  • dnsjava 1.6.2, includes auto-discover DNS servers
  • FetchMAIL, deprecating FetchPop
  • Quotas
  • Extensive message redirect system
  • Improved network address handling
  • Multiple remote delivery gateway servers
  • Many performance improvements
  • Many new matchers and mailets
  • Many bug fixes
  • And much more!



  • [JAMES-9] - JamesSpoolManager doesn't shutdown gracefully
  • [JAMES-62] - Spooler loops and add message many times
  • [JAMES-72] - SMTP Handler DATA buffering issue
  • [JAMES-96] - Mailet container should not trap exceptions in init()
  • [JAMES-109] - run.bat created wrong temp dir
  • [JAMES-128] - Fix problem when invalid domain name is passed to NetMatcher
  • [JAMES-133] - NullPointerException at
  • [JAMES-135] - NPE on nonexistant mailing-list repository
  • [JAMES-142] - RemoteDelivery only tries one of multiple A record entries.
  • [JAMES-144] - POP3Handler breaks with message numbers out of bounds
  • [JAMES-147] - Update libraries
  • [JAMES-150] - NullPointer Exception when mail does not contain any Received: headers
  • [JAMES-151] - connectionLimit on services ignored
  • [JAMES-152] - When a Received header is invalid mail may be created with a null remote address and host name
  • [JAMES-153] - Looping MessageException causes system stall
  • [JAMES-156] - AbstractStorageQuota matcher subclasses never match when recipient alias is used
  • [JAMES-157] - AbstractQuotaMatcher subclasses should not match when reverse path is NULL
  • [JAMES-163] - RemoteManager buffering issues
  • [JAMES-167] - Remote delivery counting retries wrong
  • [JAMES-170] - Postmaster address should be case insensitive
  • [JAMES-176] - MySQL query not using index for string comparison
  • [JAMES-178] - MailAddress can spit OutOfBoundsException
  • [JAMES-182] - Fix the TMPDIR path under windows/cygwin use of script
  • [JAMES-187] - Bug with DNS entries with 0 TTL
  • [JAMES-189] - Remote delivery sometimes not trying all MX records
  • [JAMES-191] - HasAttachment has false positives and negatives
  • [JAMES-192] - MSSQL mail table create bug
  • [JAMES-193] - MailetConfig does not implement getInitParameterNames()
  • [JAMES-194] - DNS occassional null pointer
  • [JAMES-199] - Bounce not using null sender
  • [JAMES-200] - MailetConfig throws exception for empty getInitAttribute
  • [JAMES-202] - Proper POP3 response to QUIT
  • [JAMES-203] - File protocol URL with JDK 1.4.2
  • [JAMES-207] - Exception handling when fetching message, stranding connection
  • [JAMES-208] - Regex code is not thread-safe
  • [JAMES-215] - Javadoc corrections in mailet API
  • [JAMES-230] - File stream repository may strand resource
  • [JAMES-233] - SMTP AUTH PLAIN doesn't work
  • [JAMES-236] - java.lang.NullPointerException iterating over SMTP hosts
  • [JAMES-238] - Missing Date: header with CommandListserv
  • [JAMES-239] - CommandListserv corrupts Subject: header
  • [JAMES-240] - LinearProcessor.verifyMailAddresses should catch java.lang.ArrayStoreException
  • [JAMES-243] - FromRepository does not reset mail state
  • [JAMES-247] - James Does Not Work With Oracle DB For Spool Repository
  • [JAMES-249] - getSMTPHostAddresses doesn't resolve when MX RHS is CNAME
  • [JAMES-251] - ClassCastException
  • [JAMES-253] - deadlock in mordred connection pool
  • [JAMES-255] - SMTPHandler logs exceptions that abort the connection only at DEBUG level
  • [JAMES-261] - Text error in config.xml
  • [JAMES-262] - Invalid link in james-fetchmail.xml
  • [JAMES-265] - org.xbill.DNS.Address not resolving addresses in some configurations
  • [JAMES-267] - NullPointerException in Fetchmail when there are no From: or Sender: headers
  • [JAMES-268] - Spooler.accept(...) can leave locked messages and leak memory
  • [JAMES-269] - AvalonMailRepository emits spurious "so we're deleting it... good riddance" messages due to synchronization
  • [JAMES-271] - can't resolve when MX record direct an ip
  • [JAMES-276] - The url for the ENTITY declarations in config.xml should be just "../conf/file-name"
  • [JAMES-278] - Remove references to Jakarta where no longer accurate
  • [JAMES-280] - DNSServer does not cleanup DNS cache cleaner thread.
  • [JAMES-281] - Return-Path twice in header
  • [JAMES-282] - Partial message may be delivered if client disconnects
  • [JAMES-294] - Database Pool becomes exhausted after a short time when heavily polled


  • [JAMES-99] - RFC1894 format notification
  • [JAMES-161] - Quota framework
  • [JAMES-162] - Partial send support
  • [JAMES-169] - Network-based authorization for SMTP AUTH
  • [JAMES-171] - Improve support for character encoded subjects in mailing lists
  • [JAMES-172] - New thread pool implementation
  • [JAMES-173] - Control number of rows returned in JDBCSpoolRepository
  • [JAMES-174] - Improve performance on message size
  • [JAMES-177] - DNS settings autodiscovery
  • [JAMES-179] - Reduce memory footprint of sql resouces
  • [JAMES-180] - Faster listing usernames
  • [JAMES-181] - Better CRLF handling in protocols
  • [JAMES-183] - Overhauled Redirect mailet
  • [JAMES-184] - New network matcher classes
  • [JAMES-188] - Improved error handling in processors
  • [JAMES-198] - New listserv code.
  • [JAMES-204] - Upgrade to JavaMail 1.3.1
  • [JAMES-205] - New database connection pooler
  • [JAMES-210] - Upgrade to dnsjava 1.4.0
  • [JAMES-212] - Batch delete from mail repository
  • [JAMES-214] - Better PID handling
  • [JAMES-217] - Upgrade to dnsjava 1.4.1
  • [JAMES-218] - showalias and showforwarding commands
  • [JAMES-221] - SenderInFakeDomain network setting
  • [JAMES-222] - Make file mail repository sort FIFO
  • [JAMES-225] - Upgrade to dnsjava 1.4.2
  • [JAMES-226] - Simplify connection tracking
  • [JAMES-227] - Upgrade to dnsjava 1.4.3
  • [JAMES-228] - Upgrade to DBCP 1.1
  • [JAMES-232] - JMX exposes more server information
  • [JAMES-234] - Improved bounce from RemoteDelivery
  • [JAMES-283] - James should use default backLog value when creating a ServerSocket

New Feature


  • [JAMES-149] - Add soft-fail to unresolved received from domains
  • [JAMES-190] - Apache license 2.0
  • [JAMES-213] - Mail repository throw MessagingException instead of RuntimeException
  • [JAMES-223] - Remove stack traces to console
  • [JAMES-252] - Upgrade to dnsjava 1.6.2
  • [JAMES-277] - Generate mailet.jar as separate from core james.jar

Version 2.1.3

Released 12 May 2003

  • [NjB] (code) Fixed stream handling in MimeMessageWrapper to address a JavaMail issue introduced in v2.1.2
  • [NjB] (code) Fixes to AddFooter for text/html parts
  • [MI,PG,NjB] (code) Fixes to AddFooter for MimeMultipart messages
  • [NjB] (code) Changed ExtraDotOutputStream to enforce RFC 2821 #2.3.7
  • [NjB] (code) Corrected allowable characters for localpart of address
  • [NjB] (update) Removed generated files from source distributions
  • [PG] (code) Corrrected handling of NNTP messages to avoid character encoding issues
  • [NjB] (code) James.getId bug - courtesy of Sid Stuart
  • [KS} (code) Added NNTP linecounting support
  • [KS} (code) Fixed NNTP authentication
  • [HJ] (code) Fixed bug 18726 (optional socket factory to specify outgoing bind address)
  • [NjB] (code) Fixed bug 19418 (changed notify/wait code in spooler)
  • [NjB] (code) Fixed bug 18307 (NotifySender headers)
  • [NjB] (code) Fixed bug with non-InternetAddress addresses - courtesy of Steen Jansdal
  • [NjB] (code) Fixed bug in NotifySender with complex MIME messages
  • [SK, NjB] (code) Added Delivered-To header in LocalDelivery
  • [NjB] (code) Fixed Bug 15428 - check for valid user before attempting removal

Version 2.1.2

Released 21 February 2003

  • [NjB] (code) Fixed handling of permanent/temporary errors in RemoteDelivery
  • [NjB] (code) Fixed bug where connect error could cause outgoing mail to be discarded.
  • [PG] (code) Fixed the bounce() method to add the original message as a message MIME type with an attachment disposition.

Version 2.1.1

Released 11 February 2003

  • [KL] (code) SMTP AUTH compatibility change
  • [NjB] (code) Changed MimeMessageWrapper to use the raw stream when possible
  • [NjB] (code) Fixed synchronization bug in AvalonMailRepository
  • [NjB] (update) Updated Avalon LogKit
  • [NjB] (code) Infinite loops are interruptable
  • [HB, NjB] (code) Fixed NNTP crossposting
  • [NjB] (code) Fixed synchronizaion bug in file repository
  • [NjB] (code) Enabled log rotation
  • [NjB] (doc) Fixed broken links
  • [DA, NjB] (update) Updated JavaMail and JAF
  • [NjB] (code) Updated sqlResources.xml for PostgreSQL with patch from simon
  • [NjB] (code) Reorder primary key for JDBCMailRepository to optimize queries using just the repository name.
  • [PG,HB] (code) NNTP dot stuffing fix
  • [PG] (code) NNTP OVER/XOVER fix
  • [NjB] (code) Experimental RegexMatcher classes

Version 2.1

Released 29 December 2002

  • (AK) (doc) Added LDAP RFCs.
  • (PG) (code) Fixed platform-specific performance issue with the POP3 server delivery.
  • (PG) (code) Fixed bug where RemoteDelivery did not iterate through all MX records on connect failure.
  • (PG) (update) Updated James to use the Avalon Framework version 4.1.3.
  • (PG) (update) Updated James to use Avalon Phoenix version 4.0.1.
  • (PG) (doc) Added extensive commenting - specifically Javadoced the vast majority of methods.
  • (PG,AI) (code) Added a James specific abstract Service implementation. Unified configuration, logging, as well as enabling the use of thread pools and socket types on a per service basis.
  • (NjB) (code) Corrected JDBCMailRepository to obey stated contract.
  • (NjB,PG) (code) Adjusted service handlers to flush socket output streams to ensure prompt client interactions.
  • (PG) (code) Adjusted the NNTP server so that it better conforms to the NNTP specification (see bug #13564 for details).
  • (PG) (code) Corrected a typo that had been disabling NNTP using SSL functionality.
  • (PG) (code) Corrected an architectural flaw in the NNTP server implemenation that disabled NNTP authentication.
  • (NjB) (code) Fixed a bug in the GenericListserv subject normalization. Neatened the code to make later modifications easier.
  • (BW) (code) Fixed a bug in the RemoteDelivery mailet that caused the mailet to unnecessarily split the recipient list when using a gateway.
  • (NjB,PG) (code) Added object pooling for service handlers to substantially improve performance.
  • (AI,PG) (code) Added a new Watchdog interface to effectively support connection timeouts. An implementation of the interface was added that uses a second thread per connection to ensure timeouts.
  • (NjB,PG) (code) Resolved a memory leak in the source - a list of files to be deleted was being maintained that was unnecessary. The file to be deleted is now deleted immediately after it is no longer needed.
  • (PG) (code) Changed the code to ensure that all thread pool threads are returned to the thread pool in a non-interrupted state.
  • (PG) (code) Centralized the file/directory lookup code inside James and fixed it so that it handled absolute URLs properly.
  • (AI,PG) (code) Added a more substantial connection manager. This connection manager allows us to limit the maximum number of client connections per server socket. It also allows us to set the socket timeout for client sockets explicitly.
  • (DA,PG) (code) Added enabled/disabled switch to main server components.
  • (DA) (code) Added new FetchPOP functionality, to allow James to consolidate mail from a number of POP3 servers in a single server.
  • (DA) (doc) Added documentation to demonstrate how to configure James as a universal sendmail relay.
  • (NjB) (code) Made subject prefix bracketing in GenericListserv configurable.
  • (NjB) (code) Added the HasHeader matcher.
  • (NjB) (code) Added the JDBCVirtualUserTable mailet.
  • (NjB) (code) Enhanced the RemoteAddrInNetwork and RemoteAddrNotInNetwork to accept domain names.
  • (PG) (update) Fixed the log configuration so that AM and PM entries are properly distinguishable by default.
  • (NjB) (code) Added a configurable debug parameter to several mailets to allow a more granular control of debug logging.
  • (NjB) (code) Added the Habeas warrant mailet and matcher.
  • (NjB,PG) (update) Changed the server configuration to default log at INFO level. Adjusted logging statements so that they are log level appropriate.
  • (PG) (code) Fixed a critical bug in the dbfile implementation. Fixed repository implementation so that db repositories do not behave as dbfile repositories.
  • (NjB) (code) Fixed MimeMessageWrapper so that mail headers are properly updated when headers are set on the wrapper.
  • (PG) (code) Added UNSETFORWARDING functionality to the RemoteManager.
  • (PG) (code) Closed an open relay hole involving an empty Sender header.
  • (PG) (code) Fixed Oracle specific bug that limited us to messages of 4K or less in the repository.
  • (SS,NjB,PG) (code) Ensured that a number of database and I/O resources are properly closed under all conditions.
  • (NjB) (code) Changed default column sizes for JDBC repositories to be RFC compliant.
  • (NjB) (code) Fixed exception handling in JdbcDataSource when getConnection() fails.
  • (PG) (code) Fixed NotifySender/NotifyPostmaster to be more robust against ill-formed headers in the email being forwarded.
  • (SD,SS3) (code) Made a substantial performance enhancement to the LinearProcessor such that mail changes are not persisted to the store until necessary. Also reduced synchronization scope.
  • (PG) (code) Converted String concatenation to the use of StringBuffers throughout the code base.
  • (PG) (code) Fixed date formatting to be thread safe.
  • (NjB) (code) Fixed InSpammerBlacklist
  • (PH) (update) Upgrade James to the Avalon 4.0/4.1 actual releases.
  • (NjB,SK) (update) Fixed MailImpl.duplicate to include remote addr, remote host, and last updated fields.
  • (CB2) (update) Fixed NNTP server bug where the NEXT command was not being properly dispatched and handled.
  • (SK) (update) Cleaned up error handling in LocalDelivery.
  • (SS2) (code) Changed the default configuration so that log files are appending by default.
  • (SS2) (update) Reported the lack of in.close in MimeMessageSource.getSize(), which was causing stranded file handles, especially during large POP3 sessions.
  • (AI) (update) Matcher config implementation object now properly set with matcher name.

Version 2.0a3

Released 20 April 2002

  • (DA) (update) Fixed POP3 message size bug that prevented retrieval
  • (SK) (code) FileRepository should no longer produce 0-byte files. It checks that the source is different than the target, or confirm it is in memory before saving to disk.
  • (SK) (update) Removed check that connection is not closed before returning it. The pooler is already confirming the connection was open before putting it in the pool, so this was a big unnecessary performance drain.
  • (SK) (update) Fixed the delay in the JDBC mail spool repository as it wasn't rechecking correctly after it emptied the spool.
  • (SS2) (code) Added dot-stuffing in POP3 message delivery to fix problems with Netscape and other mail clients and to comply with RFC.
  • (JK) (code) Fixed bounce method to use the Return-Path header if there is one.
  • (SK) (update) Improved handling of delivery error messages when the remote server returns a specific 5XY complaint.
  • (SK) (code) Better diagnosing of temporary vs. permanent delivery exceptions, most notably "Could not connect to host.." is a temporary exception.
  • (SK) (code) Remote SMTP delivery now sets the remote hostname using the servername configuration setting (uses the first one).
  • (SK) (update) Have it cleanly (not print stack trace) if the remote manager handler has io/socket exceptions.
  • (SK) (update) Support in "IsSenderInFakeDomain" to handle null senders properly (was producing a false positive in this case).
  • (PH) (update) Added releaseConnection method to BaseConnectionHandler as per Paul H's bug report.
  • (SK) (update) Reordered 250 SMTP responses to fix Mac client issue per Giles Chanot's bug report.

Version 2.0a2

Released 1 December 2001

  • (*) (update) Moved to Avalon snapshot of November 2001
  • (DA) (update) Fixed POP3 message size bug that prevented retrieval
  • (SK) (code) Added Mordred database connection pooling. It is the marriage of Town's db pooling code and Excalibur's configuration.
  • (SK) (update) Changed MailImpl.getSize() to getMessageSize() and from int to long.
  • (SK) (docs) Small updates to documentation
  • (SK) (code) Added JDBCListserv, straight JDBC implementation of old TownListserv that extends GenericListserv
  • (SK) (update) Patched bug in GenericListserv for when subject was null
  • (SK) (update) Got mailets/matchers to load from something besides
  • (SK) (code) Added scheduler notification during SMTP DATA reception and POP3 RETR sending so the connection handler doesn't time out connection while data is being transfered.
  • (SK) (code) Support <gatewayPort> setting on RemoteDelivery to send all messages to a non-port 25 SMTP server. Only makes sense when <gateway> is also set.
  • (EP) (update) Used getAsBooleanValue in various configuration methods to make code more readable.
  • (SS) (update) Added support for Oracle database for mail and spool JDBC repositories.

Version 2.0a1

Released 26 October 2001

  • (CB,*) (update) Moved to Avalon snapshot of 9-25-2001.
  • (HB) (code) Added NNTP service.
  • (SK) (update) Greatly improved multi-threading support for repositories and SMTP reception.
  • (JB) (code) SMTP AUTH support
  • (SK) (update) Support null senders, i.e., MAIL RCPT: <>.
  • (DD,SK) (update) Converted Town mail and user repositories to straight JDBC ones, using Excalibur connection pooling and configurable SQL statements per DB.
  • (SK) (update) Messages are no longer loaded until absolutely necessary.
  • (GB) (update) Fixed exception being thrown on MailAddress parsing.
  • (CB) (update) Rebuilt CVS tree after hack and moved src to src/java.
  • (DA) (code) New extensible, flexible Redirect mailet that handles notifications and forwarding.
  • (SK) (code) JDBC Alias mailet.
  • (various) (docs) Added a whole bunch of related RFCs to the webdocs.
  • (DA) (update) Add date to bounced emails.
  • (HB) (update) Updated DNS library and started process to move it to Avalon service.
  • (various) (update) More checks to fix "stuck file" problem in Avalon mail repository.
  • (MP) (code) Limit the size of a message on reception (rather than waiting until processors).
  • (SK) (update) Fixed dot-stuffing in SMTP reception/delivery.
  • (SK) (update) Improved how Return-Path and Received headers are generated during SMTP reception.
  • (SK) (update) More efficient remote delivery code, better error messages, and gateway parameter to route all messages to a single target.
  • (DA) (update) Fixed timezone bug in RFC822DateFormat
  • (MP) (update) Patch to support username@[yyy.yyy.yyy.yyy] addresses
  • (GB) (update) Patch to fix size calculation from headers
  • (RS) (image) Contributed James logo
  • (SK) (update) Changed MailetException to extend MessagingException, and Mailet.init() throws MailetException.

Version 1.2.1

Released 13 December 2000

  • (SK,SR,CB) (update) Fix for "stuck file" problem in Avalon mail repository.
  • (SK) (design) Made usernames case insensitive on MailAddress
  • (SK) (code) Complete rewrite of processor code to send through Mail object through matchers and mailets. Design might be less efficient but easier to understand and more flexible for later improvements to API. Also no longer "loses" IP address and error message information when Mail object go from one processor/state to the next (ToProcessor changed as well now that processor works).
  • (SK) (update) Updated to JavaMail 1.2
  • (SK) (update) Changed instantiation of recipients on a Mail object to a Set (HashSet) whenever possible in preparation for the API having this change.
  • (IS) (code) Added UsersTownRepository to let you maintain user lists in a database
  • (SR) (update) In POP3 handler, properly includes headers in calculating size of messages.
  • (SK) (update) Removed "synchronized" attribute on many methods in town and file spool repositories. Should significantly boost performance and multithreaded capabilities.
  • (SK) (code) Optimization of town mail repository, introduction of JamesMimeMessageInputStream and the James MimeMessage. Should significantly reduce the number of unnecessary parses or saves on MimeMessages in server.
  • (SR) (update) Properly calculates hashCode for MailAddress so duplicates do not exist in Hashmaps
  • (SR) (update) Hardcoded serialVerUID on MailAddress and MailImpl to that of James 1.2 release so future releases can continue to use mail stored in earlier releases.
  • (IS) (update) Added ability on NotifySender and NotifyPostmaster to attach informative notice.
  • (SK) (update) GenericListservManager now requires existsAddress() which it uses to prevent someone already on the list from subscribing or someone not on the list from removing themselves.
  • (SK) (update) Changed User repository for file to *always* end the destination with a File.separator. Otherwise if people mixed usage of this, it would crash the repositories with confusing error messages. Child repositories were already properly created with a terminating File.separator.
  • (SK) (code) New matcher: IsSingleRecipient
  • (SK) (code) Added spam blacklist checking for 3 spam blacklists that make this available in a simple DNS lookup check. All free services through Added to default configuration in config.xml
  • (PU) (code) Added first testing program. This would recreate file stuck problem. Would be good to build collection of testing utilities in this new package.
  • (SK) (docs) Documented what all the jars are in the lib directory (what they're called, where they're from)

Version 1.2

Released 16 October 2000

  • (SK) (design) Abstracted mailet API to be Avalon (implementation) independent
  • (CB) (code) Abstracted mail repository in JAMES/Avalon to allow more varied implementations.
  • (SK) (code) Database implementations of mail repositories
  • (SK) (code) Changed remote delivery to use an outgoing spool with a specified number of delivery threads
  • (CB) (code) Experimental implementation of LDAP user manager
  • (SK) (update) Reworked mailets and matchers to fit new API and added many more classes
  • (CB, SK) (update) Fixed some bugs in POP3 server
  • (CB) (update) Added full TLS support in POP3 (POP3S)
  • (SK) (update) Fixed sorting of MX records so it attempts delivery in correct order
  • (SK) (update) Changed remote manager to not allow a login if an admin account's password is empty, and sets the root account's password empty by default (so you have to set one... prevents someone from knowing the password to your system out of the box)

Version 1.1

Release 27 July 2000

  • (??) (code) Unknown changes
  • (SK) (code) Made DNS functionality a separate block

Version 1.0

Released 26 February 2000

  • (SK, FB) (code) Added DNS stuff to remote delivery.
  • (FB) (code) Add some autodetect support for easier configuration.
  • (FB) (code) Add support for Mailet.
  • (FB) (update) Add Mailet interface draft.

Version 0.9.5

Released early 2000

  • (FB) (update) Split the SMTP Server in a protocol handler and a MailServer available to all Avalon blocks.
  • (FB) (update) Tune MessageContainer class.

Version 0.9-dev

Unknown release date

  • (FB) (update) Based on much code from Serge Knystautas first implementation of JAMES on top of the Avalon framework.


Check out our Who We Are page to see who to thank.