[Mailman-Users] mailman dies insider deliver...

Ken Manheimer klm at cnri.reston.va.us
Thu Sep 3 05:18:02 CEST 1998

On Wed, 2 Sep 1998, Joseph T. Bore wrote:

> after installing b5, with python 1.5, and chmod'ing all the
> appropriate directories according to all the messages in the archive I
> am still experiencing problems.  No mail is being delivered.  If I
> mail to any mailing list on my machine the following shows up in the
> mailman logs.  Any help is greatly appreciated since all my lists have
> broke... 8(
> jb
> Sep 02 00:10:46 1998 deliver (child): Traceback (innermost last):
> deliver (child):   File "/home/mailman/scripts/deliver", line 154, in ?
> deliver (child):      main()
> deliver (child):   File "/home/mailman/scripts/deliver", line 49, in main
> deliver (child):      do_child()
> deliver (child):   File "/home/mailman/scripts/deliver", line 57, in do_child
> deliver (child):      spawns = string.atol(sys.stdin.readline()[:-1])
> deliver (child): ValueError :  empty string for atol() 

The deliver script is invoked (via a pipe) by Deliverer.DeliverToList, 
and should always be getting the number of spawns as its first stdin
line, at least as of 1.0b5.  You should check to see that the version of
Deliverer.py you have (in the Mailman/ dir) is the same as the one i've
attached here.  Another possibility is that you've situated the new
installation somewhere besides the old one, and the old one is somehow
getting invoked, eg via old aliases, but then calling the new one.  

Anyway, start with checking what i mention, and get in touch with me
via email to let you know what you find.  We'll try to sort this out via
email and get back to the list with our conclusion.

Ken Manheimer		  klm at python.org	    703 620-8990 x268
	    (orporation for National Research |nitiatives

	# If you appreciate Python, consider joining the PSA! #
		  # <http://www.python.org/psa/>. #

-------------- next part --------------
# Copyright (C) 1998 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
# 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 
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

"""Mixin class with message delivery routines."""

import string, os, sys
import mm_cfg
import Errors
import Utils

# Note that the text templates for the various messages have been moved into
# the templates directory.

# We could abstract these two better...
class Deliverer:
    # This method assumes the sender is list-admin if you don't give one.
    def SendTextToUser(self, subject, text, recipient, sender=None,
        if not sender:
            sender = self.GetAdminEmail()
        Utils.SendTextToUser(subject, text, recipient, sender,

    def DeliverToUser(self, msg, recipient):
        # This method assumes the sender is the one given by the message.
        Utils.DeliverToUser(msg, recipient,
                               add_headers=['Errors-To: %s\n'
                                            % Self.GetAdminEmail()])

    def QuotePeriods(self, text):
	return string.join(string.split(text, '\n.\n'), '\n .\n')
    def DeliverToList(self, msg, recipients, 
                      header="", footer="", remove_to=0, tmpfile_prefix = ""):
	if not(len(recipients)):
        # Massage the headers.
        if remove_to:
            del msg['to']
            del msg['x-to']
	    msg.headers.append('To: %s\n' % self.GetListEmail())
	if self.reply_goes_to_list:
            del msg['reply-to']
            msg.headers.append('Reply-To: %s\n' % self.GetListEmail())
	msg.headers.append('Sender: %s\n' % self.GetAdminEmail())
	msg.headers.append('Errors-To: %s\n' % self.GetAdminEmail())
	msg.headers.append('X-BeenThere: %s\n' % self.GetListEmail())

        cmd = "%s %s" % (mm_cfg.PYTHON,
                         os.path.join(mm_cfg.SCRIPTS_DIR, "deliver"))
        cmdproc = os.popen(cmd, 'w')

        cmdproc.write("%d\n" % self.num_spawns)
        cmdproc.write("%s\n" % self.GetAdminEmail())
        for r in recipients:
            # Mustn't send blank lines before end of recipients:
            if not r: continue
            cmdproc.write(r + "\n")
        cmdproc.write("\n")             # Empty line for end of recipients.
        cmdproc.write(string.join(msg.headers, '') + "\n")
	if header:                      # The *body* header:
	    cmdproc.write(header + "\n")
	if footer:

	status = cmdproc.close()

        if status:
            sys.stderr.write('Non-zero exit status: %d'
                             '\nCommand: %s' % ((status >> 8), cmd))

    def SendPostAck(self, msg, sender):
	subject = msg.getheader('subject')
	if not subject:
	    subject = '[none]'
            sp = self.subject_prefix
            if (len(subject) > len(sp)
                and subject[0:len(sp)] == sp):
                # Trim off subject prefix
                subject = subject[len(sp) + 1:]
        # get the text from the template
        body = Utils.maketext(
            {'subject'     : subject,
             'listname'    : self.real_name,
             'listinfo_url': self.GetAbsoluteScriptURL('listinfo'),
	self.SendTextToUser('%s post acknowlegement' % self.real_name,
                            body, sender)

    def CreateSubscribeAck(self, name, password):
	if self.welcome_msg:
	    welcome = Utils.wrap(self.welcome_msg) + '\n'
	    welcome = ''

        # get the text from the template
        body = Utils.maketext(
            {'real_name'   : self.real_name,
             'host_name'   : self.host_name,
             'welcome'     : welcome,
             'emailaddr'   : self.GetListEmail(),
             'listinfo_url': self.GetAbsoluteScriptURL('listinfo'),
             'optionsurl'  : self.GetAbsoluteOptionsURL(name),
             'password'    : password,
        return body

    def SendSubscribeAck(self, name, password, digest):
        if not self.send_welcome_msg:
	if digest:
	    digest_mode = '(Digest mode)'
	    digest_mode = ''

	if self.reminders_to_admins:
	    recipient = "%s-admin@%s" % tuple(string.split(name, '@'))
	    recipient = name

        self.SendTextToUser(subject = 'Welcome To "%s"! %s' % (self.real_name, 
			    recipient = recipient,
			    text = self.CreateSubscribeAck(name, password))

    def SendUnsubscribeAck(self, name):
	self.SendTextToUser(subject = 'Unsubscribed from "%s"\n' % 
			    recipient = name, 
			    text = Utils.wrap(self.goodbye_msg))

    def MailUserPassword(self, user):
        listfullname = '%s@%s' % (self.real_name, self.host_name)
        ok = 1
        if self.passwords.has_key(user):
	    if self.reminders_to_admins:
		recipient = "%s-admin@%s" % tuple(string.split(user, '@'))
		recipient = user
            subj = '%s maillist reminder\n' % listfullname
            # get the text from the template
            text = Utils.maketext(
                {'user'       : user,
                 'listname'   : self.real_name,
                 'password'   : self.passwords[user],
                 'options_url': self.GetAbsoluteOptionsURL(user),
                 'requestaddr': self.GetRequestEmail(),
                 'adminaddr'  : self.GetAdminEmail(),
            ok = 0
            recipient = self.GetAdminEmail()
            subj = '%s user %s missing password!\n' % (listfullname, user)
            text = Utils.maketext(
                {'username'     : `user`,
                 'internal_name': self._internal_name,

	self.SendTextToUser(subject = subj,
			    recipient = recipient,
                            text = text,
                            add_headers=["Errors-To: %s"
                                         % self.GetAdminEmail(),
                                         "X-No-Archive: yes"])
        if not ok:
             raise Errors.MMBadUserError

More information about the Mailman-Users mailing list