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

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 getmsg.pl
  20. # @ 
  21. # @ Description view messages using POP protocol.
  22. # @ 
  23. # @ Version 0.6
  24. # @ 
  25. # @ ----------------------------------------------------------------------------------------------------------
  26. use Mail::POP3Client;
  27. use MIME::Parser;
  28. use CGI::Carp qw(fatalsToBrowser);
  29. require $APP_PATH."config.pl";
  30. require $APP_PATH."common.pl";
  31. #obtain the FORM information that has been passed by using
  32. #the param() method of the cgi object.
  33. &ReadParse;
  34. $loginname =  $in{'loginname'};
  35. $password =   $in{'password'}; # encrypted password !!!
  36. $POPserver =  $in{'POPserver'};
  37. $msgid =      $in{'id'};
  38. $cache     =  $in{'cache'};
  39. $browser = $ENV{'HTTP_USER_AGENT'};
  40. $|=1;
  41. #clear the $body variable.
  42. $body ="";
  43. #create a POP connection using the POP3client module by
  44. #creating an object called $pop of type POP3Client. See
  45. #POP3Client.pm documentation.
  46. $pop = new Mail::POP3Client( USER=>$loginname,
  47. PASSWORD=> decryptit($password),
  48. HOST=>$POPserver,
  49. AUTH_MODE=>$POPauth
  50. );
  51. $MessageCount = $pop->Count;
  52. print "Content-type: text/htmlnn";
  53. print "<HTML><HEAD><TITLE>NSC WebMail";
  54. print "</TITLE>";
  55. if ($cache eq "No") { print "<META HTTP-EQUIV='Pragma' CONTENT='no-cache'>"; }
  56. if ($browser =~ /Mozilla/2/) {
  57. print "<SCRIPT LANGUAGE='JavaScript'><!-- Hide JavaScript from old browsersn";
  58. print "function goBack()n";
  59. print "{n";
  60. print "history.go(-1)n";
  61. print "}n";
  62. print "//---- End hiding JavaScript --></SCRIPT>n";
  63. }
  64. print "</HEAD>";
  65. print "<BODY BGCOLOR='FFFFFF'>";
  66. #print "<font size='+2'>Message $msgid</font>";
  67. $message="";
  68. foreach ($pop->HeadAndBody($msgid)) {
  69. $message.=$_."n";
  70. }
  71. my $parser = new MIME::Parser;
  72. $parser->output_dir($temppath);
  73. $parser->output_prefix("msg$msgid");
  74. my $entity = $parser->parse_data($message);
  75. # Get the head, a MIME::Head:
  76. my $head = $entity->head;
  77. $head->unfold;
  78. $head->decode();
  79. $from=$head->get('from');
  80. $from=~ s/"//g;
  81. $replyto=$head->get('reply-to');
  82. $replyto=~ s/"//g;
  83. $to=$head->get('To');
  84. $to=~ s/"//g;
  85. $cc=$head->get('cc');
  86. $cc=~ s/"//g;
  87. $date=$head->get('date');
  88. $sub=$head->get('subject');
  89. my $messagestored="";
  90. my $bodysend="";
  91. undef @attach;
  92. if ($entity->parts) {
  93. for ($i=0;$i<$entity->parts;$i++) {   
  94. $ent=$entity->parts($i);  
  95. $type = lc($ent->mime_type);
  96. # Get the body, as a MIME::Body;
  97. $body = $ent->bodyhandle;
  98. if ($body) {
  99. # Where's the data?
  100. if ($type=~ m/text/) {
  101. if ($type=~ m/text/plain/) {
  102. $messagestored.="<hr>" if ($i > 0);
  103. $messagestored.="<pre>";
  104.                 $messagestored.= htmlize($body->as_string);
  105. $messagestored.="</pre>";
  106.   }
  107. elsif ($type=~ m/text/html/) {
  108. $messagestored.= $body->as_string;
  109. }
  110. $bodysend.=substr($body->as_string,0,1000);
  111. $ent->purge;
  112. } elsif ($type=~ m/image//) {
  113. $messagestored.="<hr>" if ($i > 0);
  114. $messagestored.="<br><img src="";
  115. my $path = $body->path;
  116. $bodysend.="n[ $path ]n";
  117. $path=~ s/$temppath/?(.*)/$tempurl/$1/;
  118. $messagestored.="$path">";
  119. push @attach,$path;
  120. } else {   # data is on disk:
  121. my $path = $body->path;
  122. $path=~ s/$temppath/?(.*)/$tempurl/$1/;
  123. push @attach,$path;
  124. }    
  125. }
  126. # we may have multipart included inside multipart
  127. elsif ($type =~ m/multipart/) {
  128. my $entityinside = $ent;
  129. if ($entityinside->parts) {
  130. for ($j=0;$j<$entityinside->parts;$j++) {
  131.          $entin=$entityinside->parts($j);
  132.         $typein = lc($entin->mime_type);
  133.         # Get the body, as a MIME::Body;
  134.         $bodyin = $entin->bodyhandle;
  135. $messagestored.="<pre>".htmlize($bodyin->as_string)."</pre>" if ($typein =~ m/text/plain/);
  136.   $messagestored.=$bodyin->as_string if ($typein =~
  137. m/text/html/);
  138. $bodysend.=substr($bodyin->as_string,0,1000) if
  139. (!$bodysend);
  140. }
  141. }
  142. }
  143. }   
  144. } else {
  145. $body = $entity->bodyhandle;
  146. if (lc($entity->mime_type)=~ m/text/plain/) {
  147. $messagestored.="<pre>";
  148. }
  149. $messagestored.= htmlize($body->as_string);
  150. if (lc($entity->mime_type)=~ m/text/plain/) {
  151. $messagestored.="</pre>";
  152. }
  153. $bodysend.=substr($body->as_string,0,1000);
  154. $entity->purge;
  155. }
  156. print "<center><TABLE border=0><TR>";
  157. $msg_prev=$msg_next=$msgid;
  158. if ($msgid > 1) { $msg_prev = $msgid-1;  }
  159. if ($msgid < $MessageCount) { $msg_next = $msgid+1; }
  160. if ($msg_prev != $msgid) {
  161. print "<TD><FORM METHOD='POST'  ACTION='".$CGI_PATH_NSWM."getmsg.pl' NAME='lire$msg_prev'>n";
  162. print "<INPUT TYPE='submit' VALUE='&lt;'>n";
  163. print "<INPUT TYPE='hidden' NAME='id' VALUE=$msg_prev >n";
  164. print "<INPUT TYPE='hidden' NAME='loginname' VALUE=$loginname   >n";
  165. print "<INPUT TYPE='hidden' NAME='password' VALUE=$password    >n";
  166. print "<INPUT TYPE='hidden' NAME='POPserver' VALUE=$POPserver   >n";
  167. print "<INPUT TYPE='hidden' NAME='cache' VALUE=$cache    >n";
  168. print "</FORM></TD>";
  169. }
  170. print "<TD valign=center><font size='+1'># $msgid</font></TD>";
  171. if ($msg_next != $msgid) {
  172. print "<TD><FORM METHOD='POST'  ACTION='".$CGI_PATH_NSWM."getmsg.pl' NAME='lire$msg_next'>n";
  173. print "<INPUT TYPE='submit' VALUE='&gt;'>n";
  174. print "<INPUT TYPE='hidden' NAME='id' VALUE=$msg_next >n";
  175. print "<INPUT TYPE='hidden' NAME='loginname' VALUE=$loginname   >n";
  176. print "<INPUT TYPE='hidden' NAME='password' VALUE=$password    >n";
  177. print "<INPUT TYPE='hidden' NAME='POPserver' VALUE=$POPserver   >n";
  178. print "<INPUT TYPE='hidden' NAME='cache' VALUE=$cache    >n";
  179. print "</FORM></TD>";
  180. }
  181. # Now create a button which will enable a user to generate a reply.
  182. # As usual, the button is loaded with hidden values to permit a message
  183. # to actually be sent at a later time.
  184. if ($replyto == '') { $replyto = $from;  }
  185. print "<TD ALIGN=CENTER>n";
  186. print "<FORM METHOD='POST' ACTION='".$CGI_PATH_NSWM."sendform.pl' name=reMailForm>n";
  187. print "<INPUT TYPE='submit'                       VALUE='$answertext'>n";
  188. print "<INPUT TYPE='hidden'  NAME='loginname'     VALUE=$loginname>n";
  189. print "<INPUT TYPE='hidden'  NAME='password'      VALUE=$password>n";
  190. print "<INPUT TYPE='hidden'  NAME='POPserver'     VALUE=$POPserver>n";
  191. print "<INPUT TYPE='hidden'  NAME='to'            VALUE="",he($replyto),"">n";
  192. print "<INPUT TYPE='hidden'  NAME="subject"       VALUE="",he("Re: $sub"),"">n";
  193. print "<INPUT TYPE='hidden'  NAME='body'          VALUE="",he($bodysend),"">n";
  194. print "<INPUT TYPE='hidden'  NAME='cache'         VALUE=$cache>n";
  195. print "</FORM></TD>n";
  196. print "<TD ALIGN=CENTER>n";
  197. print "<FORM METHOD='POST' ACTION='".$CGI_PATH_NSWM."sendform.pl' name=fwdMailForm>n";
  198. print "<INPUT TYPE='submit'                       VALUE='$fwdtext'>n";
  199. print "<INPUT TYPE='hidden'  NAME='loginname'     VALUE=$loginname>n";
  200. print "<INPUT TYPE='hidden'  NAME='password'      VALUE=$password>n";
  201. print "<INPUT TYPE='hidden'  NAME='POPserver'     VALUE=$POPserver>n";
  202. print "<INPUT TYPE='hidden'  NAME='to'            VALUE="">n";
  203. print "<INPUT TYPE='hidden'  NAME="subject"       VALUE="",he("Fwd: $sub"),"">n";
  204. print "<INPUT TYPE='hidden'  NAME='body'          VALUE="",he($bodysend),"">n";
  205. print "<INPUT TYPE='hidden'  NAME='cache'         VALUE=$cache>n";
  206. print "</FORM></TD>n";
  207. #for each message header, also provide a FORM button to
  208. #delete using inbox.pl As above, pass in the needed vars
  209. #using hidden types.
  210. print "<TD ALIGN=CENTER>n";
  211. print "<FORM METHOD='POST' ACTION='".$CGI_PATH_NSWM."inbox.pl'>n";
  212. print "<INPUT TYPE='submit'                   VALUE='$deletetext' OnClick="return confirm('$deleteconfirmtext');"  >n";
  213. print "<INPUT TYPE='hidden' NAME='loginname'  VALUE=$loginname >n";
  214. print "<INPUT TYPE='hidden' NAME='password'   VALUE=$password  >n";
  215. print "<INPUT TYPE='hidden' NAME='POPserver'  VALUE=$POPserver >n";
  216. print "<INPUT TYPE='hidden' NAME='deleteMsg'  VALUE=$msgid         >n";
  217. print "<INPUT TYPE='hidden' NAME='cache'      VALUE=$cache  >n";
  218. print "</FORM></TD></TR></TABLE>";
  219. $from=he($from);
  220. $to=he($to);
  221. $cc=he($cc);
  222. print "</center><table border=0 width=100%><tr bgcolor=lightblue><td><font face=arial><ul>";
  223. print "$totext: $to <br>n";
  224. print "Cc: $cc <br>n" if ($cc ne"");
  225. print "$fromtext: <b>$from</b><br>n";
  226. print "$subjecttext: <b>$sub</b>  <br>n";
  227. $date=~ s/.*,(.*)+.*/$1/;
  228. print "$datetext: $date <br>n";
  229. if (defined(@attach)) {
  230. print "$attachtext:<ol>";
  231. foreach $attach (@attach) {
  232. my $file=$attach; $file=~s/$tempurl///;
  233. $size = (stat("$temppath/$file"))[7];
  234. print "<li><a href="$attach" target=_blank>$file</a> ",int(($size+512)/1024)."kn";
  235. }
  236. print "</ol>";
  237. }
  238. print "</ul></font></td></tr></table>";
  239. print "<br><font face=times size=+1>";
  240. print $messagestored;
  241. #close the POP connection using the close() method
  242. $pop->Close();
  243. #send the ending html code (/body and /head tags)
  244. print "</BODY></HTML>n";
  245. exit;
  246. #-----------------------------SUBROUTINES------------------------
  247. sub decodeHexChars {
  248. ($text)=@_;
  249. for ($t=0; $t<=length($text); $t++) {
  250. if (substr($text, $t, 1) eq "=") {
  251. $char=chr(hex(substr($text,$t+1,2)));
  252. substr($text,$t,3,$char);
  253. }
  254. }
  255. return $text;
  256. }
  257. sub ReadParse {
  258. local(*in)=@_ if @_;
  259. local ($i,$key,$val);
  260. if ($ENV{'REQUEST_METHOD'} eq "GET") {
  261. $in=$ENV{'QUERY_STRING'};
  262. }
  263. elsif ($ENV{'REQUEST_METHOD'} eq "POST") {
  264. read(STDIN,$in,$ENV{'CONTENT_LENGTH'});
  265. }
  266. @in=split(/&/,$in);
  267. foreach $i (0 .. $#in) {
  268. $in[$i] =~ s/+/ /g;
  269. ($key,$val)=split(/=/,$in[$i],2);
  270. $key =~ s/%(..)/pack("c",hex($1))/ge;
  271. $val =~ s/%(..)/pack("c",hex($1))/ge;
  272. $in{$key} .= "" if (defined($in{$key}));
  273. $in{$key} .=$val;
  274. }
  275. return length($in);
  276. }
  277. sub htmlize {
  278. my ($line,$out);
  279. foreach $line (@_) {
  280. # order of following lines is dependent!
  281. # char < and >
  282. $line=~s,<, &lt; ,g;
  283. $line=~s,>, &gt; ,g;
  284. # e-mail
  285. $line=~s,(wS+@S+w).*,<a href="mailto:$1">$1</a>,g;
  286. # http and ftp
  287. $line=~s,(h*[t|f]tp://[^)|s|,]+w[^.s])([).]*),<a href="$1">$1</a>$2,g;
  288. # quoting (in color!)
  289. $line=~s,^( &gt; s*.*),<font color="#666666"><i>$1 </i></font>,;
  290. $line=~s,^(:s+.*),<font color="#666666"><i>$1</i></font>,;
  291. # nuke spaces around &lt; | &gt;
  292. $line=~s, (&[l|g]t;) ,$1,g;
  293. $out.=$line;
  294. }
  295. return $out;
  296. }
  297. sub he { # HtmlEscape
  298. my ($line,$out);
  299. foreach $line (@_) {
  300. $line=~s/</&lt;/g;
  301. $line=~s/>/&gt;/g;
  302. $line=~s/"/&quote;/g;
  303. $out.=$line;
  304. }
  305. return $out;
  306. }
  307. ##############################
  308. #  GetHeader Subroutine      #
  309. ##############################
  310. sub GetHeader {
  311.   #for the message identified by the 'id'
  312.   #passed in the FORM, POP the header to
  313.   #get the 'Subject' and 'From' info. Why? Because if the
  314.   #are passed in the header and one is greater than 256 characters
  315.   #the browser will chop it off.
  316.   #This is unlikely, but we want to cover any
  317.   #eventuality.
  318.   my @headers=$pop->Head($msgid);
  319.   while ($_ = shift @headers) {
  320.     #parse out the From line from the header.
  321.     #Also, remove any angle brackets
  322.     #since some SMTP servers choke on these, but
  323.     #some POP clients send them anyway.  (Not to mention
  324.     #but browsers tend to ignore them as unknown
  325.     #HTML codes.
  326.     if (/^From:/ ){
  327.       $from = $_; #assign the targeted line to the variable
  328.       $from =~ s/From:s+//;  #remove leading "From:" and any following whitespace
  329.       $from =~s/"//g; #remove any quote marks & match contents
  330.       if ($from =~/<(.*@.*)>/) { #delete angle brackets & match anything inside w/ "@"
  331. $from2 = $1;     #use electronic address, if available
  332.       }
  333.       else {
  334. $from2 = $from;     #else, use the quoted name
  335.       }
  336.     }# end if From
  337.     #parse out the "reply-to" line, if it exists...
  338.     $replyto = ''; #create the variable, but leave it empty
  339.     if (/^Reply-To:/) {
  340.       $replyto = $';
  341.       $replyto =~ s/s+//; #remove intervening white space
  342.       $replyto =~ s/</&lt;/;   #make angle brackets browser safe
  343.       $replyto =~ s/>/&gt;/;
  344.     }
  345.     
  346.     #parse out the subject line.
  347.     if  (/^Subject:/) {
  348.       #once the target phrase is found,
  349.       #capture everything following it with the
  350.       # $' PERL system function.
  351.       $sub = $';
  352.       $sub =~ s/s+//;   #remove leading white space
  353.     }
  354.     
  355.     #parse out the date line.
  356.     if  (/^Date:/) {
  357.       #once the target phrase is found,
  358.       #capture everything following it with the
  359.       # $' PERL system function.
  360.       $date = $';
  361.       $date =~ s/s+//;   #remove leading white space
  362.     }
  363.     if  (/^Content-Type:/) {
  364.       #once the target phrase is found,
  365.       #capture everything following it with the
  366.       # $' PERL system function.
  367.       $ctype = $';
  368.       $ctype =~ s/s+//;   #remove leading white space
  369.     }
  370.     if  (/boundary=/) {
  371.       #once the target phrase is found,
  372.       #capture everything following it with the
  373.       # $' PERL system function.
  374.       $bound = $';
  375.       $bound =~ s/"(.*)"/$1/;   #remove leading white space
  376.     }
  377.     #parse out the recipient line.
  378.     if (/^To:/) {
  379.       #once the target phrase is found,
  380.       #capture everything following it with the
  381.       # $' PERL system function.
  382.       $to = $';
  383.       $to =~ s/s+//;      #remove leading white space
  384.       #support for multi-line To:
  385.       while ($headers[0] =~ m/^ +/) {
  386. my $tmp = shift @headers;
  387. $tmp =~ s/s+//;
  388. $to .= $tmp;
  389.       }
  390.       $to =~ s/</&lt;/g;   #make angle brackets browser safe
  391.       $to =~ s/>/&gt;/g;      
  392.     }
  393.     #parse out the recipient line.
  394.     if ((/^CC:/)||(/^Cc:/)) {
  395.       #once the target phrase is found,
  396.       #capture everything following it with the
  397.       # $' PERL system function.
  398.       $cc = $';
  399.       $cc =~ s/s+//;      #remove leading white space
  400.       $cc =~ s/</&lt;/;   #make angle brackets browser safe
  401.       $cc =~ s/>/&gt;/;      
  402.     }
  403.   }
  404. }