diff options
Diffstat (limited to 'Mailman')
-rw-r--r-- | Mailman/Defaults.py.in | 198 | ||||
-rw-r--r-- | Mailman/Gui/NonDigest.py | 36 | ||||
-rw-r--r-- | Mailman/Handlers/SMTPDirect.py | 24 | ||||
-rw-r--r-- | Mailman/Queue/Switchboard.py | 6 |
4 files changed, 151 insertions, 113 deletions
diff --git a/Mailman/Defaults.py.in b/Mailman/Defaults.py.in index 613cd7ce..819a9062 100644 --- a/Mailman/Defaults.py.in +++ b/Mailman/Defaults.py.in @@ -31,6 +31,16 @@ def minutes(m): return m * 60 def hours(h): return h * 60 * 60 def days(d): return d * 60 * 60 * 24 +# Some convenient constants +try: + True, False +except NameError: + True = 1 + False = 0 + +Yes = yes = On = on = True +No = no = Off = off = False + ##### @@ -91,8 +101,8 @@ MAILMAN_SITE_LIST = 'mailman' # makes me nervous to hand out site auth cookies because if this cookie is # cracked or intercepted, the intruder will have access to every list on the # site. OTOH, it's dang handy to not have to re-authenticate to every list on -# the site. Set this value to 1 to allow site admin cookies. -ALLOW_SITE_ADMIN_COOKIES = 0 +# the site. Set this value to Yes to allow site admin cookies. +ALLOW_SITE_ADMIN_COOKIES = No # Command that is used to convert text/html parts into plain text. This # should output results to standard output. %(filename)s will contain the @@ -112,12 +122,12 @@ HTML_TO_PLAIN_TEXT_COMMAND = '/usr/bin/lynx -dump %(filename)s' # DEFAULT_HOST_NAME. VIRTUAL_HOSTS = {} -# When set, the listinfo and admin overviews of lists on the machine will be -# confined to only those lists whose web_page_url configuration option host is -# included within the URL by which the page is visited - only those "on the -# virtual host". If unset, then all advertised (i.e. public) lists are -# included in the overview. -VIRTUAL_HOST_OVERVIEW = 1 +# When set to Yes, the listinfo and admin overviews of lists on the machine +# will be confined to only those lists whose web_page_url configuration option +# host is included within the URL by which the page is visited - only those +# "on the virtual host". When set to No, all advertised (i.e. public) lists +# are included in the overview. +VIRTUAL_HOST_OVERVIEW = On # Helper function; use this in your mm_cfg.py files. If optional emailhost is @@ -194,10 +204,11 @@ WEB_HIGHLIGHT_COLOR = '#dddddd' # If true, alternating rows PUBLIC_ARCHIVE_URL = 'http://%(hostname)s/pipermail/%(listname)s' # Are archives on or off by default? -DEFAULT_ARCHIVE = 1 # 0=Off, 1=On +DEFAULT_ARCHIVE = On # Are archives public or private by default? -DEFAULT_ARCHIVE_PRIVATE = 0 # 0=public, 1=private +# 0=public, 1=private +DEFAULT_ARCHIVE_PRIVATE = 0 # ARCHIVE_TO_MBOX #-1 - do not do any archiving @@ -207,7 +218,6 @@ DEFAULT_ARCHIVE_PRIVATE = 0 # 0=public, 1=private # use this to make both external archiving mechanism work and # mailman's builtin html archiving. the flat mail file can be # useful for searching, external archivers, etc. -# ARCHIVE_TO_MBOX = 2 # 0 - yearly @@ -221,16 +231,17 @@ DEFAULT_DIGEST_VOLUME_FREQUENCY = 1 # These variables control the use of an external archiver. Normally if # archiving is turned on (see ARCHIVE_TO_MBOX above and the list's archive* # attributes) the internal Pipermail archiver is used. This is the default if -# both of these variables are set to false. When either is set, the value -# should be a shell command string which will get passed to os.popen(). This -# string can contain %(listname)s for dictionary interpolation. The name of -# the list being archived will be substituted for this. +# both of these variables are set to No. When either is set, the value should +# be a shell command string which will get passed to os.popen(). This string +# can contain %(listname)s for dictionary interpolation. The name of the list +# being archived will be substituted for this. Please note that os.popen() is +# used. # # Note that if you set one of these variables, you should set both of them # (they can be the same string). This will mean your external archiver will # be used regardless of whether public or private archives are selected. -PUBLIC_EXTERNAL_ARCHIVER = 0 -PRIVATE_EXTERNAL_ARCHIVER = 0 +PUBLIC_EXTERNAL_ARCHIVER = No +PRIVATE_EXTERNAL_ARCHIVER = No # A filter module that converts from multipart messages to "flat" messages # (i.e. containing a single payload). This is required for Pipermail, and you @@ -272,11 +283,11 @@ ARCHIVE_SCRUBBER = 'Mailman.Handlers.Scrubber' # program. ARCHIVE_HTML_SANITIZER = 1 -# Set this to 1 to enable gzipping of the downloadable archive .txt file. +# Set this to Yes to enable gzipping of the downloadable archive .txt file. # Note that this is /extremely/ inefficient, so an alternative is to just # collect the messages in the associated .txt file and run a cron job every # night to generate the txt.gz file. See cron/nightly_gzip for details. -GZIP_ARCHIVE_TXT_FILES = 0 +GZIP_ARCHIVE_TXT_FILES = No # This sets the default `clobber date' policy for the archiver. When a # message is to be archived either by Pipermail or an external archiver, @@ -291,10 +302,10 @@ ARCHIVER_CLOBBER_DATE_POLICY = 2 ARCHIVER_ALLOWABLE_SANE_DATE_SKEW = days(15) # Pipermail archives contain the raw email addresses of the posting authors. -# Some view this as a goldmine for spam harvesters. Set this to true to +# Some view this as a goldmine for spam harvesters. Set this to Yes to # moderately obscure email addresses, but note that this breaks mailto: URLs # in the archives too. -ARCHIVER_OBSCURES_EMAILADDRS = 1 +ARCHIVER_OBSCURES_EMAILADDRS = Yes # Pipermail assumes that messages bodies contain US-ASCII text. # Change this option to define a different character set to be used as @@ -569,15 +580,15 @@ VERP_FORMAT = '%(bounces)s+%(mailbox)s=%(host)s' VERP_REGEXP = r'^(?P<bounces>[^+]+?)\+(?P<mailbox>[^=]+)=(?P<host>[^@]+)@.*$' # A perfect opportunity for doing VERP is the password reminders, which are -# already addressed individually to each recipient. This flag, if true, -# enables VERPs on all password reminders. -VERP_PASSWORD_REMINDERS = 0 +# already addressed individually to each recipient. Set this to Yes to enable +# VERPs on all password reminders. +VERP_PASSWORD_REMINDERS = No # Another good opportunity is when regular delivery is personalized. Here # again, we're already incurring the performance hit for addressing each -# individual recipient. Set this to true to enable VERPs on all personalized +# individual recipient. Set this to Yes to enable VERPs on all personalized # regular deliveries (personalized digests aren't supported yet). -VERP_PERSONALIZED_DELIVERIES = 0 +VERP_PERSONALIZED_DELIVERIES = No # And finally, we can VERP normal, non-personalized deliveries. However, # because it can be a significant performance hit, we allow you to decide how @@ -600,8 +611,8 @@ VERP_CONFIRM_FORMAT = '%(addr)s+%(cookie)s' # VERP_CONFIRM_FORMAT. VERP_CONFIRM_REGEXP = r'^(?P<addr>[^+]+?)\+(?P<cookie>[^@]+)@.*$' -# Set this to true to enable VERP-like (more user friendly) confirmations -VERP_CONFIRMATIONS = 0 +# Set this to Yes to enable VERP-like (more user friendly) confirmations +VERP_CONFIRMATIONS = No # This is the maximum number of automatic responses sent to an address because # of -request messages or posting hold messages. This limit prevents response @@ -637,15 +648,17 @@ QRUNNERS = [ ('VirginRunner', 1), # internally crafted (virgin birth) messages ] -# Set this to true to use the `Maildir' delivery option. If you change this +# Set this to Yes to use the `Maildir' delivery option. If you change this # you will need to re-run bin/genaliases for MTAs that don't use list -# auto-detection. Also, the line after USE_MAILDIR to your mm_cfg.py file. +# auto-detection. # # WARNING: If you want to use Maildir delivery, you /must/ start Mailman's # qrunner as root, or you will get permission problems. # # NOTE: Maildir delivery is experimental for Mailman 2.1. -USE_MAILDIR = 0 +USE_MAILDIR = No +# NOTE: If you set USE_MAILDIR = Yes, add the following line to your mm_cfg.py +# file (uncommented of course!) # QRUNNERS.append(('MaildirRunner', 1)) # After processing every file in the qrunner's slice, how long should the @@ -657,9 +670,9 @@ QRUNNER_SLEEP_TIME = seconds(1) # When a message that is unparsable (by the email package) is received, what # should we do with it? The most common cause of unparsable messages is # broken MIME encapsulation, and the most common cause of that is viruses like -# Nimda. Set this variable to 0 to discard such messages, or to 1 to store +# Nimda. Set this variable to No to discard such messages, or to Yes to store # them in qfiles/bad subdirectory. -QRUNNER_SAVE_BAD_MESSAGES = 1 +QRUNNER_SAVE_BAD_MESSAGES = Yes @@ -673,18 +686,18 @@ QRUNNER_SAVE_BAD_MESSAGES = 1 DEFAULT_SERVER_LANGUAGE = 'en' # When allowing only members to post to a mailing list, how is the sender of -# the message determined? If this variable is set to 1, then first the +# the message determined? If this variable is set to Yes, then first the # message's envelope sender is used, with a fallback to the sender if there is -# no envelope sender. Set this variable to 0 to always use the sender. +# no envelope sender. Set this variable to No to always use the sender. # # The envelope sender is set by the SMTP delivery and is thus less easily # spoofed than the sender, which is typically just taken from the From: header # and thus easily spoofed by the end-user. However, sometimes the envelope # sender isn't set correctly and this will manifest itself by postings being # held for approval even if they appear to come from a list member. If you -# are having this problem, set this variable to 0, but understand that some +# are having this problem, set this variable to No, but understand that some # spoofed messages may get through. -USE_ENVELOPE_SENDER = 0 +USE_ENVELOPE_SENDER = No # Membership tests for posting purposes are usually performed by looking at a # set of headers, passing the test if any of their values match a member of @@ -702,24 +715,24 @@ DEFAULT_ADMIN_MEMBER_CHUNKSIZE = 30 # size (though this will slow down rendering those pages). ADMINDB_PAGE_TEXT_LIMIT = 4096 -# Set this variable to 1 to allow list owners to delete their own mailing +# Set this variable to Yes to allow list owners to delete their own mailing # lists. You may not want to give them this power, in which case, setting -# this variable to 0 instead requires list removal to be done by the site +# this variable to No instead requires list removal to be done by the site # administrator, via the command line script bin/rmlist. -OWNERS_CAN_DELETE_THEIR_OWN_LISTS = 0 +OWNERS_CAN_DELETE_THEIR_OWN_LISTS = No -# Set this variable to 1 to allow list owners to set the "personalized" flags -# on their mailing lists. Turning these on tells Mailman to send separate -# email messages to each user instead of batching them together for delivery -# to the MTA. This gives each member a more personalized message, but can -# have a heavy impact on the performance of your system. -OWNERS_CAN_ENABLE_PERSONALIZATION = 0 +# Set this variable to Yes to allow list owners to set the "personalized" +# flags on their mailing lists. Turning these on tells Mailman to send +# separate email messages to each user instead of batching them together for +# delivery to the MTA. This gives each member a more personalized message, +# but can have a heavy impact on the performance of your system. +OWNERS_CAN_ENABLE_PERSONALIZATION = No # Should held messages be saved on disk as Python pickles or as plain text? # The former is more efficient since we don't need to go through the # parse/generate roundtrip each time, but the latter might be preferred if you # want to edit the held message on disk. -HOLD_MESSAGES_AS_PICKLES = 1 +HOLD_MESSAGES_AS_PICKLES = Yes # These define the available types of external message metadata formats, and # the one to use by default. MARSHAL format uses Python's built-in marshal @@ -757,13 +770,15 @@ DEFAULT_NEW_MEMBER_OPTIONS = 256 ##### -# List defaults +# List defaults. NOTE: Changing these values does NOT change the +# configuration of an existing list. It only defines the default for new +# lists you subsequently create. ##### # Should a list, by default be advertised? What is the default maximum number # of explicit recipients allowed? What is the default maximum message size # allowed? -DEFAULT_LIST_ADVERTISED = 1 +DEFAULT_LIST_ADVERTISED = Yes DEFAULT_MAX_NUM_RECIPIENTS = 10 DEFAULT_MAX_MESSAGE_SIZE = 40 # KB @@ -782,17 +797,17 @@ DEFAULT_MAIL_COMMANDS_MAX_LINES = 25 # Is the list owner notified of admin requests immediately by mail, as well as # by daily pending-request reminder? -DEFAULT_ADMIN_IMMED_NOTIFY = 1 +DEFAULT_ADMIN_IMMED_NOTIFY = Yes # Is the list owner notified of subscribes/unsubscribes? -DEFAULT_ADMIN_NOTIFY_MCHANGES = 0 +DEFAULT_ADMIN_NOTIFY_MCHANGES = No # Should list members, by default, have their posts be moderated? -DEFAULT_DEFAULT_MEMBER_MODERATION = 0 +DEFAULT_DEFAULT_MEMBER_MODERATION = No # Should non-member posts which are auto-discarded also be forwarded to the # moderators? -DEFAULT_FORWARD_AUTO_DISCARDS = 1 +DEFAULT_FORWARD_AUTO_DISCARDS = Yes # What shold happen to non-member posts which are do not match explicit # non-member actions? @@ -804,31 +819,30 @@ DEFAULT_GENERIC_NONMEMBER_ACTION = 1 # Bounce if 'To:', 'Cc:', or 'Resent-To:' fields don't explicitly name list? # This is an anti-spam measure -DEFAULT_REQUIRE_EXPLICIT_DESTINATION = 1 +DEFAULT_REQUIRE_EXPLICIT_DESTINATION = Yes # Alternate names acceptable as explicit destinations for this list. DEFAULT_ACCEPTABLE_ALIASES =""" """ # For mailing lists that have only other mailing lists for members: -DEFAULT_UMBRELLA_LIST = 0 +DEFAULT_UMBRELLA_LIST = No # For umbrella lists, the suffix for the account part of address for # administrative notices (subscription confirmations, password reminders): DEFAULT_UMBRELLA_MEMBER_ADMIN_SUFFIX = "-owner" # This variable controls whether monthly password reminders are sent. -DEFAULT_SEND_REMINDERS = 1 +DEFAULT_SEND_REMINDERS = Yes -# Send welcome messages to new users? Probably should keep this set to 1. -DEFAULT_SEND_WELCOME_MSG = 1 +# Send welcome messages to new users? +DEFAULT_SEND_WELCOME_MSG = Yes -# Send goodbye messages to unsubscribed members? Probably should keep this -# set to 1. -DEFAULT_SEND_GOODBYE_MSG = 1 +# Send goodbye messages to unsubscribed members? +DEFAULT_SEND_GOODBYE_MSG = Yes # Wipe sender information, and make it look like the list-admin # address sends all messages -DEFAULT_ANONYMOUS_LIST = 0 +DEFAULT_ANONYMOUS_LIST = No # {header-name: regexp} spam filtering - we include some for example sake. DEFAULT_BOUNCE_MATCHING_HEADERS = """ @@ -850,9 +864,8 @@ from: .*@uplinkpro.com DEFAULT_REPLY_GOES_TO_LIST = 0 # Mailman can be configured to strip any existing Reply-To: header, or simply -# extend any existing Reply-To: with one based on the above setting. This is -# a boolean variable. -DEFAULT_FIRST_STRIP_REPLY_TO = 0 +# extend any existing Reply-To: with one based on the above setting. +DEFAULT_FIRST_STRIP_REPLY_TO = No # SUBSCRIBE POLICY # 0 - open list (only when ALLOW_OPEN_SUBSCRIBE is set to 1) ** @@ -864,8 +877,8 @@ DEFAULT_FIRST_STRIP_REPLY_TO = 0 # subscribes (next variable) DEFAULT_SUBSCRIBE_POLICY = 1 -# does this site allow completely unchecked subscriptions? -ALLOW_OPEN_SUBSCRIBE = 0 +# Does this site allow completely unchecked subscriptions? +ALLOW_OPEN_SUBSCRIBE = No # The default policy for unsubscriptions. 0 (unmoderated unsubscribes) is # highly recommended! @@ -878,22 +891,22 @@ DEFAULT_PRIVATE_ROSTER = 1 # When exposing members, make them unrecognizable as email addrs, so # web-spiders can't pick up addrs for spam purposes. -DEFAULT_OBSCURE_ADDRESSES = 1 +DEFAULT_OBSCURE_ADDRESSES = Yes # RFC 2369 defines List-* headers which are added to every message sent # through to the mailing list membership. These are a very useful aid to end # users and should always be added. However, not all MUAs are compliant and # if a list's membership has many such users, they may clamor for these -# headers to be suppressed. By setting this variable to 1, list owners will -# be given the option to suppress these headers. By setting it to 0, list +# headers to be suppressed. By setting this variable to Yes, list owners will +# be given the option to suppress these headers. By setting it to No, list # owners will not be given the option to suppress these headers (although some # header suppression may still take place, i.e. for announce-only lists, or # lists with no archives). -ALLOW_RFC2369_OVERRIDES = 1 +ALLOW_RFC2369_OVERRIDES = Yes # Defaults for content filtering on mailing lists. DEFAULT_FILTER_CONTENT is # a flag which if set to true, turns on content filtering. -DEFAULT_FILTER_CONTENT = 0 +DEFAULT_FILTER_CONTENT = No # DEFAULT_FILTER_MIME_TYPES is a list of MIME types to be removed. This is a # list of strings of the format "maintype/subtype" or simply "maintype". @@ -908,7 +921,7 @@ DEFAULT_PASS_MIME_TYPES = ['multipart/mixed', # Whether text/html should be converted to text/plain after content filtering # is performed. Conversion is done according to HTML_TO_PLAIN_TEXT_COMMAND -DEFAULT_CONVERT_HTML_TO_PLAINTEXT = 1 +DEFAULT_CONVERT_HTML_TO_PLAINTEXT = Yes # Default action to take on filtered messages. # 0 = Discard, 1 = Reject, 2 = Forward, 3 = Preserve @@ -916,29 +929,29 @@ DEFAULT_FILTER_ACTION = 0 # Whether to allow list owners to preserve content filtered messages to a # special queue on the disk. -OWNERS_CAN_PRESERVE_FILTERED_MESSAGES = 1 +OWNERS_CAN_PRESERVE_FILTERED_MESSAGES = Yes # Check for administrivia in messages sent to the main list? -DEFAULT_ADMINISTRIVIA = 1 +DEFAULT_ADMINISTRIVIA = Yes ##### -# Digestification defaults +# Digestification defaults. Same caveat applies here as with list defaults. ##### # Will list be available in non-digested form? -DEFAULT_NONDIGESTABLE = 1 +DEFAULT_NONDIGESTABLE = Yes # Will list be available in digested form? -DEFAULT_DIGESTABLE = 1 +DEFAULT_DIGESTABLE = Yes DEFAULT_DIGEST_HEADER = "" DEFAULT_DIGEST_FOOTER = DEFAULT_MSG_FOOTER -DEFAULT_DIGEST_IS_DEFAULT = 0 -DEFAULT_MIME_IS_DEFAULT_DIGEST = 0 +DEFAULT_DIGEST_IS_DEFAULT = No +DEFAULT_MIME_IS_DEFAULT_DIGEST = No DEFAULT_DIGEST_SIZE_THRESHHOLD = 30 # KB -DEFAULT_DIGEST_SEND_PERIODIC = 1 +DEFAULT_DIGEST_SEND_PERIODIC = Yes # Headers which should be kept in both RFC 1153 (plain) and MIME digests. RFC # 1153 also specifies these headers in this exact order, so order matters. @@ -961,11 +974,11 @@ PLAIN_DIGEST_KEEP_HEADERS = [ ##### -# Bounce processing defaults +# Bounce processing defaults. Same caveat applies here as with list defaults. ##### # Should we do any bounced mail response at all? -DEFAULT_BOUNCE_PROCESSING = 1 +DEFAULT_BOUNCE_PROCESSING = Yes # Bounce processing works like this: when a bounce from a member is received, # we look up the `bounce info' for this member. If there is no bounce info, @@ -1008,14 +1021,14 @@ DEFAULT_BOUNCE_YOU_ARE_DISABLED_WARNINGS_INTERVAL = days(7) # Does the list owner get messages to the -bounces (and -admin) address that # failed to match by the bounce detector? -DEFAULT_BOUNCE_UNRECOGNIZED_GOES_TO_LIST_OWNER = 1 +DEFAULT_BOUNCE_UNRECOGNIZED_GOES_TO_LIST_OWNER = Yes # Notifications on bounce actions. The first specifies whether the list owner # should get a notification when a member is disabled due to bouncing, while # the second specifies whether the owner should get one when the member is # removed due to bouncing. -DEFAULT_BOUNCE_NOTIFY_OWNER_ON_DISABLE = 1 -DEFAULT_BOUNCE_NOTIFY_OWNER_ON_REMOVAL = 1 +DEFAULT_BOUNCE_NOTIFY_OWNER_ON_DISABLE = Yes +DEFAULT_BOUNCE_NOTIFY_OWNER_ON_REMOVAL = Yes @@ -1047,10 +1060,10 @@ DELIVERY_RETRY_WAIT = hours(1) # VARIABLES DEPENDING ON THE SIZE OF YOUR LISTS, THE PERFORMANCE OF YOUR # HARDWARE, NETWORK AND GENERAL MAIL HANDLING CAPABILITIES, ETC. -# Set this to true to turn on MailList object lock debugging messages, which +# Set this to On to turn on MailList object lock debugging messages, which # will be written to logs/locks. If you think you're having lock problems, or # just want to tune the locks for your system, turn on lock debugging. -LIST_LOCK_DEBUGGING = 0 +LIST_LOCK_DEBUGGING = Off # This variable specifies how long the lock will be retained for a specific # operation on a mailing list. Watch your logs/lock file and if you see a lot @@ -1065,11 +1078,11 @@ LIST_LOCK_LIFETIME = hours(5) # the message will be re-queued for later delivery. LIST_LOCK_TIMEOUT = seconds(10) -# Set this to true to turn on lock debugging messages for the pending requests +# Set this to On to turn on lock debugging messages for the pending requests # database, which will be written to logs/locks. If you think you're having # lock problems, or just want to tune the locks for your system, turn on lock # debugging. -PENDINGDB_LOCK_DEBUGGING = 0 +PENDINGDB_LOCK_DEBUGGING = Off # This variable specifies how long an attempt will be made to acquire a # pendingdb lock by the incoming qrunner process. If the lock acquisition @@ -1088,8 +1101,8 @@ PENDINGDB_LOCK_ATTEMPTS = 10 ##### # Nothing below here is user configurable. Most of these values are in this -# file for convenience. Don't change any of them or override any of them in -# your mm_cfg.py file! +# file for internal system convenience. Don't change any of them or override +# any of them in your mm_cfg.py file! ##### # These directories are used to find various important files in the Mailman @@ -1254,6 +1267,7 @@ add_language('ko', _('Korean'), 'euc-kr') add_language('lt', _('Lithuanian'), 'iso-8859-13') add_language('nl', _('Dutch'), 'iso-8859-1') add_language('no', _('Norwegian'), 'iso-8859-1') +add_language('pl', _('Polish'), 'iso-8859-2') add_language('pt', _('Portuguese'), 'iso-8859-1') add_language('pt_BR', _('Portuguese (Brazil)'), 'iso-8859-1') add_language('ru', _('Russian'), 'koi8-r') diff --git a/Mailman/Gui/NonDigest.py b/Mailman/Gui/NonDigest.py index 900f865f..b66c5c4f 100644 --- a/Mailman/Gui/NonDigest.py +++ b/Mailman/Gui/NonDigest.py @@ -1,17 +1,17 @@ -# Copyright (C) 2001,2002 by the Free Software Foundation, Inc. +# Copyright (C) 2001-2003 by the Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. -# +# # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -# +# # You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software +# along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. """GUI component for managing the non-digest delivery options. @@ -104,17 +104,35 @@ class NonDigest(GUIBase): # get a bogus warning if the header/footer contains a personalization # substitution variable, and we're transitioning from no # personalization to personalization enabled. + headfoot = Utils.maketext('headfoot.html', mlist=mlist, raw=1) + if mm_cfg.OWNERS_CAN_ENABLE_PERSONALIZATION: + extra = _("""\ +When <a href="?VARHELP=nondigest/personalize">personalization</a> is enabled +for this list, additional substitution variables are allowed in your headers +and footers: + +<ul><li><b>user_address</b> - The address of the user, + coerced to lower case. + <li><b>user_delivered_to</b> - The case-preserved address + that the user is subscribed with. + <li><b>user_password</b> - The user's password. + <li><b>user_name</b> - The user's full name. + <li><b>user_optionsurl</b> - The url to the user's option + page. +</ul> +""") + else: + extra = '' + info.extend([('msg_header', mm_cfg.Text, (10, WIDTH), 0, _('Header added to mail sent to regular list members'), _('''Text prepended to the top of every immediately-delivery - message. ''') + Utils.maketext('headfoot.html', - mlist=mlist, raw=1)), - + message. ''') + headfoot + extra), + ('msg_footer', mm_cfg.Text, (10, WIDTH), 0, _('Footer added to mail sent to regular list members'), _('''Text appended to the bottom of every immediately-delivery - message. ''') + Utils.maketext('headfoot.html', - mlist=mlist, raw=1)), + message. ''') + headfoot + extra), ]) return info diff --git a/Mailman/Handlers/SMTPDirect.py b/Mailman/Handlers/SMTPDirect.py index 4724c3a1..acaa77e2 100644 --- a/Mailman/Handlers/SMTPDirect.py +++ b/Mailman/Handlers/SMTPDirect.py @@ -50,7 +50,7 @@ DOT = '.' # Manage a connection to the SMTP server class Connection: def __init__(self): - self.__connect() + self.__conn = None def __connect(self): self.__conn = smtplib.SMTP() @@ -58,26 +58,32 @@ class Connection: self.__numsessions = mm_cfg.SMTP_MAX_SESSIONS_PER_CONNECTION def sendmail(self, envsender, recips, msgtext): + if self.__conn is None: + self.__connect() try: results = self.__conn.sendmail(envsender, recips, msgtext) except smtplib.SMTPException: - # For safety, reconnect - self.__conn.quit() - self.__connect() - # Let exceptions percolate up + # For safety, close this connection. The next send attempt will + # automatically re-open it. Pass the exception on up. + self.quit() raise - # Decrement the session counter, reconnecting if necessary + # This session has been successfully completed. self.__numsessions -= 1 # By testing exactly for equality to 0, we automatically handle the # case for SMTP_MAX_SESSIONS_PER_CONNECTION <= 0 meaning never close # the connection. We won't worry about wraparound <wink>. if self.__numsessions == 0: - self.__conn.quit() - self.__connect() + self.quit() return results def quit(self): - self.__conn.quit() + if self.__conn is None: + return + try: + self.__conn.quit() + except smtplib.SMTPException: + pass + self.__conn = None diff --git a/Mailman/Queue/Switchboard.py b/Mailman/Queue/Switchboard.py index 9a254039..77179fcf 100644 --- a/Mailman/Queue/Switchboard.py +++ b/Mailman/Queue/Switchboard.py @@ -72,8 +72,8 @@ class _Switchboard: self.__upper = None # BAW: test performance and end-cases of this algorithm if numslices <> 1: - self.__lower = (shamax * slice) / numslices - self.__upper = (shamax * (slice+1)) / numslices + self.__lower = ((shamax+1) * slice) / numslices + self.__upper = (((shamax+1) * (slice+1)) / numslices) - 1 def whichq(self): return self.__whichq @@ -139,7 +139,7 @@ class _Switchboard: # plain text. Second, the actual message file. However, we want to # first unlink the message file and then the .db file, because the # qrunner only cues off of the .db file - msg = data = None + msg = None try: data = self._ext_read(dbfile) os.unlink(dbfile) |