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

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://aufrere.citeweb.net/nsc/
  15. # @ ----------------------------------------------------------------------------------------------------------
  16. # @ 
  17. # @ Project NS WebMail
  18. # @ 
  19. # @ Filename inbox.pl
  20. # @ 
  21. # @ Description inbox manager for NS WebMail
  22. # @ 
  23. # @ Version 1.0
  24. # @ 
  25. # @ ----------------------------------------------------------------------------------------------------------
  26. use Mail::POP3Client;
  27. require $APP_PATH."config.pl";
  28. require $APP_PATH."common.pl";
  29. #use the $cgi object method param() to
  30. #acquire the FORM variables passed by
  31. #the client browser.
  32. &ReadParse;
  33. $loginname = $in{'loginname'};
  34. $password  = decryptit($in{'password'});
  35. $POPserver = $in{'POPserver'};
  36. $lastMsg   = $in{'lastMsg'};
  37. $deleteMsg = $in{'deleteMsg'};
  38. $cache     = $in{'cache'};
  39. $|=1;
  40. #if deleteMsg is not null, then this script has been called by the
  41. #Delete Message button.  We will open a POP client object, delete
  42. #the indicated message, then close the POP object to actually force
  43. #the POP server to make the deletion.  The rest of the script will
  44. #then play out and re-open the POP object.  By closing and reopening
  45. #we will obtain an updated count that correctly does not include the
  46. #recently deleted message.
  47. if ($deleteMsg) {
  48. $pop = new Mail::POP3Client( USER=>$loginname, 
  49. PASSWORD=>$password, 
  50. HOST=>$POPserver,
  51. AUTH_MODE=>$POPauth
  52. );
  53. $pop->Delete($deleteMsg);
  54. $pop->Close();
  55. $deleteMsg = "";
  56. $pop = "";
  57. sleep(1); # Gives the POP time to close and be ready for another
  58. # open attempt.
  59. }
  60. #Begin production of HTML code.
  61. print "Content-type: text/htmlnn";
  62. print "<HTML><HEAD><TITLE>NS WM Message Retrieval</TITLE>";
  63. if ($cache eq "No") { print "<META HTTP-EQUIV='Pragma' CONTENT='no-cache'>"; 
  64. print "</HEAD>n<BODY BGCOLOR='#FFFFFF' LINK=$linkcolor
  65. VLINK=$linkcolor ALINK=$linkcolor>";
  66. }
  67. else                { print "</HEAD>n<BODY BGCOLOR='FF8F8F'>";
  68. }
  69. #print "<b><font size='+2'>NikoSoft WebMail</font></b><hr>";
  70. print "<center>n";
  71. #Create a (possibly new) POP connection with the POP3Client object.
  72. $pop = new Mail::POP3Client( USER=>$loginname, 
  73. PASSWORD=>$password, 
  74. HOST=>$POPserver,
  75. AUTH_MODE=>$POPauth
  76. );
  77. #How many messages are there in the inbox provided by the $pop object?
  78. $MessageCount = $pop->Count;
  79. #gather additional size info
  80. @MessageSize = $pop->ListArray;
  81. print "<table><tr><td>";
  82. #if $pop->count is -1, then the POP connection failed.
  83. if ($MessageCount == -1) {
  84. print "</table><font size=+1>$POPserver: $loginname, $incorrectlogin";
  85. print "</body></html>";
  86. exit;
  87. }
  88. #if $pop->count is 0, there are no messages in the POP account
  89. elsif ($MessageCount == 0) {
  90.         print "<b> $nomailon <i>$POPserver</i> </b>";
  91. }
  92. #if $pop->count is >0, then that is the number of messages in the
  93. #POP account inbox.
  94. else {  print "<img src=$MAIL_IMG valign=middle>&nbsp;&nbsp;";
  95. print "<b>$MessageCount $messagesininbox (",$pop->Size," $bytestotaltext).</b>n";
  96. }
  97. print "</td></tr></table>n";
  98. if ($MessageCount != -1) { #equivalent to knowing a valid POP account was used...
  99. #Parse the message headers to output a list of message
  100. #header info including SUBJECT,FROM,DATE,and TO.
  101. #each message will have a read & delete button as well
  102. #and these three elements will be organized in a table
  103. if ($MessageCount > 0) {
  104. print "<table border=0 cellpadding=2 cellspacing=0 width=90% align=center>";
  105. print "<tr bgcolor=darkblue><td><b><font color=white>$fromtext</b></td><td><b><font color=white>$subjecttext</b></td><td><b><font color=white>$datetext</b></td><td><font color=white>$sizetext</font></td><td>&nbsp;</td>";
  106.         &ParseHeaders();
  107. print "</table>";
  108. }
  109. }
  110. #close the POP connection smoothly.
  111. $pop->Close;
  112. #send the ending html code (/body and /head tags)
  113. print "</BODY></HTML>";
  114. exit;
  115. #----------------------------------SUBROUTINES-------------------------
  116. # Decode quoted strings (in From: and Subject)
  117. sub DecodeQuoted {
  118.   my $tmp = $_[0];
  119.   if ($tmp =~ m/=?ISO-dddd-d?.?/i) {
  120.     $tmp =~ s/=([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
  121.     $tmp =~ s/=?ISO-dddd-d?.?(.*)?=/$1/i;
  122.     $tmp =~ s/_/ /g;
  123.   }
  124.   return $tmp;
  125. }
  126. #-----------------------------Sub ParseHeaders-----------------------------
  127. #Subroutine to parse the headers on each message to exctract the TO:, FROM:,
  128. # DATE:, and SUBJECT: information.
  129. #--------------------------------------------------------------------------
  130. sub ParseHeaders {
  131.   #loop through the messages in the POP account space
  132.   
  133.   #loop backwards, displaying most recent messages first
  134.   #Also note that only the most recent 100 messages will be displayed from
  135.   #
  136.   
  137.   if ($lastMsg == "") { $lastMsg = $MessageCount };
  138.   
  139.   for ($i=$lastMsg; $i >= 1 && $i> $lastMsg-100; $i--) {
  140.     
  141.     
  142.     #for each message header, provide a FORM button to
  143.     #invoke getmessage.pl and hand that routine the message
  144.     #number. Pass the login,pass,server info again since
  145.     #the web protocol does not provide for continued connections.
  146.     if ( (($i)/2) == int(($i)/2) ) {
  147.       print "<tr>n";
  148.     } else {
  149.       print "<tr bgcolor=$lightbgcolor>n";
  150.     }
  151.     
  152.     $sub = $nosubject;
  153.     $from = '';
  154.     $to = '';
  155.     $date = '';
  156.     $replyto = '';
  157.     
  158.     #obtain each header with the head() method in POP3Client.
  159.     
  160.     foreach ($pop->Head($i)){
  161.       #for each line within the message header retrieved, parse
  162.       #the From,To,Date,Subject fields by finding
  163.       #the appropriate strings at the beginning
  164.       #of each line
  165.       if (/^From:/ ){
  166. $from = $'; #Get string following the succesful match.
  167. $from = DecodeQuoted($from);
  168. $fromtmp=$from;
  169. $fromtmp=~ s/<[^ ]>//g;
  170. $fromtmp=~ s/(.*)s*/$1/;
  171. $from =~ s/</&lt;/; #Strip out angled brackets to prevent browsers
  172. $from =~ s/>/&gt;/; #from interpreting them as unknown HTML codes.
  173. $from=$fromtmp if ($fromtmp);
  174.       }
  175.       elsif (/^To:/) {
  176. $to = $';
  177.       }
  178.       elsif (/^Subject:/) {
  179. $sub = $';
  180. $sub = DecodeQuoted($sub);
  181.       }
  182.       elsif (/^Date:/) {
  183. $date = $';
  184.       }
  185.     }
  186.     $date=~ s/.*,(.*)+.*/$1/;
  187.     
  188.     $date="<small>$date</small>";
  189.     
  190.     $size=$MessageSize[$i];
  191.     $size="<small>".int(($size+512)/1024)."k</small>";
  192.     print "<td>$from&nbsp;</td><td>";
  193. print "<a
  194. href="getmsg.pl?id=$i&loginname=$loginname&POPserver=$POPserver&cache=$cache&password=".cryptit($password).""><b>$sub</b></a>";
  195. print "</td><td>$date&nbsp;</td><td>$size</td>";
  196.   
  197.     #for each message header, also provide a FORM button to
  198.     #delete using inbox.pl As above, pass in the needed vars
  199.     #using hidden types.
  200.     print "<td><FORM METHOD='POST' ACTION='".$CGI_PATH_NSWM."inbox.pl'     >n";
  201.     print     "<INPUT TYPE='hidden' NAME='loginname'  VALUE=$loginname >n";
  202.     print     "<INPUT TYPE='hidden' NAME='password'   VALUE="".cryptit($password)."" >n";
  203.     print     "<INPUT TYPE='hidden' NAME='POPserver'  VALUE=$POPserver >n";
  204.     print     "<INPUT TYPE='hidden' NAME='deleteMsg'  VALUE=$i  >n";
  205.     print     "<INPUT TYPE='hidden' NAME='cache'      VALUE=$cache >n";
  206.     print     "<INPUT TYPE='submit'                   VALUE='$deletetext'  OnClick="return confirm('$deleteconfirmtext');">n";
  207.     print     "</td></FORM></tr>n";
  208.   }
  209. }
  210. ###############################################################################
  211. sub ReadParse {
  212.   local(*in)=@_ if @_;
  213.   local ($i,$key,$val);
  214.   
  215.   if ($ENV{'REQUEST_METHOD'} eq "GET") {
  216.     $in=$ENV{'QUERY_STRING'};
  217.   }
  218.   elsif ($ENV{'REQUEST_METHOD'} eq "POST") {
  219.     read(STDIN,$in,$ENV{'CONTENT_LENGTH'});
  220.   }
  221.   
  222.   @in=split(/&/,$in);
  223.   
  224.   foreach $i (0 .. $#in) {
  225.     $in[$i] =~ s/+/ /g;
  226.     ($key,$val)=split(/=/,$in[$i],2);
  227.     $key =~ s/%(..)/pack("c",hex($1))/ge;
  228.     $val =~ s/%(..)/pack("c",hex($1))/ge;
  229.     $in{$key} .= "" if (defined($in{$key}));
  230.     $in{$key} .=$val;
  231.   }
  232.   return length($in);
  233. }