History

 Version 3.2:

     - added authentication-handler to smtp2zope.py; protected all
       public-manage-methods with 'View'-permission. Should be useful
       if you want a more secured MailBoxer. You can now call the
       smtp2zope.py with an additional authorization
       (http://user:password@localhost:8080/MailBoxer/manage_mailboxer)
       or set the authorization directly in smtp2zope.py.
       Thanks to Steve McMahon for ideas and patches!!!

     - added additional wrappers called setMailBoxerMailProperty (wraps
       manage_addProperty) and catalogMailBoxerMail (wraps catalob_object)
       for making it easier to derive own subclassed MailBoxers. Thanks to
       Alexandre Fernandez from Nuxeo for pointing me to this!

     - fixed bug: bounce-detection for mails with an empty returnpath
       was broken. Thanks to Nate Aune for helping me tracking this down!!!

     - fixed minor bug in mail_(un)subscribe. Mail-From-Header wasn't
       mime decoded in mail-body.

     - fixed minor bug: no Content-type was set for manage_moderateMail.


 Version 3.1:

     - added a authentification stage for all moderated mails, so noone except
       a moderator can relay a mail onto a moderated list. Every mail to a
       moderated list is queued and will result in a mail sent to the
       moderators with "pin-signed" links to approve or discard the mail. Only
       by clicking this link a mail can be relayed to the list. The internet is
       a nasty place to play with mails...

     - refactored mail_search as include to index_html so an integration in
       ZPT should be much easier now (no more reference to
       standard_html_header/footer in mail_search / mail_index).

     - removed creation of mail_handler as default-policy. Most people won't
       need it, people who need it, can create it. It is still called as hook
       if it exists. But less is sometimes more...

     - fixed some minor bugs regarding the character-decoding in
       mime_decode_header; added an expression for unfolding headers.

     - added check for empty return-path to checkMail. Most "autogenerated"
       mails should have an empty return-path, so dropping them is a  good idea
       to avoid loops, etc. Thanks to Richard Waid from iOpen!

     - made some fixes to MailBoxerTemplates: all lookups to the
       mail-dictionary are now handled by get.

     - made some log-messages a little bit more usable by adding the  raised
       exceptions. Moved log-messages to log-levels (INFO, PROBLEM, ERROR).

     - truncated pin to only 8 digests, so urls and subject-lines won't get too
       long.

     - fixed bug: There were some changes in Zope 2.7 security machinery, so
       the mail_template would need authorization in due of the ZopeFind.
       Replaced ZopeFind with simple objectValues('File'). If you use other
       content-types, you should adapt your templates to the correct meta_type
       for storing attachements.


 Version 3.0:

  New Features

   - added sender-loop-limitation; you can now determine
     how many mails a sender (senderlimit) can send in x
     seconds (senderinterval), before the sender will be put
     onto a disabled-list. This is very useful to prevent a
     denial-of-service caused by hosed vacation mailers or
     other endless-loop-situations. Thanks to Richard Waid
     for his ideas and patches!!!

   - added mail-serialisation for smtp2zope-gateway. This
     will avoid Zope-Read-Conflicts in heavy-duty-setups. Thanks
     to Richard Waid for his nice work!!! Every post will lock the
     smtp2zope-gateway until the request is finished. LockFile-code
     is borrowed from Mailman. Thanks to all the Mailman-guys...:)

   - added getter/setter-property as hook for getting/setting
     dynamic property values from a PythonScript; added getValueFor
     as a universal wrapper for property/getter-values; adapted
     all dtml-templates.
     
   - added unclosed-property: You can now declare a list as 'unclosed',
     so everyone can mail into a list without being subscribed.

   - added returnpath-property. No you can set a returnpath for mails
     independent of the first moderator in the moderator-list.

   - added storage-property as a traversed path to archive-folder. Now
     you can set up your own archive with an customized id if you want to.

   - added searchMailBoxerArchive: Now all replies to a mail will
     be skipped on the search-page.

   - added new wrappers: addMailBoxerFolder, addMailBoxerMail,
     addMailBoxerFile, so you can easily subclass MailBoxer for
     customized environments like CMF/Plone/etc.pp.

   - added method archiveFolders: used to retrieve all
     folderish elements from an archive. Maybe useful if someone uses
     other containers than folders to store MailBoxer-Mails.

   Changes of existing features

   - synced bounce-detectors with current MailMan-Bouncers (only the
     DSN-Bouncer seems to have changed).

   - catalog-property is now evaluated as a traversable path to
     a Catalog. You can now use a catalog in another folder for
     cataloging mails.

   - smtphost is now optional when adding a MailBoxer. If no smtphost
     is given, no MailHost will be created.

   - improved / changed semantics of moderated-lists:
     only subscribed members will generate a moderation-request if a list
     is closed. Unclose a list if you want the old semantics (every mail to
     a moderated list generates a moderation request).

   - refactored all TTW-callable-manage_*boxer into a public and private
     part (manage_requestBoxer calls requestMail for example) to protect
     all public available methods with a security check. Removed
     TTW-callable manage_checkBoxer (it's now checkMail) due to
     security reasons.

   - refactored manage_frameBoxer (no need for a public interface at all)
     into protected method processMail. Removed redundant security checks
     (manage_checkBoxer was called several times without a need),
     which will result in less server-load if you run many lists / mails
     with MailBoxer.

   - the hashkey for validation subscription-requests is now stored
     as a property. Many people restarting their servers over night,
     so regenerating this hashkey with every restart is bad,
     because of regularly outdated subscription-tickets.

   - made the messages in mail_subscribe/unsubscribe/reply/moderator
     more verbose. Thanks to Jean Jordaan for his patches!!!

   - added Reply-To-Header to mail_moderator, so a moderators reply
     is redirected to the list. Thanks to Jean Jordaan for his patches!!!
     Removed Reply-To from awaiting-and-error-replies to avoid
     useless bounces in due to spam.

   - removed list-archive-header from mail_header.

  Bug fixes

   - fixed bug: MailBoxer could loose some emails, if the Zope-Server
     wasn't available. Added improved exception-handling for
     smtp2zope-gateway. Switched from urllib to urllib2 to have
     a better control over server-responses. Thanks to Richard Waid
     for his initial ideas and patches!!!

   - fixed bug: mail_reply could create a mailloop under some
     wired circumstances.

   - fixed bug: None/corrupted/doubled entries in maillist were sent
     to smtp-server which resulted in minor error-messages in the
     maillog-file.

   - added some checks in previousObject / nextObject to get only
     folderish objects from the archive.

   - "Waiting for approval"-mails were redirected to the list, which
     could lead to infinite loops when spam-bounces arrived. Fixed
     template.

  Cleanups

   - cleaned up archive-templates.

   - cleared up __init__; all properties will now be set directly
     in manage_addMailBoxer.

  Removed

   - removed mail_in/out_members-hook; please use the universal
     getter-hook instead.

   - removed ConvertArchive.py: People updating from MailBoxer 1.x
     (very, very old) should take this script from a previous release.


 Version 2.3.0:
 
     - added very nice MailBoxer-Logo provided by Karsten W. Rohrbach. 
       Thank you so much, Karsten!!! The logo is just as I imagined MailBoxer
       in my dreams. GREAT WORK! Please note: The MailBoxer-Logo is 
       distributed under the Create Commons License
       (see http://creativecommons.org/licenses/by-nc-sa/1.0/).
       
     - added batchsize: Now you can determine how many recipients
       are bulked in one mail to the smtp-server.
       This is useful if your mail-server can't send huge lists at once
       or remote servers don't accept really big recipient-lists.
       Default is bulking in one batch as in previous
       releases (batchsize = 0). Many thanks to Patrick G?nther for testing
       a pre-release with a really huge list!!!
       
     - made all properties deleteable, so they can be acquired from
       a parent-container if you delete them.

     - refactored code from index_html into mail_index. This allows you using
       PageTemplates for displaying the archive much more easily
       (see README.txt).

 Version 2.2.6:
 
     - added a keepdate-parameter. Useful if you want to import
       mailarchives with MailBoxer. Thanks to Eric Barroca!
       
     - fixed critical bug: a cc to a moderated list produced
       a mail-loop. Thanks to Sebastian Hoffmann.
       
     - fixed error in the README.txt: Bounce-detection can only
       be used via manage_bounceboxer.
       
     - removed 3.party-howto for running MailBoxer on windows.
       It wasn't really a big help, I guess... Maybe someone
       can provide a more generic one.
       
       
 Version 2.2.5:
 
     - added a new headers-option: MailBoxer will store additional
       mail-headers for each mail which match a regular-expression.
       This is useful if you want to store the message-id of a mail 
       or something else.

	 - changed all mail-(un)subscribing-templates: now all mails will
	   be directed from and in reply-to the list-address. Some
	   clients seem to have problems with different addresses.
	          
     - fixed bug: decoding for mails with dispositions was broken;
       Thanks to Sven Anders for helping me tracking this down!!!  
       
       
 Version 2.2.4:
 
     - smtp2zope.py exists now with the correct error-codes on
     failures, so the mail-server can take more appropriate actions.
     Thanks to Christian Theune for his patches!

     - fixed a bug in the urlifier for the archives: https-urls
     weren't urlified. Thanks to Marcus Schopen!

     - added a red-background to the "Remove from Maillist"-Button on
     Bounce-Screen. Thanks to Marcus Schopen!
          
          
 Version 2.2.3:

     - added support for ZCTextIndex (>Zope 2.6.x); changed default of
       mailDate to Date-Index.
     
     - added a textwrap-method to MailBoxer. Stop getting angry
       about unwrapped Outlook-Mails when surfing through a
       archive..:)

     
 Version 2.2.2:
      
     - manage_requestboxer gives now an error-feedback for already
       subscribed or not subscribed requests. Please note changes
       in mail_reply.

     - fixed a bug in manage_addMail: filename wasn't mime-decoded.
     
     - fixed typo in mail_footer.

     - minor cleanup in manage_bounceboxer which should avoid
       "unchanged" undos of bounce-table.
       
     
 Version 2.2.1:
 
     - Removed bounce-detection from manage_checkboxer. 
       Mailman-Bounce-Handlers can raise exceptions or classify
       uncorrect if they process mails with attachments... so I
       wrapped bounce-detection with a try-except and seperated them
       into  manage_bounceboxer.

     - Fixed security issue for manage_checkboxer:  Removed setting a
       flag in REQUEST, so no  untrusted code on your server can
       produce spam. Thanks to Leonardo Rochael Almeida  for pointing
       me to this problem.

     
 Version 2.2:
 
     - Added automatic bounce-detection (taken from Mailman; many
       thanks to the author Barry A. Warsaw!) &
       created management-interface for easy bounce-handling.
     
     - Introduced manage_requestboxer for own
       (un)subscribe-request-alias.
     
     - Introduced manage_frameboxer to setup a traditional
       mailinglist which differents between subscribe-requests and
       mails.

     - Introducted manage_checkboxer as replacement for securityCheck.
       You can use this for setting up a bounce-alias, too.

     - Introduced manage_addMember / manage_delMember as API to
       manipulate the mailinglist.
                   
     - Modified sniplist to give you better snipped threads. 
     
     - Archived mails will always get the current time of the server
       => No more "long-ago"-mails in the archive, because clients
       don't turn their clocks...

     - Modified MailBoxerTemplates/mail_reply: Now the sender will see
       the submitted email-address.
       
     - Fixed bug in MailBoxerTemplates/mail_header: 'content_type' 
       is not always present in calculated mail-headers, so we should
       provide a default.
       
     - Fixed security-issues with some public methods (esp. pin).
       Most methods are no more more callable TTW now.

     - Some speedups and code cleanups.


 Version 2.1.5:
 
     - In compliance to RFC 2822, unchanged headers of the bulked mail
       will not be reordered anymore; blank custom headers will be removed
       from bulked mails.
     
     - Changed calculation of pin-hash: now only the lower-cased email-adress
       will be hashed. You can use pin() to create "web-based"-subscriptions.
       
     - Introduced new hooks for custom workflows: MailBoxer looks now for
       two optional PythonScripts with ids 'mail_in_members' 
       and 'mail_out_members'.
       
       'mail_in_members' should return a list of email-adresses, which should
       have the right to mail into MailBoxer.
       
       'mail_out_members' should return a list of email-adresses, which should
       receive all emails from MailBoxer.
      
     - Cleaned up some whitespace.
     
       
 Version 2.1.4:
 
	 - added a wrapper for mime_decode_header, so subject-comparisions off
	   list title in dtml-methods won't fail on wired encoded headers.
	   
	   
 Version 2.1.3:
 
	 - new feature 'plainmail': if set, only the plain-text of a mail
	   [no html or attachments] will be forwarded to the mailinglist.
	   No more complaints about HTML-Mails or an attached virus!

	 - now mail_header & mail_footer will be called in the context
	   of the archived mail. You can now use <dtml-var absolute_url>
	   to create a link to the archived thread in the mail_footer for example.

	 - mail_header is now evaluated as "if it is a mail". If mail_header
	   has a body, this body will used for generating the new mailBody. 
	   This might be useful if you want to create highly customized mails.
	   
	 - bug fix: now the plain-text of a mail will be stored as default
	   for the archive regardless if the input is text or html.

	 - now the whole mail is logged to the ErrorLog if spam is detected.
	 

 Version 2.1.2:

	 - changed parsing of mail_header.dtml: now I use mimetools for parsing.
	   Outgoing mails should be as good [or bad...] encoded as incoming mails.
	 
 	 - changed comparision for mail-threads: uses now difflib. Mails with slightly
	   changed subjects (encoding proplems etc.) should be threaded correct now.
	 
	 - fixed bug: mails without subjects weren't relayed. Please have a look at the
	   subject-line of mail_header!


 Version 2.1.1: 

	 - bug fixes: now mail-headers with newlines [esp. subjects]
	   will be handled without errors; fixed a problem with
	   some wired subject-encodings.
	   
	 - some minor cleanups


 Version 2.1:

	 - added (un)subscription-verification: now a mail is sent to the
	   sender with a randomized md5-based-key in order to check the
	   (un)subscription-request.

	 - changed 'mail_moderator': the sender will now receive a feedback, 
	   when he posts to a moderated list.

	 - general bug fix: now (un)subscription-requests will be 
	   case-insensitive; a check for '.*:' ('Re:') in 
	   "(un)subscribe"-regular-expressions is done by default.

	 - bug fix in smtp2zope.py: now an exception is raised for mails >
	   maxBytes, so the sender receives a feedback [could be done better,
	   but for me it's good enough]

	 - removed self-constructed object-id from catalog_object.

	 - cleaned up the code...

	
 Version 2.0:

	- New architecture of the mail-archive: year/month/mail/threads.

	- Improved navigation through the mail-archive. new features: automatic
	  snipping quotes & footers out of mails, show whole threads at once
	  etc.

	- Archived mails will now be cataloged. Added a search-interface.

	- Improved handling of mail-headers.

	- Enabled several moderators.

	- Added a new handler (manage_listboxer) for open lists.

	- Defined hooks for custom workflows. Useful if you want to gateway
	  your mailing-list to a News-Server.

	- Integrated mail-decoding into MailBoxer.

	- Fixed a bug in securityCheck for VirtualHosts.

	- and much more I've forgotten to mention...;-)


 Version 1.3.1: 
 
	- *MailBoxer.py / manage_mailboxer*: Minor Bug fix: Under some
	   wired circumstances additional Re:'s were produced on replies in 
	   subjects of mails.

	- *smtp2zope.py*: Minor Bug fix: maxBytes was only int, now it is long. Now
	   you can set maxBytes higher than the int-range. Thanks to Marcus
	   Schopen.

	- *MailBoxerTemplates.py / mail_footer*: Added a space after the signature
	   startline -- . Thanks to Marcus Schopen for giving me this hint for
	   correct signatures.
	   
	- *MailBoxerTemplates.py* / index_html_zpt: Added a ZopePageTemplate for
	   viewing the archive. Thanks to Gitte Wange and Thomas Olsen for
	   translating my DTML to ZPT! Maybe I will learn ZPT someday...;-)


 Version 1.3:
 
	- *smtp2zope.py*: Now a copy of the raw-mail (besides all seperated
	   mail-parts) will be submitted to ZOPE. The raw-mail will be used for
	   the bulk mail => no more problems with en- & decoding, attachments,
	   signatures etc. Removed the no-attachment-option [-r].

	- *MailBoxer.py / manage_inboxer*: Enabled mail-threads for each day.
	   Replies will be stored as a mail-folder in the
	   Replied-To-mail-folder.

	- *MailBoxer.py / manage_mailboxer*: Mails are now sent directly
	   through the smtp-port => More control, more speed, more fun!
	
	- *MailBoxer.py / manage_mailboxer*: Improved error-logging.
	
	- *MailBoxerTemplates.py / mail_header*: Added an additional
	   method for mail-headers.

	- *MailBoxerTemplates.py / mail_footer*: Added an additional
	   mail-footer. This will usually only be visible for plain-text-mails.

	- *MailBoxerTemplatey.py / index_html*: Enabled threads. Replaced
	  '@' with '#', so no mail-robots will able to fetch mail-adresses
	  from your pages. Improved navigation. Cleaned up the code.
	  
	- *MailBoxer.py / previousObject - nextObject*: Added two methods for 
	  the improved navigation through the mail-archive. Maybe the behaviour
	  will change in future versions (diving up and down automatically in
	  subdirs and so on).

	- *MailBoxerTemplates.py / mail_bulk*: Removed mail_bulk, because mails
	   will now be sent directly through smtplib.
	   
	- *NMIMETools*: Removed NMIMETools-Package. No more need for it! YEAH!
	   

 V1.20527 - 2002-05-27:
 
	- *WindowsHowTo.txt*: Added a HowTo by Gandon Yves
	  <yves.gandon@chu-rennes.fr> describing installing MailBoxer
	  on Windows. Thank you, Gandon! I haven't tested it 
	  because I don't use & like Windows... and I'm really happy
	  about that...;-)

	- *smtp2zope.py*: Added the decoding of the plain mail-body.
	  => No more wired characters for "special characters" in mails
	  processed by MailBoxer and some "wired" mail-clients...
	  
	- *smtp2zope.py*: Filenames will now be submitted only with
	  'id-conform' characters to ZOPE. No more spaces and !?%"&(GRRRRR)
	  in filenames, no more problems...;-)

 	- *MailBoxerTemplates.py / mail_bulk*: The title of the list will
	  not be added on mail-replies anymore if it is already in
	  the subject-line.

	- *dtml/manage_addMailBoxerForm.dtml*: Added 'required' and 'optional'
	  to the explanations... Hopefully this clears some questions.	  

	- *dtml/manage_MailBoxerLog.dtml*: Some minor cosmetics for the log.


 V1.20422: 2002-04-22
 
	- *smtp2zope.py*: All headers (e.g. the "content-transfer-encoding")
	  will be submitted to ZOPE (it's no security problem as I thought).
	  You can use it with REQUEST['header']. Should solve some problems
	  with some wired characters. Thanks to Gitte Wange!


 V1.20410b: 2002-04-10
 
	- *MailBoxer.py / manage_inboxer:* Disabled the returning of the
	   new created mailobject because calling manage_inboxer from a 
	   mailalias didn't work.

 	- *MailBoxer.py / manage_mailboxer:* Changed the indention of the
	   return-statements in the (un)subscribe-conditions. So no
	   mail will go to the list if someone is already (un)subscribed.


 V1.20408b: 2002-04-08

	**ATTENTION: CURRENT MAILBOXER IS INCOMPATIBLE WITH 0.x RELEASES!
	PLEASE READ THE UPDATE.TXT IF YOU PLAN  TO UPGRADE!**

	- *MailBoxer.py / mailboxer - inboxer:* The methods 'mailboxer'
	  and 'inboxer' are replaced with 'manage_mailboxer' and
	  'manage_inboxer' for two reasons: 
	  
	   1 This clears some misunderstandings on how to configure
	     a mail-alias for MailBoxer.
	     
	   2 This can avoid caching problems if you run Zope behind a
	     reverse Proxy (directly fetch urls with 'manage.*') !

	- *MailBoxer.py / manage_mailboxer:* Restructered the condition checks.
	  Now a "error"-reply will be sent back to the sender if (s)he is not
	  subscribed or the list is moderated. Thanks to Gitte Wange!

	- *MailBoxer.py / manage_mailboxer:* Changed the encoding of the
	  mail-from-header. Use now rfc821.parseaddr. I will read the python
	  library-reference under my pillow before coding next time...;-)

	- *MailBoxer.py / manage_mailboxer:* Reworked the log-property to a
	  dictionary with keys 'mailDate', 'mailStatus', 'mailSender' and
	  'mailSubject'. Changed the log messages.

	- *MailBoxer.py / manage_logboxer:* Added a log-handler. Can even be
	  called by your MTA if you want a mail-log-system.

	- *MailBoxer.py / securityCheck:* Added the property 'mtahosts'. Now
	  the IP's in 'mtahosts'-list will be checked. If no host is given in
	  'mtahosts', no security check is done! Added a simple
	  stupid-log-file-entry for diagnostics purposes.

	- *MailBoxer.py / manage_inboxer:* Now it returns the new created
	  mail-folder-object. Can be useful for your own applications.

	- *MailBoxer.py / manage_MailBoxerLog:* Renamed 'logView' to
	  'manage_MailBoxerLog' to avoid proxy-caching-problems.

	- *MailBoxerTemplates.py / mail_reply:* Added a method for replying
	  mails to senders which will not processed through the list (unkown
	  sender or moderated list).

	- *MailBoxerTemplates.py / mail_*: The variables 'subject', 'from',
	  'body' will now be submitted as parameters with prefix 'mail'.
	  Attachements will be taken directly from REQUEST. This avoids
	  overwriting variables through aquisition. Thanks to Gitte Wange!

	- *dtml / manage_addMailBoxerForm:* Added the field MTA-Hosts; added
	  some more Zope-CSStyles.

	- *dtml / manage_MailBoxerLog.dtml:* Now the number of subscribed
	  members will be listed in the status line. List of logs is now
	  html_quoted.

	  
 V0.20325:  2002-03-25

	- *Included NMIMETools:* All attachments can now be attached to one
	  single mail.

	- *MailBoxerTemplates.py / mail_bulk:* Now all attachments will
	  be included in the mail (see above).		

	- *dtml / manage_MailBoxerLog.dtml:* Added the 'list-item'-styles to
	  the table-cells so the look of the log will be more zopish.

	- *MailBoxer.py / mailboxer:* Now regular expressions for subscription
	  / unsubscription will be evaluated. This is useful if you want to
	  have subscription on mail-replies (RE: subscribe etc.)

	- *MailBoxerTemplates.py / mail_bulk:* Now the maillist will be
	  inserted as Bcc's. So only one mail will be submitted to the MTA (see
	  below).

	- *MailBoxer.py / mailboxer:* Changed the bulk mailing with Bcc's. This
	  will result in less overhead between Zope & the MTA (see above). 

	- *MailBoxer.py / mailboxer:* Changed log-report-messages


 V0.20316:  2002-03-16

	- *MailBoxerTemplate.py / mail_bulk:* added 'Precedence: Bulk' for the
	  attachment-part (simply forgot it in the last release...)

	- *MailBoxer.py / manage_addMailBoxer:* The IP of the Mailserver can
	  now be set when a MailBoxer is created

	- *smtp2zopy.py:* Headers will now be unmimifed

	- *MailBoxer.py / mailboxer:* The spamlist will now evaluate regular
	  expressions.

	- *MailBoxer.py / mailboxer:* The maillist will be sorted on new
	  subscriptions


 V0.20306:  2002-03-06

	- *MailBoxer.py / mailboxer:* Now all addresses will  be compared in
	  lowercase, so that matching problems with some clients like Outlook
	  will be avoided. Addresses will be stored & send in the "real" case
	  anyway to avoid problems with some web-mailers. Thanks to Hans-Dieter
	  Stich! Exception is the spamlist. Put all the spammers in
	  lowercase!!!

	- *smtp2zope.py:* added an option -r => only r(aw) mail-texts without
	  attachments will be submitted to ZOPE, if this option is set.

	- *MailBoxerTemplate.py / index_html*: put pre-tags around the 
	  mail-body in the index_html, so that pretty mailfooters with
	  ascii-art will be displayed correctly.

	- *MailBoxerTemplate.py / mail_bulk*: added a 'Precedence: Bulk' to the
	  mail_bulk-method, so that mailers won't send automatic
	  'vacation'-mails back to the list. Thanks to Hans-Dieter
	  Stich!	  


 V0.20212:  2002-02-12

        - First public release of MailBoxer
