#! /usr/bin/perl # fixscript will replace this line with require innshellvars.pl # news to mail channel backend # # INN gives us # @token@ addrs # for each article that needs to be mailed. We invoke sm on the # localhost to get the actual article and stuff # it down sendmail's throat. # # This program expect to find a file that maps listname to listaddrs, # @prefix@/etc/news2mail.cf # which must contain address mapping pairs such as # # big-red-ants@ucsd.edu big-red-ants-digest@ucsd.edu # # where the first token is the name fed to us from INN, and which is # also placed in the To: header of the outgoing mail. It's probably # the subscriber's list submittal address so that replies go to the # right place. The second token is the actual address sendmail ships # the article to. # # In the INN newsfeeds file, you need to have a channel feed: # n2m!:!*:Tc,Ac,Wn*:@prefix@/bin/news2mail # and a site for each of the various mailing lists you're feeding, # such as # big-red-ants@ucsd.edu:rec.pets.redants.*:Tm:n2m! # # Error handling is nearly nonexistent. # # - Brian Kantor, UCSD Aug 1998 require 5.006; use FileHandle; use Sys::Syslog; use strict; my $cfFile = $inn::pathetc . "/news2mail.cf" ; my $sendmail = $inn::mta ; my $sm = $inn::pathbin . "/sm" ; my %maddr = (); # # the syslog calls are here but don't work on my system # openlog('news2mail', 'pid', 'mail'); syslog('info', 'begin'); # # load the list names and their mail addresses from cf file # #comments and blank lines are ignored # unless (open CF, "< $cfFile") { syslog('notice', 'CF open failed %m'); die "bad CF"; } while ( ) { next if /^#|^\s+$/; my ( $ln, $ma ) = split /\s+/; $maddr{ $ln } = $ma; } close CF; # # for each incoming line from the INN channel # while ( ) { chomp; syslog('info', $_); my ($token, $lnames) = split /\s+/, $_, 2; my @addrs = split /\s+/, $lnames; my @good = grep { defined $maddr{$_} } @addrs; my @bad = grep { !defined $maddr{$_} } @addrs; if (! @good) { syslog('notice', "unknown listname $_"); next; } if (@bad) { syslog('info', 'skipping unknown lists: ', join(' ', @bad)); } mailto($token, $lnames, @maddr{@good}); } syslog ("info", "end") ; exit 0; sub mailto { my($t, $l, @a) = @_ ; my $sendmail = $inn::mta ; $sendmail =~ s!\s*%s!! ; my @command = (split (' ', $sendmail), '-ee', '-fnews', '-odq', @a); # @command[0] = '/usr/local/bin/debug'; syslog('info', join(' ', @command)); unless (open(SM, '|-', @command)) { syslog('notice', join(' ', '|', @command), 'failed!'); die "bad $sendmail"; } my $smgr = "$sm -q $t |"; unless (open(SMGR, $smgr)) { syslog('notice', "$smgr failed!"); die "bad $smgr"; } # header while ( ) { chomp; # empty line signals end of header if ( /^$/ ) { print SM "To: $l\n\n"; last; } # # skip unnecessary headers # next if /^NNTP-Posting-Date:/i; next if /^NNTP-Posting-Host:/i; next if /^X-Trace:/i; next if /^Xref:/i; next if /^Path:/i; # # convert Newsgroups header into X-Newsgroups # s/^Newsgroups:/X-Newsgroups:/i; print SM "$_\n"; } # body while ( ) { print SM $_; } close(SMGR); close(SM); }