相信大家对ytht的自动转寄都有所认识,我自己觉得非常实用,
由于ytht没有公开这部分代码。所以自己对mailpost作了修改。
改得很粗糙,给大家当笑话了。
思路:
把发给某个人得信由mailpost交到相应得版,
我得做法:
1.修改/etc/aliases,把给bbspost得信交给bbs,改完文件后别忘了执行 alias 这个命令,增加如下:
bbspost:bbs
2.修改/home/bbs/.forward,注意,引号也是文件得内容,它得内容如下:
"| /etc/smrsh/mailpost /home/bbs"
3.修改/etc/smrsh/mailpost,把收信人为bbspost得信转到相应的版面,
我用 /home/bbs/etc/autoboard这个来保存版面的对应信息,左边列表示
其他站的版面名称,右面列表示要放到本站的版面名称,比如:
linuxLinux
windowWindows
nttechWindows
等等。
以下是我修改后的mailpost,不熟悉perl,大家见笑了。
#!/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/inndlog";
$inndbinhome = "$bbshome/innd";
$poster = "$inndbinhome/bbspost";
$parsedate = "$inndbinhome/parsedate";
$denyfile = "$inndhome/email.deny";
$INC[ @INC ] = "$inndhome";
#版面对应文件,形式如下:
# linuxLinux
# winWindows
$boardfile = "$bbshome/etc/autoboard";
$LAST_BBS_CNAME = "笔山书院 BBS";
$LAST_BBS_DOMAIN = "bbs.qxntc.edu.cn";
&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 );
}
# 自动转相应版 add by dgwang
sub bbspost
{
$nowt=localtime;
&logit( "bbspost: $subject [$realfrom] \n" );
open(AUTOB,$boardfile);
@autoboard=<AUTOB>;
close( AUTOB );
$pboard="";
for($i=0;$i<$#autoboard;$i++){
$autoboard[$i] =~/\s*(\w+)\s+(\w+)/;
$pst=$1;
$boardname=$2;
if($postboard =~ /$pst/i){
$pboard=$boardname;
last;
}
}
open(FN,"| $poster post $bbshome/boards/post > $tmpfile");
print FN $pboard ? "post\n" : "$realfrom\n";
print FN "$subject\n" ;
print FN "发信人: post (自动转信系统), 信区: post, 原信区: $postboard\n";
print FN "标 题: $subject\n";
print FN "发信站: $LAST_BBS_CNAME ($nowt), 站内信件\n\n";
print FN " \033[1;36m本文由\033[1;32m $realfrom \033[1;36m 转寄到本站! \033[0m\n\n";
if($pboard){
print FN " 本文已由系统自动转到 $pboard 版\n\n";
}
else {
for( $n=$textstart;$n<$#MAIL;$n++) {
print FN $MAIL[ $n ];
}
}
print FN "--\n\033[1;36m☆ 来源:.\033[1;32m$LAST_BBS_CNAME $LAST_BBS_DOMAIN.\033[1;36m[FROM: bbspost]\033[0m\n";
close( FN );
if($pboard){
open(FN,"| $poster post $bbshome/boards/$pboard > $tmpfile");
print FN "$authname.\n";
print FN "$subject\n";
print FN "转寄人: $realfrom [自动转信系统], 信区: $pboard\n";
print FN "标 题: $subject\n";
print FN "发信站: $LAST_BBS_CNAME ($nowt), 站内信件\n\n";
# print FN " \033[1;36m本文由\033[1;32m $realfrom \033[1;36m 转载到本站! \033[0m\n\n";
for( $n=$textstart;$n<$#MAIL;$n++) {
print FN $MAIL[ $n ];
}
print FN "--\n\033[1;36m☆ 来源:.\033[1;32m$LAST_BBS_CNAME $LAST_BBS_DOMAIN.\033[1;36m[FROM: bbspost]\033[0m\n\n";
close( FN );
}
&log_tmpfile();
exit(0);
}
sub junk_mail
{
local ($msg) = @_;
# 收信人是 bbspost 的就自动转版面 add by dgwang
if(index($touser, 'bbspost')==0){
#### 去掉多余的转寄字样
$subject =~s /\[转寄\] \[转寄\]/\[转寄\]/g;
$subject =~s /\(转寄\) \(转寄\)/\(转寄\)/g;
$subject =~s / //g;
bbspost ;
}
&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 parse_header
{
$header = 1;
$line = 0;
while( !($name && $password && $board && $title && $local) ) {
if( $line > $#MAIL ) {
&junk_mail( "from $realfrom" );
}
if($name && $password && $board && $title )
{
if(! $local )
{
$local="globalpost";
}
}
$_ = $MAIL[ $line++ ];
chop;
#为保证找到原始作者,不在这里转文 add by dgwang
#if(index($touser, 'bbspost')==0){
if(index($_,"发信人")==0){
$_ =~/发信人: (.*[^\(])信区: (.*)/;
$authname=$1;
$postboard=$2;
#bbspost; 不在这里转了
}
#}
if( $_ eq "" ) {
$header = "";
}
$n = index( $_, "#" );
if( $n >= 0 ) {
$str = substr( $_, $n + 1, 9999 );
$str =~ /^(\w+)[\s:]+?\s*(.*)$/;
$head = $1;
$str = $2;
$head =~ tr/A-Z/a-z/;
$str =~ /^(\w+)/;
if( $head eq "name" || $head eq "userid" ) {
$name = $1;
} elsif( $head eq "password" || $head eq "passwd" ||
$head eq "pass" ) {
$password = $str;
} elsif( $head eq "board" ) {
$board = $1;
} elsif( $head eq "title" || $head eq "subject" ) {
$title = $str;
} elsif( $head eq "localpost") {
$local="localpost";
}
} elsif( $header ) {
if( index( $_, "From: " ) == 0 ) {
$from = substr( $_, 6, 99 );
($name) = split( "\@", $from );
} elsif( index( $_, "Subject: " ) == 0 ) {
$subject = substr( $_, 9, 99 );
# 取收件人 add by dgwang
} elsif( index( $_,"To: " )==0 ) {
$touser = substr( $_,4,99);
if($touser =~/</){
$touser =~/.*<(.*)>/;
$touser = $1;
}
# 邮件过滤后正文开始 add by dgwang
} elsif( index( $_,"X-Scanned-By")==0 ) {
$textstart=$line+1;
}
}
}
if( $header ) {
while( $line <= $#MAIL && $MAIL[ $line ] ne "\n" ) {
$line++;
}
}
while( $line <= $#MAIL && $MAIL[ $line ] eq "\n" ) {
$line++;
}
if( 0 ) {
print "realfrom = $realfrom\n";
print "name = $name\n";
print "password = $password\n";
print "board = $board\n";
print "title = $title\n";
}
}
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/$board";
if( ! -d $boardpath ) {
&junk_mail( "board `$board' from $realfrom." );
} else {
$title =~ s/;
open( FN, "| $poster mail $boardpath > $tmpfile" );
# open( FN, "| cat" );
print FN "$name\n";
print FN "$title\n";
print FN "$password\n";
print FN "$realfrom\n";
print FN "$local\n";
foreach $n ($line .. $#MAIL) {
print FN $MAIL[ $n ];
}
close( FN );
&log_tmpfile();
}
}
--
FROM 218.194.254.33