diff options
| -rwxr-xr-x | mail/deliver | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/mail/deliver b/mail/deliver new file mode 100755 index 000000000..39f66f4a5 --- /dev/null +++ b/mail/deliver @@ -0,0 +1,76 @@ +#!/usr/local/bin/python +# +# +# Heh, heh, heh, this partition reminds me of the knapsack problem ;-) +# Ie, the optimal distribution here is NP Complete. + +import os + +if not os.fork(): + import string, sys, regsub + sys.path.append('/home/mailman/mailman/modules') + import mm_cfg + def CallSendmail(cmd, stdin): + file = os.popen(cmd, 'w') + file.write(stdin) + file.close() + + domain_info = {} + def GroupByDomain(addr): + parts = regsub.split(addr, '[.@]') + key = string.join(parts[-2:]) + if not domain_info.has_key(key): + domain_info[key] = [addr] + else: + domain_info[key].append(addr) + + def BuildGroups(biglist, num_addrs): + biglist.sort(lambda x,y: len(x) < len(y)) + groups = [] + for i in range(spawns-1): + target_size = num_addrs / (spawns - i) + if not len(biglist): + break + newlist = biglist[0] + biglist.remove(biglist[0]) + j = 0 + while len(newlist) < target_size: + if j >= len(biglist): + break + if len(newlist) + len(biglist[j]) > target_size: + j = j + 1 + continue + newlist = newlist + biglist[j] + biglist.remove(biglist[j]) + groups.append(newlist) + num_adders = num_addrs - len(newlist) + lastgroup = [] + for item in biglist: + lastgroup = lastgroup + item + if len(lastgroup): + groups.append(lastgroup) + return groups + + def CallSendmailForEachGroup(groups, sender, text): + for group in groups: + if not os.fork(): + CallSendmail(mm_cfg.SENDMAIL_CMD % + (sender, string.join(group)), text) + os._exit(0) + + sender = sys.argv[2] + spawns = eval(sys.argv[3]) + if spawns > mm_cfg.MAX_SPAWNS: + spawns = mm_cfg.MAX_SPAWNS + if spawns < 1: + spawns = 1 + to_list = sys.argv[4:] + file = open(sys.argv[1], 'r') + text = file.read() + file.close() + os.unlink(sys.argv[1]) + + map(GroupByDomain, to_list) + final_groups = BuildGroups(domain_info.values(), len(to_list)) + + CallSendmailForEachGroup(final_groups, sender, text) |
