sendform.pl
上传用户:dostar
上传日期:2007-01-04
资源大小:21k
文件大小:6k
源码类别:

WEB邮件程序

开发平台:

Perl

  1. #! /usr/local/bin/perl
  2. BEGIN { $APP_PATH=$0; $APP_PATH=~s/(/*)[^/]+$/$1/g; }
  3. # @ ----------------------------------------------------------------------------------------------------------
  4. # @ This code is (c) 1999 Alexandre Aufrere and NikoSoft.
  5. # @ Published under NPL rights, meaning you have the right
  6. # @ to use and modify this code freely, provided it 
  7. # @ remains available and free. Any modified code should be
  8. # @ submitted to Nikopol Software Corp. or Alexandre Aufrere.
  9. # @ This code is protected by the French laws on Copyright.
  10. # @ Please note that there it comes with NO WARRANTY of any kind,
  11. # @ and especially for any damagbe it could cause to your computer
  12. # @ or network.
  13. # @ Using this code means you agree to this license agreement.
  14. # @ Further information at http://nikosoft.free.fr
  15. # @ ----------------------------------------------------------------------------------------------------------
  16. # @ 
  17. # @ Project NS WebMail
  18. # @ 
  19. # @ Filename sendform.pl
  20. # @ 
  21. # @ Description build a form for sending mail
  22. # @ 
  23. # @ Version 1.0
  24. # @ 
  25. # @ ----------------------------------------------------------------------------------------------------------
  26. use Socket;
  27. require $APP_PATH."config.pl";
  28. require $APP_PATH."common.pl";
  29. #obtain the FORM information that has been passed by using
  30. #the param() method of the cgi object.
  31. &ReadParse;
  32. $loginname  = $in{'loginname'};
  33. $password   = $in{'password'};
  34. $POPserver  = $in{'POPserver'};
  35. $to         = $in{'to'};
  36. $subject    = $in{'subject'} or "";
  37. $body       = $in{'body'} or "";
  38. $cache      = $in{'cache'};
  39. # Put the ">" befor the quoted body
  40. @bodylines=split("n",$body);
  41. $body="";
  42. foreach (@bodylines) {
  43.   $body.="> ".$_."n";
  44. }
  45. $sender = $loginname."@".$POPserver;
  46. $addrvrfyed=$sender;
  47. if ($verifysmtp==1) {
  48.   $addrvrfyed=sendmailvrfy($sender,$SMTPserver);
  49.   if ($addrvrfyed=~ m/^-[0-9]/) { $addrvrfyed=$sender; }
  50.   
  51.        $addrvrfyed=~s/^2.1.5 //g;    # nuke sendmail 8.10.x vrfy feature
  52.   if (defined($masquarade) && $addrvrfyed =~ /$masquarade/) {
  53.     $addrvrfyed=~s/@([^>^ ]+)/@$masquarade/;
  54.   }
  55.   $from_html=$addrvrfyed;
  56.   $from_html =~ s/</&lt;/;
  57.   $from_html =~ s/>/&gt;/;
  58. }
  59. print "Content-type: text/htmlnn";
  60. print "<HTML><HEAD><TITLE>NSWM";
  61. if ($cache eq "No") { print "<META HTTP-EQUIV='Pragma' CONTENT='no-cache,no-store'>"; }
  62. print "</TITLE></HEAD>";
  63. print "<BODY BGCOLOR='FFFFFF'>n";
  64. #This calculation determines the width of the text entry boxes.
  65. #The minimum length will either be 36 spaces or 20% larger than the
  66. #largest of the three field entries which are already known.
  67. #Note that depending on how this routine is called, not all
  68. #of the fields are known in advance.
  69. $width = 30;
  70. $width = ($width>length($sender) ? $width : length($sender));
  71. $width = ($width>length($to)     ? $width : length($to));
  72. $width = ($width>length($subject)? $width : length($subject));
  73. $width *= 1.2; #fudge factor to avoid visual cramping.
  74. print "<FORM METHOD="POST" ACTION="".$CGI_PATH_NSWM."send.pl" enctype="multipart/form-data">n";
  75. print "<TABLE BORDER=0 BGCOLOR=$lightbgcolor><TR><TD>n";
  76. print "";
  77. if ($fake_from) {
  78. print "$fromtext: </td><td> <INPUT TYPE='text'   NAME='sender'     VALUE='$addrvrfyed'    SIZE=$width>n";
  79. } else {
  80. print "$fromtext: </td><td> <INPUT TYPE='hidden'   NAME='sender'     VALUE='$addrvrfyed'> <tt>$from_html</tt>n";
  81. }
  82. print "</TD><TD WIDTH=100  valign='middle' rowspan=3>n";
  83. print "</td></tr>n";
  84. print "<tr><td>";
  85. print "$totext: </td><td> <INPUT TYPE='text'   NAME='to'         VALUE="$to"        SIZE=$width></td></tr>n";
  86. print "<tr><td>Cc: </td><td> <INPUT TYPE='text'   NAME='cc'         VALUE=""        SIZE=$width></td></tr>n";
  87. print "<tr><td>";
  88. print "$subjecttext: </td><td> <INPUT TYPE='text'   NAME='subject'    VALUE="$subject"   SIZE=$width>n";
  89. print "       <INPUT TYPE='hidden' NAME='loginname'  VALUE='$loginname' SIZE=$width>n";
  90. print "       <INPUT TYPE='hidden' NAME='password'   VALUE='$password'             >n";
  91. print "       <INPUT TYPE='hidden' NAME='POPserver'  VALUE='$POPserver'            >n";
  92. print "       <INPUT TYPE='hidden' NAME='cache'      VALUE='$cache'                >n";
  93. print "</TD></TR></TABLE>n";
  94. print "$messagetext<br>n";
  95. print "<textarea rows=14 cols=75 name='message' wrap='virtual'>n";
  96. print $body;
  97. print "</textarea><br>";
  98. $attachtext=~ s/([^ ])//g;
  99. print "$attachtext: <input type=file name=file><br>";
  100. print "<ul><ul><ul><INPUT TYPE=submit value='$sendtext'></ul></ul></ul>";
  101. print "</FORM>";
  102. #send the ending html code (/body and /head tags)
  103. print "</BODY></HTML>n";
  104. exit;
  105. #-----------------------------SUBROUTINES------------------------
  106. sub ReadParse {
  107.   local(*in)=@_ if @_;
  108.   local ($i,$key,$val);
  109.   if ($ENV{'REQUEST_METHOD'} eq "GET") {
  110.     $in=$ENV{'QUERY_STRING'};
  111.   }
  112.   elsif ($ENV{'REQUEST_METHOD'} eq "POST") {
  113.     read(STDIN,$in,$ENV{'CONTENT_LENGTH'});
  114.   }
  115.   
  116.   @in=split(/&/,$in);
  117.   
  118.   foreach $i (0 .. $#in) {
  119.     $in[$i] =~ s/+/ /g;
  120.     ($key,$val)=split(/=/,$in[$i],2);
  121.     $key =~ s/%(..)/pack("c",hex($1))/ge;
  122.     $val =~ s/%(..)/pack("c",hex($1))/ge;
  123.     $in{$key} .= "" if (defined($in{$key}));
  124.     $in{$key} .=$val;
  125.   }
  126.   return length($in);
  127. }
  128. ################################################################
  129. ### sendmailvrfy ###############################################
  130. ################################################################
  131. sub sendmailvrfy {
  132. my ($addr,$smtp) = @_;
  133. $addr =~ s/[ t]+/ /g; # pack spaces
  134. $smtp =~ s/^s+//g; # remove spaces around $smtp
  135. $smtp =~ s/s+$//g;
  136. my $addrresolved="";
  137. if (!$addr) { return -8; }
  138. my($proto) = (getprotobyname('tcp'))[2];
  139. my($port) = (getservbyname('smtp', 'tcp'))[2];
  140. my($smtpaddr) = ($smtp =~
  141. /^(d{1,3}).(d{1,3}).(d{1,3}).(d{1,3})$/)
  142. ? pack('C4',$1,$2,$3,$4)
  143. : (gethostbyname($smtp))[4];
  144. if (!defined($smtpaddr)) { return -1; }
  145. if (!socket(S, AF_INET, SOCK_STREAM, $proto)) { return -2; }
  146. if (!connect(S, pack('Sna4x8', AF_INET, $port, $smtpaddr))) { return -3; }
  147. my($oldfh) = select(S); $| = 1; select($oldfh);
  148. $_ = <S>; if (/^[45]/) { close S; return -4; }
  149. print S "helo localhostrn";
  150. $_ = <S>; if (/^[45]/) { close S; return -5; }
  151. print S "vrfy $addrrn";
  152. $_ = <S>;
  153. if (/^[45]/) { close S; return -5; }
  154. else { $addrresolved=$_; }
  155. print S "quitrn";
  156. $_ = <S>;
  157. close S;
  158. $addrresolved=~ s/^[0-9]*s(.*)/$1/;
  159. return $addrresolved;
  160. }