mailpost.in
上传用户:minyiyu
上传日期:2018-12-24
资源大小:864k
文件大小:5k
源码类别:

Telnet服务器

开发平台:

Unix_Linux

  1. #!@PERL@
  2. #
  3. # mailpost
  4. # $Id: mailpost.in,v 1.1 2000/01/15 01:45:39 edwardc Exp $
  5. ($bbshome) = @ARGV;
  6. if( ! $bbshome )  {
  7.     print "Usage: mailpost bbs_home < article_from_user_mailn";
  8.     exit( 0 );
  9. }
  10. $tmpfile     = "/tmp/mailpost.$$";
  11. $logfile     = "$bbshome/bbslog";
  12. # $mailbox     = "$bbshome/mailbox";
  13. $inndhome    = "$bbshome/innd";
  14. $poster      = "$inndhome/bbspost";
  15. $parsedate   = "$inndhome/parsedate";
  16. $denyfile    = "$inndhome/email.deny";
  17. $INC[ @INC ] = "$inndhome";
  18. &mail_article();
  19. sub logit
  20. {
  21.     if( $logfile ) {
  22.         open( FN, ">> $logfile" );
  23.         print FN @_;
  24.         close( FN );
  25.     } else {
  26.         print @_;
  27.     }
  28. }
  29. sub log_tmpfile
  30. {
  31.     open( FN, $tmpfile );
  32.     $result = <FN>;
  33.     close( FN );
  34.     unlink( $tmpfile );
  35.     &logit( $result );
  36. }
  37. sub junk_mail
  38. {
  39.     local       ($msg) = @_;
  40.     &logit( "unknown mail $msgn" );
  41.     if( ! $name ) {
  42.         $name = "Mail-Daemon";
  43.     }
  44.     if( ! $subject ) {
  45.         $subject = "<Unknown>: $msg";
  46.     }
  47.     open( FN, "| $poster post $bbshome/boards/junk > $tmpfile" );
  48.     print FN "$namen";
  49.     print FN "$subjectn";
  50.     print FN @MAIL;
  51.     close( FN );
  52.     &log_tmpfile();
  53.     exit( 0 );
  54. }
  55. sub uudecode
  56. {
  57.     local       ($begin) = @_;
  58.     $line = $MAIL[ $begin + 1 ];
  59.     if( substr( $line, 0, 1 ) ne "M" ) {
  60.         return;
  61.     }
  62.     $tmpfile = "/tmp/decode.$$";
  63.     open( FN, "| /bin/uudecode" );
  64.     print FN "begin 644 $tmpfilen";
  65.     foreach $n ($begin + 1 .. $#MAIL) {
  66.         print FN $MAIL[ $n ];
  67.     }
  68.     close( FN );
  69.     $#MAIL = $begin - 1;
  70.     open( FN, $tmpfile );
  71.     while( <FN> ) {
  72.         $MAIL[ @MAIL ] = $_;
  73.     }
  74.     close( FN );
  75.     unlink( $tmpfile );
  76. }
  77. sub decode_mail
  78. {
  79.     foreach $n (0 .. $#MAIL) {
  80.         $line = $MAIL[ $n ];
  81.         if( substr( $line, 0, 6 ) eq "begin " ) {
  82.             if( $line =~ /^begin d+ w/ ) {
  83.                 &uudecode( $n );
  84.                 return;
  85.             }
  86.         }
  87.     }
  88. }
  89. sub parse_header
  90. {
  91.     $header = 1;
  92.     $line = 0;
  93.     while( !($name && $password && $board && $title && $local) ) {
  94.         if( $line > $#MAIL ) {
  95.             &junk_mail( "from $realfrom" );
  96.         }
  97.         if($name && $password && $board && $title )
  98.         {
  99.                 if(! $local )
  100.                 {
  101.                         $local="globalpost";
  102.                 }
  103.         }
  104.         $_ = $MAIL[ $line++ ];
  105.         chop;
  106.         if( $_ eq "" ) {
  107.             $header = "";
  108.         }
  109.         $n = index( $_, "#" );
  110.         if( $n >= 0 ) {
  111.             $str = substr( $_, $n + 1, 9999 );
  112.             $str =~ /^(w+)[s:]+(.*)$/;
  113.             $head = $1;
  114.             $str = $2;
  115.             $head =~ tr/A-Z/a-z/;
  116.             $str =~ /^(w+)/;
  117.             if( $head eq "name" || $head eq "userid" ) {
  118.                 $name = $1;
  119.             } elsif( $head eq "password" || $head eq "passwd" ||
  120.                      $head eq "pass" ) {
  121.                 $password = $str;
  122.             } elsif( $head eq "board" ) {
  123.                 $board = $1;
  124.             } elsif( $head eq "title" || $head eq "subject" ) {
  125.                 $title = $str;
  126.             } elsif( $head eq "localpost") {
  127.                 $local="localpost";
  128.             }
  129.         } elsif( $header ) {
  130.             if( index( $_, "From: " ) == 0 ) {
  131.                 $from = substr( $_, 6, 99 );
  132.                 ($name) = split( "@", $from );
  133.             } elsif( index( $_, "Subject: " ) == 0 ) {
  134.                 $subject = substr( $_, 9, 99 );
  135.             }
  136.         }
  137.     }
  138.     if( $header ) {
  139.         while( $line <= $#MAIL && $MAIL[ $line ] ne "n" ) {
  140.             $line++;
  141.         }
  142.     }
  143.     while( $line <= $#MAIL && $MAIL[ $line ] eq "n" ) {
  144.         $line++;
  145.     }
  146.     if( 0 ) {
  147.         print "realfrom = $realfromn";
  148.         print "name = $namen";
  149.         print "password = $passwordn";
  150.         print "board = $boardn";
  151.         print "title = $titlen";
  152.     }
  153. }
  154. sub mail_article
  155. {
  156.     chdir( $bbshome );
  157.     @MAIL = <STDIN>;
  158.     if( $mailbox ) {
  159.         open( FN, ">> $mailbox" );
  160.         print FN @MAIL;
  161.         close( FN );
  162.     }
  163.     if( $MAIL[ 0 ] =~ /^From (S+) / ) {
  164.         $realfrom = $1;
  165.     } else {
  166.         &junk_mail( "format (without From)" );
  167.     }
  168.     if( -f $denyfile ) {
  169.         open( FN, $denyfile );
  170.         while( <FN> ) {
  171.             ($deny) = split( /s+/, $_ );
  172.             if( $realfrom eq $deny ) {
  173.                 &junk_mail( "Denyaddr $realfrom" );
  174.             }
  175.         }
  176.         close( FN );
  177.     }
  178.     &decode_mail();
  179.     &parse_header();
  180.     $boardpath = "$bbshome/boards/$board";
  181.     if( ! -d $boardpath ) {
  182.         &junk_mail( "board `$board' from $realfrom." );
  183.     } else {
  184.         $title =~ s//^[/g;
  185.         open( FN, "| $poster mail $boardpath > $tmpfile" );
  186. #       open( FN, "| cat" );
  187.         print FN "$namen";
  188.         print FN "$titlen";
  189.         print FN "$passwordn";
  190.         print FN "$realfromn";
  191.         print FN "$localn";
  192.         foreach $n ($line .. $#MAIL) {
  193.             print FN $MAIL[ $n ];
  194.         }
  195.         close( FN );
  196.         &log_tmpfile();
  197.     }
  198. }