--- loncom/interface/lonmsg.pm 2000/10/20 14:40:26 1.3 +++ loncom/interface/lonmsg.pm 2001/02/06 16:51:24 1.6 @@ -10,7 +10,8 @@ # # 10/05 Gerd Kortemeyer) # -# 10/19,10/20 Gerd Kortemeyer +# 10/19,10/20,10/30, +# 02/06/01 Gerd Kortemeyer package Apache::lonmsg; @@ -18,6 +19,7 @@ use strict; use Apache::lonnet(); use vars qw($msgcount); use HTML::TokeParser; +use Apache::Constants qw(:common); # ===================================================================== Package @@ -29,8 +31,12 @@ sub packagemsg { $subject=~s/\>/\>\;/g; my $now=time; $msgcount++; - my $msgid=$now.'_'.$ENV{'user.name'}.'_'. - $ENV{'user.domain'}.'_'.$msgcount.'_'.$$; + my $partsubj=$subject; + $partsubj=&Apache::lonnet::escape($partsubj); + $partsubj=substr($partsubj,0,50); + my $msgid=&Apache::lonnet::escape( + $now.':'.$partsubj.':'.$ENV{'user.name'}.':'. + $ENV{'user.domain'}.':'.$msgcount.':'.$$); return $msgid, ''.$ENV{'user.name'}.''. ''.$ENV{'user.domain'}.''. @@ -68,6 +74,19 @@ sub unpackagemsg { return %content; } +# ======================================================= Get info out of msgid + +sub unpackmsgid { + my $msgid=shift; + my ($sendtime,$shortsubj,$fromname,$fromdomain)=split(/\:/, + &Apache::lonnet::unescape( + &Apache::lonnet::unescape($_))); + my %status=&Apache::lonnet::get('email_status',$msgid); + if ($status{$msgid}=~/^error\:/) { $status{$msgid}=''; } + unless ($status{$msgid}) { $status{$msgid}='new'; } + return ($sendtime,$shortsubj,$fromname,$fromdomain,$status{$msgid}); +} + # =============================== Automated message to the author of a resource sub author_res_msg { @@ -100,17 +119,20 @@ sub user_crit_msg { if ($homeserver ne 'no_host') { my $msgid; ($msgid,$message)=&packagemsg($subject,$message); - $status=&Apache::lonnet::cput('critical',$msgid => $message); + $status=&Apache::lonnet::critical( + 'put:'.$domain.':'.$user.':critical:'. + &Apache::lonnet::escape($msgid).'='. + &Apache::lonnet::escape($message),$homeserver); } else { $status='no_host'; } &Apache::lonnet::logthis( - 'INFO: Sending critical email '.$msgid. + 'Sending critical email '.$msgid. ', log status: '. &Apache::lonnet::log($ENV{'user.domain'},$ENV{'user.name'}, $ENV{'user.home'}, 'Sending critical '.$msgid.' to '.$user.' at '.$domain.' with status: ' - .$status).''); + .$status)); return $status; } @@ -118,7 +140,22 @@ sub user_crit_msg { sub user_crit_received { my $message=shift; - + my %contents=&unpackagemsg($message); + my $status='rec: '. + &user_normal_msg($contents{'sendername'},$contents{'senderdomain'}, + 'Receipt: '.$ENV{'user.name'}.' at '.$ENV{'user.domain'}, + 'User '.$ENV{'user.name'}.' at '.$ENV{'user.domain'}. + ' acknowledged receipt of message "'. + $contents{'subject'}.'" dated '.$contents{'time'}.".\n\n" + .'Message ID: '.$contents{'msgid'}); + $status.=' trans: '. + &Apache::lonnet::put('nohist_email',$contents{'msgid'} => $message); + $status.=' del: '. + &Apache::lonnet::del('critical',$contents{'msgid'}); + &Apache::lonnet::log($ENV{'user.domain'},$ENV{'user.name'}, + $ENV{'user.home'},'Received critical message '. + $contents{'msgid'}. + ', '.$status); } # ======================================================== Normal communication @@ -133,7 +170,10 @@ sub user_normal_msg { if ($homeserver ne 'no_host') { my $msgid; ($msgid,$message)=&packagemsg($subject,$message); - $status=&Apache::lonnet::cput('nohist_email',$msgid => $message); + $status=&Apache::lonnet::critical( + 'put:'.$domain.':'.$user.':nohist_email:'. + &Apache::lonnet::escape($msgid).'='. + &Apache::lonnet::escape($message),$homeserver); } else { $status='no_host'; } @@ -143,6 +183,72 @@ sub user_normal_msg { return $status; } +# ===================================================================== Handler + +sub handler { + my $r=shift; + +# ----------------------------------------------------------- Set document type + + $r->content_type('text/html'); + $r->send_http_header; + + return OK if $r->header_only; + +# --------------------------- Get query string for limited number of parameters + + map { + my ($name, $value) = split(/=/,$_); + $value =~ tr/+/ /; + $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; + if (($name eq 'display') || ($name eq 'replyto') || + ($name eq 'forward') || ($name eq 'mark')) { + unless ($ENV{'form.'.$name}) { + $ENV{'form.'.$name}=$value; + } + } + } (split(/&/,$ENV{'QUERY_STRING'})); + +# --------------------------------------------------------------- Render Output + + $r->print('EMail and Messaging'); + $r->print(''); + $r->print('

EMail

'); + if ($ENV{'form.display'}) { + } elsif ($ENV{'form.replyto'}) { + } elsif ($ENV{'form.forward'}) { + } elsif ($ENV{'form.mark'}) { + } else { + $r->print(''. + ''); + map { + my ($sendtime,$shortsubj,$fromname,$fromdomain,$status)= + &Apache::lonmsg::unpackmsgid($_); + if ($status eq 'new') { + $r->print(''); + } elsif ($status eq 'read') { + $r->print(''); + } elsif ($status eq 'replied') { + $r->print(''); + } else { + $r->print(''); + } + $r->print(''); + } sort split(/\&/,&Apache::lonnet::reply('keys:'. + $ENV{'user.domain'}.':'. + $ENV{'user.name'}.':nohist_email', + $ENV{'user.home'})); + $r->print('
 DateUsernameDomainSubjectStatus
Open'.localtime($sendtime).''. + $fromname.''.$fromdomain.''. + &Apache::lonnet::unescape($shortsubj).''. + $status.'
'); + + } + $r->print(''); + return OK; + +} # ================================================= Main program, reset counter sub BEGIN {