#!/usr/bin/php -q * */ require_once('commandLine.inc'); require_once('SpecialWikilist.php'); function exiterror($text) { echo $text . "\n"; exit(-1); // returns error code so procmail will consider it undelivered } $MAX_RECIPIENTS_PER_SENDMAIL = 10; // maximum number of envelope recipients per mail message $TMPDIR = "/tmp"; $SENDMAIL = "/usr/sbin/sendmail"; if (! $args[0]) exiterror("no list specified"); if (!$wgWikilistEmailHost) exiterror("wiki variable wgWikilistEmailHost is not defined"); $listID = $args[0]; if (preg_match("/^[0-9]*$/", $listID)) $title = Title::newFromID($listID); else $title = Title::newFromText($listID, $wgWikilistNamespace); if (!$title || !$title->exists()) exiterror("not a valid list"); $list = new WikiList($title); if (count($list->recipients) == 0) exiterror("no users on list"); $tmpmailfile = tempnam($TMPDIR, "wikilist." . $list->getListID() . "."); exec('formail -b -I"List-Id: ' . $list->getListDisplayName() . " <" . $list->getListName() . ".${wgWikilistEmailHost}>" . '" > ' . $tmpmailfile); $mailpipe = popen("xargs -0 -n $MAX_RECIPIENTS_PER_SENDMAIL --replace=% " . "sh -c 'cat $tmpmailfile | $SENDMAIL -oi -- %'", "w"); foreach (array_keys($list->recipients) as $rcpt) { $user = User::newFromName($rcpt); // escapeshellarg so that it's safe on the command line when run by xargs if ($user) { fwrite($mailpipe, escapeshellarg($user->getEmail())); fwrite($mailpipe, "\0"); } } pclose($mailpipe); unlink($tmpmailfile); exit(0); // exit normally ?>