| AbracadabraObject-2.0.3 | PropertyTools-2.1.0 | MailBoxer-3.3.9 | Epoz-2.0.2 | OrderedObjectManager-1.5.4 | NMimeTools-1.0 | HTMLDocument-1.0.3 | iungoCMS |
MailBoxer [3486 downloads]Download current release: MailBoxer-3.3.9.tar.gz (Released: 2008/05/30) [ Show older releases ] |
Bug reports: maik (dot) jablonski (at) gmail (dot) com |
|
MailBoxer - a mailinglist/newsletter/mailarchive-toolbox for ZOPE Please note: If you plan to upgrade MailBoxer, read the CHANGES.txt and UPDATE.txt before installing MailBoxer. What is a MailBoxer?MailBoxer is a lightweight ZOPE-Product to run mailinglists, newsletters and mailarchives. Its main idea is to give you an extensible framework for building mailinglist-based applications with the power of ZOPE. Out of the box it provides a full featured mailinglist/newsletter/mailarchiving-framework. Features
What do I have to do to use a MailBoxer?Package-RequirementsMailBoxer requires Python 2.2.3 or higher. If you want transactional mail-bulking (read-/write-conflicts in the ZODB can result in rare doubled mails, so people will complain about useless traffic etc.pp.), please install the very nice MaildropHost from Jens Vagelpohl (http://www.dataflake.org/software/maildrophost). MaildropHost uses a seperate worker thread to send out the mails only when the ZODB-transaction was completed successfully. The setup for MaildropHost is easy, please read the README.txt & INSTALL.txt in the MaildropHost-Package. MailBoxer will use MaildropHost per default when it is installed. If you upgrade from previous versions of MailBoxer, please be sure to recreate the MailHost-object(s) used by MailBoxer as MaildropHost(s), so MailBoxer can use the transactional features of MaildropHost. As an alternative to MaildropHost, you can use the SecureMailHost from Christian Heimes (http://sf.net/projects/collective/). Please note: SecureMailHost should work with MailBoxer, but I cannot support any occuring problems with this setup, because I don't use SecureMailHost at all. SetupYou need python-script-access on a mail-server to work with MailBoxer. This is generally no problem for nix-users, but maybe one for Windows-users. The following description is nix-specific. If you want to use a MailBoxer, you must first install the gateway-script
foo: "|smtp2zope.py http://ZopeServer:Port/PathTo/IdOfMailBoxer/manage_mailboxer [maxBytes]" PLEASE NOTE: The last element of the URL should be If you only want to use MailBoxer as a mailarchiving-system for
your own mails, you can replace If you want to run an open list (everyone can post to the list, but only
subscribed members will receive the mail), simply check the
unclosed-property of a mailing-list. Another solution is to set up an alias
with If you want to setup bounce-detection, you have to set an alias pointing to the returnpath of the mailinglist (see below): returnpath: "|smtpzope.py http://.../manage_bounceboxer". After adding a MailBoxer (see below) you can send all your messages to
For example: To subscribe to the list send a mail with the subject (not the
body) Here is a configuration exampletestlist: "|smtp2zope.py http://127.0.0.1:8080/discussions/testlist/manage_mailboxer 20000" => Listname mjablonski: "|smtp2zope.py http://www.zfl.uni-bielefeld.de:8888/mjablonski/mailbox/manage_inboxer" => This is an example for storing my personal mail within ZOPE. Id of
MailBoxer = secured: "|smtp2zope.py http://user:passwd@localhost:8080/secured/manage_mailboxer" => Use something like this if you want to create a protected MailBoxer. Please check Security-Tab of MailBoxer and disable "View"-Permission for Anonymous. You can also set the authorization in smtp2zope.py directly. How do I add a MailBoxer?You need the "Add MailHosts"-Permission in order to add a MailBoxer:
What means all the DTML in a MailBoxer?After your MailBoxer is created, you can enter the MailBoxer-Folder. You will find there several DTML-Methods. You can change them for your needs:
If you want to use PageTemplates, you can include the archive-DTML's with something like:
How can I (re-)configure a MailBoxer?You can (re-)configure your MailBoxer with the properties of the MailBoxer-Folder. mailto - Set this to the email-address of your mailinglist. This should
be something like: maillist - In disabled - All adresses who exceeded the sender-loop-limitation will be put here. They aren't allowed to mail to the list anymore, but will still receive the traffic. Useful to prevent misconfigured vacation mailers to kill your server. moderator - Enter email-addresses of list moderators. Only a moderator
has the right to send emails to the list if returnpath - This will be used as returnpath for bouncing emails. moderated - If you enable this, only the moderator has the right to send
mails to all the members of the list. You can use this feature for
unclosed - If you check this, everyone (no need to be subscribed) is allowed to mail into the list. plainmail - If you enable this, all mails to the list will be converted to plain-text and all attachments will be stripped of. This is very useful, if you hate HTML-Mails and all kind of useless attachments.. keepdate - If you enable this, all original mail-dates will be kept for the archive. This is only useful if you import existing mail-archives. includesender - If you enable this, the sender of the email receives a copy, regardless if he/she is subscribed to the list. relocate - If you want to relocate a mail, so the real recipient is addressed in the To-Field, check this property. Please note: use this feature only if MaildropHost is installed, because a batch-size of one is used. storage - A traverseable path to the archive-folder. You can use it to rename / localize the "archive" to something like "mailarchive" etc. archived - If you enable this, all mails to the list will be stored in the MailBoxer in date-folder-hierarchies with or without attachemnts. subscribe - Set this to the unsubscribe - Set this to the mtahosts - Here you can enter a space seperated list of IP's of hosts
which are allowed to gateway mails to your list. If you leave this empty, no
security checks will be taken. In order to avoid spamlist - If you want to disclose some addresses from subscribing / mailing to your list, put them here. You can use regular expressions as well to exclude whole domains etc. You can even give some taboo-words to get rid of XXX-advertising-mails and so on. atmask - This string will replace all @ in your mails when viewing mails in the archive. sniplist - Here you can define regular expressions for snipping mails. catalog - Traversable path to the Catalog for indexing mails. xmailer - In order to avoid endless mail-loops, MailBoxer must send an unique identifier in the header of the mail. Leave this untouched, if you don't know what to do. headers - If you enter a regular expression, all matching headers will
be stored in an additional mailHeader-property. For example: If you want
to store the message-id and the original date of the mail, use something
like (without quotes): batchsize - MailBoxer transfers usually only one mail to the smtp-server for all the recipients. The smtp-server is doing all the work (batchsize = 0). If you encounter problems with this configuration (esp. using large lists with more than 500 subscribers), you can set batchsize to a positive integer x, which means, that MailBoxer will deliver chunks of x mails at once. Example: If you set batchsize=50, a mail with 50 recipients is transfered to the smtp-server at once, then the next 50 recipients and so on until no more recipients are left. senderlimit - the number of mails a member is allowed to send in the time-interval determined by senderinterval. senderinterval - the number of seconds for the sender-loop-limitation. Something like 10 Mails (senderlimit) in 600 seconds (senderinterval) is a good starting point (no real person should write more than 10 mails in 10 minutes, I guess...) hashkey - This string is used to generate a encrypted key for subscriptions & unsubscriptions. Usually there is no need to change it. mailqueue - traversable path to a storage for queued mails waiting for approvals by a moderator. getter - Hook for application developers (see below). If you enter a traversable PythonScript, this will determine the property of the MailBoxers dynamically. setter - Opposite of the getter, see below. Some hints for application-developers MailBoxer is a subclass of the folder-class. So you can apply all the methods
for a regular folder, e.g. you can change the properties of your MailBoxer
with MailBoxer provides some hooks for application developers. Please have a look at the source to understand the MailBoxer-chain-reaction. In short:
Known Bugs
Where do I send questions, comments or bug reports?Please send all questions regarding MailBoxer to: maik.jablonski@uni-bielefeld.de |
CHANGESChanges3.3.9 - Fixed problem with mail-queue-id. Under rare circumstances in combination with a non-transactional MailHost there was a slight chance for non-unique mail-queue-id generated from sequence. mail-queue-id is randomized now. 3.3.8 - small code improvement in smtp2zope.py: use tempfile.gettempdir() instead of the complicated expression used before. Thanks to David Turner for patch. 3.3.7 - added new config-property: relocate. If this property is set, every mail (To-Field) is relocated to the real recipient instead of the maillist-address. This is useful for newsletters which needs to seem absolutely personalized. 3.3.6 - added SPAM-TAG-Regexp-Filter to smtp2zope.py so tagged spam will be discarded already at gateway. It is configured per default with [SPAM] and [VIRUS] to give you an example of appropriate quoting in regexps. Configure it in smtp2zope.py. - minimized critical section in smtp2zope.py where locks are held. - fixed bug: logging was broken. Tried to import syslog1 instead of syslog in smtp2zope.py 3.3.5 - fixed bug: included sender wasn't compared as lower case, so doubled mails for senders could be sent under rare circumstances. 3.3.4 - fixed bug: If includesender was set, the sender was appended directly to the final maillist, not to the outgoing memberlist which gets scanned for doubles etc. 3.3.3 - added new config-property: includesender. If this property is set, every sender receives a copy of the mail regardless if he/she is subscribed to the list. - added additional MailHost-check for isTransactional in listMail, so derived MaildropHost-implementations should work with MailBoxer without patches. Thanks to Robert Rottermann! - fixed bug in catalogMailBoxerMail: If catalog was None, the unrestrictedTraverse(catalog) was self-referencing the MailBoxer- Instance. Thanks to Robert Rottermann from Redcor.ch for patch! 3.3.2 - added support for Christian Heimes SecureMailHost (http://sf.net/projects/collective/) as a second transactional MailHost-Implementation. Thanks to Uli Fouquet for initial patch!!! Please note: I don't use SecureMailHost on my own, so please don't ask me for help with SecureMailHost. I will only help you with MaildropHost from Jens Vagelpohl as the one-and-only-official transactional MailHost-implemenation for MailBoxer. - refactored all generic mail-parsing-tools to MailBoxerTools.py, so it is easier to write tests and additional filters for smtp2zope.py etc. - replaced private _unpackMultifile with public unpackMail. Moved attachment-archiving from _unpackMultifile to manage_addMail. - unified import for MailBoxerTemplates according to other MailBoxer*-imports. - fixed bug: smtp2zope.py didn't support https. Removed useless check for url-protocol. Thanks to Uli Fouquet for initial patch!!! Made some additional fixes, cleanups and refactorings of smtp2zope.py. - added a getMailParameterName() to MailBoxer as wrapper for the parameter-name of the Mail-object in the REQUEST. Version 3.3.1 - added wrapper for rfc822.AddressList() as parseaddrList. I needed a address-list parser for dynamic mailinglists depending on the TO-or-CC. Maybe someone will need this too. - added method for getting plain body from a mail (getPlainBodyFromMail) to make the moderator-approval view a little bit more intuitive for the average user (dugh, mail sources are ugly for joe user). - fixed bug: added missing html_quote for mail to mail_approval. Version 3.3: - added support for Jens Vagelpohls MaildropHost (http://www.dataflake.org/software/maildrophost), so MailBoxer works transactional (no more doubled mails due to read-/write-zodb-conflicts). Using MaildropHost is the RECOMMENDED setup for MailBoxer from now on!!! Thanks to Jens for a really great product, which should be the default MailHost-Product in Zope! - added a customizable view (mail_approve) with pending requests for moderation. Please use this template instead of the old plain-text messages. If no template is found, MailBoxer falls back to the old plain-texts. I'll drop this fall-back behaviour in one of the next releases. - added a unique id for queued messages, so a accidentially page-reload won't approve / discard a newly arrived mail. - added a unique message-id for each mail which is bulked to the list, so problems under some setups with cross-posts to several lists should be gone. Thanks to Christian Theune and his inital "5-minute-hacked-patch", which needed some improvements. Hope you like it this way, Christian...;) - fixed bug: if the url given to the smtp2zope.py is not found (404) (maybe some typo in the alias-file), the mail is bounced with "user-doesn't-exist" and not(!) queued by the MTA anymore for a next retry. Thanks to Christian Theune for patch! - fixed bug: the mail-bulk-code was protected with a "historical" try-except, which could result in loss of emails when something went wrong while talking to the smtp-server. - fixed bug: the smtp-connection is now closed / reopened after each batch, so MTAs which only accept a limited number of mails per connection won't defer your mails anymore. - fixed bug: under some wired circumstances the Mail in the REQUEST wasn't marshalled as string by Zope, so string-operations were broken on the mail-data. Added a getMailFromRequest()-method which does the string-conversion, so we always have a string. Thanks to Dirk Datzert for tracking this down! - fixed bug: searchMailBoxerArchive() used unrestrictedTraverse for traversing the Catalog. Changed to restrictedTraverse. - some minor refactorings & code-cleanups. |
|