BBS水木清华站∶精华区

发信人: fuse (保险丝), 信区: Linux 
标  题: Mailing list -> BBS 
发信站: BBS 水木清华站 (Tue Jun 16 22:44:59 1998) 
 
 
改了点,再灌一遍 :-) 
 
这是把mailing list转到bbs上的看板上的方法。 
很土的办法,但是还挺好用,试运行3天了:-) 
 
在bbs上看文章可以a, ?, /查找文章,可以用m, g标识 
可以收录精华区,比在mail信箱里看舒服多了,最重要 
的,可以一个人定阅,供众多人阅读:-) 
 
1. 开个uid=bbs(9999)的帐号,如bsdqna 
2. 在freebsd的home下面放一.forward文件, 
   内书: "| /home/bsdqna/mailpost /home/bbs" 
3. bbs上开一版,比如:FreeBSD_Question版 
4. 在/home/bsdqna/目录下放一叫mailpost文件 
   内容附后,chmod +x mailpost 
5. cp ~/bbsadm/innbbsd/innd ~/bbsadm/innbbsd/maillist 
   cd ~/bbsadm/innbbsd/maillist/; vi bbspost.c 
  找以下片断,在post_article()里 
    gets( userid ); 
    gets( subject ); 
    gets( realfrom ); --->加进这一行 
 
    if( usermail ) { 
    //    check_userec( &record, userid ); -->comment掉这行 
    } 
   再make bbspost 
  将生成的bbspost放到/home/bbs/innd下面 
 
6. 然后以[email protected]发信给[email protected] 
   subscribe freebsd_questions 
  再以bsdqna回信auth一下,你的小站就会源源不断有信进来乐: 
  35  ◆ FreeBSD_Bugs       [系统] ○ FreeBSD_Bugs                诚徵板主中 
   70  ◆ FreeBSD_Hacker     [系统] ○ FreeBSD_Hacker              诚徵板主中 
  371  ◆ FreeBSD_Question   [系统] ○ FreeBSD_Question            诚徵板主中 
 
 
 mailpost附后, 压根不懂perl的我是拿bbs自带的程序改的,一定 
 有更好的办法,还请各位大侠出手改进。 
 
#!/usr/bin/perl 

# mailpost 
($bbshome) = @ARGV; 
if( ! $bbshome )  { 
    print "Usage: mailpost bbs_home < article_from_user_mail\n"; 
    exit( 0 ); 

 
$tmpfile     = "/tmp/mailpost.$$"; 
$logfile     = "$bbshome/bbslog"; 
# $mailbox     = "$bbshome/mailbox"; 
$inndhome    = "$bbshome/innd"; 
$poster      = "$inndhome/bbspost"; 
$parsedate   = "$inndhome/parsedate"; 
$denyfile    = "$inndhome/email.deny"; 
$INC[ @INC ] = "$inndhome"; 
 
&mail_article(); 
 
sub logit 

    if( $logfile ) { 
        open( FN, ">> $logfile" ); 
        print FN @_; 
        close( FN ); 
    } else { 
        print @_; 
    } 

 
sub log_tmpfile 

    open( FN, $tmpfile ); 
    $result = <FN>; 
    close( FN ); 
    unlink( $tmpfile ); 
    &logit( $result ); 

 
sub junk_mail 

    local       ($msg) = @_; 
 
    &logit( "unknown mail $msg\n" ); 
    if( ! $name ) { 
        $name = "Mail-Daemon"; 
    } 
    if( ! $subject ) { 
        $subject = "<Unknown>: $msg"; 
    } 
    open( FN, "| $poster post $bbshome/boards/junk > $tmpfile" ); 
    print FN "$name\n"; 
    print FN "$subject\n"; 
    print FN @MAIL; 
    close( FN ); 
    &log_tmpfile(); 
    exit( 0 ); 

 
sub uudecode 

    local       ($begin) = @_; 
 
    $line = $MAIL[ $begin + 1 ]; 
    if( substr( $line, 0, 1 ) ne "M" ) { 
        return; 
    } 
    $tmpfile = "/tmp/decode.$$"; 
    open( FN, "| /bin/uudecode" ); 
    print FN "begin 644 $tmpfile\n"; 
    foreach $n ($begin + 1 .. $#MAIL) { 
        print FN $MAIL[ $n ]; 
    } 
    close( FN ); 
    $#MAIL = $begin - 1; 
    open( FN, $tmpfile ); 
    while( <FN> ) { 
        $MAIL[ @MAIL ] = $_; 
    } 
    close( FN ); 
    unlink( $tmpfile ); 

 
sub decode_mail 

    foreach $n (0 .. $#MAIL) { 
        $line = $MAIL[ $n ]; 
        if( substr( $line, 0, 6 ) eq "begin " ) { 
            if( $line =~ /^begin \d+ \w/ ) { 
                &uudecode( $n ); 
                return; 
            } 
        } 
    } 

 
sub parse_header 

    $header = 1; 
    $line = 0; 
    while( !( $subject ) ) { 
        if( $line > $#MAIL ) { 
            &junk_mail( "from $realfrom" ); 
        } 
        $_ = $MAIL[ $line++ ]; 
        chop; 
        if( $_ eq "" ) { 
            $header = ""; 
        } 
        if( $header ) { 
            if( index( $_, "From: " ) == 0 ) { 
                $from = substr( $_, 6, 99 ); 
                ($name) = split( "<", $from ); 
            } elsif( index( $_, "Subject: " ) == 0 ) { 
                $subject = substr( $_, 9, 99 ); 
            } 
        } 
    } 
#    $name = $from; 
    $name = $from unless $name; 
    $name = $realfrom unless $name; 
    $line = 0; 
#    if( $header ) { 
        while( $line <= $#MAIL && $MAIL[ $line ] ne "\n" ) { 
            $line++; 
        } 
 
        $MAILBODY = $line 
#    } 

 
sub mail_article 

    chdir( $bbshome ); 
    @MAIL = <STDIN>; 
    if( $mailbox ) { 
        open( FN, ">> $mailbox" ); 
        print FN @MAIL; 
        close( FN ); 
    } 
    if( $MAIL[ 0 ] =~ /^From (\S+) / ) { 
        $realfrom = $1; 
    } else { 
        &junk_mail( "format (without From)" ); 
    } 
    if( -f $denyfile ) { 
        open( FN, $denyfile ); 
        while( <FN> ) { 
            ($deny) = split( /\s+/, $_ ); 
            if( $realfrom eq $deny ) { 
                &junk_mail( "Denyaddr $realfrom" ); 
            } 
        } 
        close( FN ); 
    } 
    &decode_mail(); 
    &parse_header(); 
    $boardpath = "$bbshome/boards/test"; 
    if( ! -d $boardpath ) { 
        &junk_mail( "board `$board' from $realfrom." ); 
    } else { 
#        $title =~ s/^[/^[/g; 
    $title = $subject; 
    open( FN, "| $poster mail $bbshome/boards/FreeBSD_Question > $tmpfile" ); 
        print FN "$name\n"; 
        print FN "$title\n"; 
        print FN "$realfrom\n"; 
        print FN "$from\n"; 
        print FN "邮件作者: $from\n"; 
        print FN "邮件来源: $realfrom\n"; 
for ($n= $MAILBODY; $n <= $#MAIL; $n++) { 
        print FN $MAIL[$n]; 

 
        close( FN ); 
        &log_tmpfile(); 
    } 

 
 
-- 
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 210.32.151.168] 

BBS水木清华站∶精华区