summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xmail/deliver76
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)