Today I was dealing with an instance of GNU mailman without the web interface and there were some messages held for approval.

How to approve them from the command line? Turns out it is possible thanks to the withlist tool shipped with mailman and a bit of fiddling. Code below.

# installation:
# copy this file in the same dir as withlist and name it approvefile.py

# usage:
# bin/withlist -l -r approvemessage <list> <cookie>

# cookie is the digest in the Subject: after approve

import sys
from Mailman import mm_cfg
from Mailman import Pending

# ripped out from MailList.py ProcessConfirmation
def approvemessage(ml, cookie=None):
  if cookie is None:
    print >> sys.stderr, "!!!! No cookie specified"
    return

  rec = ml.pend_confirm(cookie)
  if not rec:
    print >> sys.stderr, "!!!! Cookie not found"
    return

  try:
    op = rec[0]
    data = rec[1:]
  except ValueError:
    print >> sys.stderr, "!!!! No op found for cookie"
    return

  if op != Pending.HELD_MESSAGE:
    print >> sys.stdout, "!!!! Message isn't held"
    return

  ml.HandleRequest(data[0], mm_cfg.APPROVE)
  ml.Save()
  print >> sys.stdout, "!!!! Message approved"

# interactive version:
# bin/withlist -l admin
#Loading list admin (locked)
#The variable `m' is the admin MailList instance
#>>> from Mailman import mm_cfg
#>>> res = m.pend_confirm('862db35189d896667888114e67db8f41fa986c9f')
#>>> m.HandleRequest(res[1], mm_cfg.APPROVE)
#>>> m.Save()

blurb: public domain, no warranty whatsoever, use at your risk. Comments welcome though :)