#!/usr/bin/python # # (c) 2004 Epigenomics AG # # written by Robert Sander # # released under GPL # # # This script collects nearly all possible # local parts for emails on a qmail system. # # It is for use with the RECIPIENTS extension # from http://www.fehcom.de/qmail/qmail.html # # It reads users from the system password database, # /var/qmail/users/assign, aliases from /etc/aliases (fastforward) # and /var/qmail/alias. It also reads virtual users for domains # managed by vpopmail, if they exist. # # It does not read users for other virtual domains. # # Use at your own risk. # import cdb, pwd, commands, os, os.path, sys locals = map(lambda x: x.strip(), open("/var/qmail/control/locals").readlines()) def execute(command): rc, output = commands.getstatusoutput(command) if rc: print output sys.exit(rc) else: return output def get_users(): output = [] for user in pwd.getpwall(): try: st_mode, st_ino, st_dev, st_nlink, st_uid, st_gid, st_size, st_atime, st_mtime, st_ctime = os.stat(user[5]) if st_uid and st_uid == user[2] and user[0] == user[0].lower(): output = output + map(lambda x: "%s@%s" % (user[0], x), locals) except OSError: pass return output def get_users_assign(): output = [] try: assign = open("/var/qmail/users/assign").readlines() for line in assign: if line[0] == "=": local, user, uid, gid, homedir, dash, ext, rem = line.strip().split(":") output = output + map(lambda x: "%s@%s" % (local[1:], x), locals) except IOError: pass return output def get_alias(): input = execute("/bin/ls /var/qmail/alias/.qmail-* | cut -f 2- -d - | tr [:] [.]").split("\n") input.sort() output = [] for alias in input: if alias[-8:] == "-default": if alias[:-8] in output: continue if alias[-15:] == "-accept-default" or alias[-15:] == "-reject-default" or alias[-15:] == "-return-default": if alias[:-15] in output: continue alias = alias[:-8] if alias[-6:] == "-owner": if alias[:-6] in output: continue output.append(alias) aliases = [] for alias in output: aliases = aliases + map(lambda x: "%s@%s" % (alias, x), locals) return(aliases) def get_etcaliases(host): output = [] try: for alias in open("/etc/aliases").readlines(): if alias[0] != "#": local, rem = alias.split(":") output = output + map(lambda x: "%s@%s" % (local, x), locals) except IOError: pass return output def get_cdb(): output = [] for virtualdomain in open("/var/qmail/control/virtualdomains").readlines(): domain, user = virtualdomain.strip().split(":") passwdfile = os.path.join(pwd.getpwnam(user)[5], "passwd.cdb") if os.path.isfile(passwdfile): passwdcdb = cdb.init(passwdfile) output = output + map(lambda x: "%s@%s" % (x, domain), passwdcdb.keys()) return output aliases = get_users() + get_users_assign() + get_alias() + get_cdb() print "\n".join(aliases)