tchrist@convex.com (Tom Christiansen) (10/16/89)
Here is a perl script that you can use to send mail messages
to newsgroups. It expects to be passed the newsgroup as an
argument, or else included in the headers. You may have to
alter the pathname for inews.
It doesn't really *require* perl version 3, although you'd
have to tweak STDIN to stdin and the
print INEWS while <STDIN>;
to
while (<stdin>) {
print INEWS;
}
As well as the one "warn" to "print stderr".
--tom
ps: kudos to Dave Cohrs <dave@cs.wisc.edu> for the original version
of this script written in csh+grep+sed+ed.
================= CUT HERE ===============================================
#!/usr/local/bin/perl
($program = $0) =~ s%.*/%%;
( $version ) = $] =~ /(\d+\.\d+).*\nPatch level/;
die "$program: requires at least version 3 of perl\n"
if $version < 3;
$inews = "/usr/spool/news/lib/inews";
$inews = "/usr/local/bin/inews" unless -x $inews;
die "$program: can't find inews\n" unless -x $inews;
$iopts = "-h";
if ($#ARGV < 0) {
# $newsgroup = "test";
# we'll expect the newsgroup line in the body
} elsif ($#ARGV == 0) {
$newsgroup = $ARGV[0];
} else {
die "usage: $program [newsgroup]\n";
}
# in case inews dumps core or something crazy
$SIG{'PIPE'} = "plumber";
sub plumber { die "$program: \"$inews\" died prematurely!\n"; }
open (INEWS, "| $inews $iopts") ||
die "$program: can't run $inews\n";
# header munging loop
while (<STDIN>) {
last if /^$/;
# transform real from: line back to icky style
s/^From:\s+(.*) <(.*)>/From: $2 ($1)/;
# transform from_ line to path header; also works locally
s/^From\s+(\S+)@(\S+).*/Path: $2!$1/
|| s/^From\s+(\S+)[^@]*$/Path: $1\n/;
print INEWS
if /^(From|Subject|Date|Path|Newsgroups|Organization|Message-ID):/i;
$saw_subject |= ( $+ eq 'Subject' );
$saw_newsgroup |= ( $+ eq 'Newsgroups' );
}
warn "$program: didn't expect newsgroup in both headers and ARGV\n"
if $newsgroup && $saw_newsgroup;
die "$program: didn't get newsgroup from either headers or ARGV\n"
unless $newsgroup || $saw_newsgroup;
printf INEWS "Newsgroups: %s\n", $newsgroup if $newsgroup;
print INEWS "Subject: Untitled\n" unless $saw_subject;
print INEWS "\n";
print INEWS while <STDIN>; # gobble rest of message
close INEWS;
exit $?;
================= END OF CUT HERE ========================================
Tom Christiansen {uunet,uiucdcs,sun}!convex!tchrist
Convex Computer Corporation tchrist@convex.COM
"EMACS belongs in <sys/errno.h>: Editor too big!"