# The LearningOnline Network with CAPA # Routines for messaging # # $Id: lonmsg.pm,v 1.54 2003/04/02 14:57:32 www Exp $ # # Copyright Michigan State University Board of Trustees # # This file is part of the LearningOnline Network with CAPA (LON-CAPA). # # LON-CAPA is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # LON-CAPA is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with LON-CAPA; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # /home/httpd/html/adm/gpl.txt # # http://www.lon-capa.org/ # # # (Routines to control the menu # # (TeX Conversion Module # # 05/29/00,05/30 Gerd Kortemeyer) # # 10/05 Gerd Kortemeyer) # # 10/19,10/20,10/30, # 02/06/01 Gerd Kortemeyer # 07/27 Guy Albertelli # 07/27,07/28,07/30,08/03,08/06,08/08,08/09,08/10,8/13,8/15, # 10/1,11/5 Gerd Kortemeyer # YEAR=2002 # 1/1,3/18 Gerd Kortemeyer # package Apache::lonmsg; use strict; use Apache::lonnet(); use vars qw($msgcount); use HTML::TokeParser(); use Apache::Constants qw(:common); use Apache::loncommon(); use Apache::lontexconvert(); use HTML::Entities(); use Mail::Send; # ===================================================================== Package sub packagemsg { my ($subject,$message,$citation,$baseurl,$attachmenturl)=@_; $message =&HTML::Entities::encode($message); $citation=&HTML::Entities::encode($citation); $subject =&HTML::Entities::encode($subject); #remove machine specification $baseurl =~ s|^http://[^/]+/|/|; $baseurl =&HTML::Entities::encode($baseurl); #remove machine specification $attachmenturl =~ s|^http://[^/]+/|/|; $attachmenturl =&HTML::Entities::encode($attachmenturl); my $now=time; $msgcount++; my $partsubj=$subject; $partsubj=&Apache::lonnet::escape($partsubj); my $msgid=&Apache::lonnet::escape( $now.':'.$partsubj.':'.$ENV{'user.name'}.':'. $ENV{'user.domain'}.':'.$msgcount.':'.$$); my $result=''.$ENV{'user.name'}.''. ''.$ENV{'user.domain'}.''. ''.$subject.''. ''. ''.$ENV{'SERVER_NAME'}.''. ''.$ENV{'HTTP_HOST'}.''. ''.$ENV{'REMOTE_ADDR'}.''. ''.$ENV{'browser.type'}.''. ''.$ENV{'browser.os'}.''. ''.$ENV{'browser.version'}.''. ''.$ENV{'browser.mathml'}.''. ''.$ENV{'HTTP_USER_AGENT'}.''. ''.$ENV{'request.course.id'}.''. ''.$ENV{'request.role'}.''. ''.$ENV{'request.filename'}.''. ''.$msgid.''. ''.$message.''; if (defined($citation)) { $result.=''.$citation.''; } if (defined($baseurl)) { $result.= ''.$baseurl.''; } if (defined($attachmenturl)) { $result.= ''.$attachmenturl.''; } return $msgid,$result; } # ================================================== Unpack message into a hash sub unpackagemsg { my ($message,$notoken)=@_; my %content=(); my $parser=HTML::TokeParser->new(\$message); my $token; while ($token=$parser->get_token) { if ($token->[0] eq 'S') { my $entry=$token->[1]; my $value=$parser->get_text('/'.$entry); $content{$entry}=$value; } } if ($content{'attachmenturl'}) { my ($fname,$ft)=($content{'attachmenturl'}=~/\/(\w+)\.(\w+)$/); if ($notoken) { $content{'message'}.='

Attachment: '.$fname.'.'.$ft.''; } else { $content{'message'}.='

Attachment: '.$fname.'.'.$ft.''; } } return %content; } # ======================================================= Get info out of msgid sub unpackmsgid { my $msgid=&Apache::lonnet::unescape(shift); my ($sendtime,$shortsubj,$fromname,$fromdomain)=split(/\:/, &Apache::lonnet::unescape($msgid)); 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}); } sub sendemail { my ($to,$subject,$body)=@_; $body= "*** This is an automatic message generated by the LON-CAPA system.\n". "*** Please do not reply to this address.\n\n".$body; my $msg = new Mail::Send; $msg->to($to); $msg->subject('[LON-CAPA] '.$subject); my $fh = $msg->open('smtp',Server => 'localhost'); print $fh $body; $fh->close; } # ==================================================== Send notification emails sub sendnotification { my ($to,$touname,$toudom,$subj,$crit)=@_; my $sender=$ENV{'environment.firstname'}.' '.$ENV{'environment.lastname'}; my $critical=($crit?' critical':''); my $url='http://'. $Apache::lonnet::hostname{&Apache::lonnet::homeserver($touname,$toudom)}. '/adm/email?username='.$touname.'&domain='.$toudom; my $body=(<300) { my %what=&Apache::lonnet::get('email_status',['recnewemail']); &Apache::lonnet::appenv('user.mailcheck.time'=>time); if ($what{'recnewemail'}>0) { return 1; } } return 0; } # =============================== Automated message to the author of a resource sub author_res_msg { my ($filename,$message)=@_; unless ($message) { return 'empty'; } $filename=&Apache::lonnet::declutter($filename); my ($domain,$author,@dummy)=split(/\//,$filename); my $homeserver=&Apache::lonnet::homeserver($author,$domain); if ($homeserver ne 'no_host') { my $id=unpack("%32C*",$message); my $msgid; ($msgid,$message)=&packagemsg($filename,$message); return &Apache::lonnet::reply('put:'.$domain.':'.$author. ':nohist_res_msgs:'. &Apache::lonnet::escape($filename.'_'.$id).'='. &Apache::lonnet::escape($message),$homeserver); } return 'no_host'; } # ================================================== Critical message to a user sub user_crit_msg_raw { my ($user,$domain,$subject,$message,$sendback)=@_; # Check if allowed missing my $status=''; my $msgid='undefined'; unless (($message)&&($user)&&($domain)) { $status='empty'; }; my $homeserver=&Apache::lonnet::homeserver($user,$domain); if ($homeserver ne 'no_host') { ($msgid,$message)=&packagemsg($subject,$message); if ($sendback) { $message.='true'; } $status=&Apache::lonnet::critical( 'put:'.$domain.':'.$user.':critical:'. &Apache::lonnet::escape($msgid).'='. &Apache::lonnet::escape($message),$homeserver); if ($ENV{'request.course.id'}) { &user_normal_msg_raw( $ENV{'course.'.$ENV{'request.course.id'}.'.num'}, $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}, 'Critical ['.$user.':'.$domain.']', $message); } } else { $status='no_host'; } # Notifications my %userenv = &Apache::lonnet::get('environment',['critnotification'], $domain,$user); if ($userenv{'critnotification'}) { &sendnotification($userenv{'critnotification'},$user,$domain,$subject,1); } # Log this &Apache::lonnet::logthis( '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)); return $status; } # New routine that respects "forward" and calls old routine sub user_crit_msg { my ($user,$domain,$subject,$message,$sendback)=@_; my $status=''; my %userenv = &Apache::lonnet::get('environment',['msgforward'], $domain,$user); my $msgforward=$userenv{'msgforward'}; if ($msgforward) { foreach (split(/\,/,$msgforward)) { my ($forwuser,$forwdomain)=split(/\:/,$_); $status.= &user_crit_msg_raw($forwuser,$forwdomain,$subject,$message, $sendback).' '; } } else { $status=&user_crit_msg_raw($user,$domain,$subject,$message,$sendback); } return $status; } # =================================================== Critical message received sub user_crit_received { my $msgid=shift; my %message=&Apache::lonnet::get('critical',[$msgid]); my %contents=&unpackagemsg($message{$msgid},1); my $status='rec: '.($contents{'sendback'}? &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'."\n".' "'. $contents{'subject'}.'"'."\n".'dated '. $contents{'time'}.".\n" ):'no msg req'); $status.=' trans: '. &Apache::lonnet::put( 'nohist_email',{$contents{'msgid'} => $message{$msgid}}); $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); return $status; } # ======================================================== Normal communication sub user_normal_msg_raw { my ($user,$domain,$subject,$message,$citation,$baseurl,$attachmenturl)=@_; # Check if allowed missing my $status=''; my $msgid='undefined'; unless (($message)&&($user)&&($domain)) { $status='empty'; }; my $homeserver=&Apache::lonnet::homeserver($user,$domain); if ($homeserver ne 'no_host') { ($msgid,$message)=&packagemsg($subject,$message,$citation,$baseurl, $attachmenturl); $status=&Apache::lonnet::critical( 'put:'.$domain.':'.$user.':nohist_email:'. &Apache::lonnet::escape($msgid).'='. &Apache::lonnet::escape($message),$homeserver); &Apache::lonnet::put ('email_status',{'recnewemail'=>time},$domain,$user); } else { $status='no_host'; } # Notifications my %userenv = &Apache::lonnet::get('environment',['notification'], $domain,$user); if ($userenv{'notification'}) { &sendnotification($userenv{'notification'},$user,$domain,$subject,0); } &Apache::lonnet::log($ENV{'user.domain'},$ENV{'user.name'}, $ENV{'user.home'}, 'Sending '.$msgid.' to '.$user.' at '.$domain.' with status: '.$status); return $status; } # New routine that respects "forward" and calls old routine sub user_normal_msg { my ($user,$domain,$subject,$message,$citation,$baseurl,$attachmenturl)=@_; my $status=''; my %userenv = &Apache::lonnet::get('environment',['msgforward'], $domain,$user); my $msgforward=$userenv{'msgforward'}; if ($msgforward) { foreach (split(/\,/,$msgforward)) { my ($forwuser,$forwdomain)=split(/\:/,$_); $status.= &user_normal_msg_raw($forwuser,$forwdomain,$subject,$message, $citation,$baseurl,$attachmenturl).' '; } } else { $status=&user_normal_msg_raw($user,$domain,$subject,$message, $citation,$baseurl,$attachmenturl); } return $status; } # =============================================================== Status Change sub statuschange { my ($msgid,$newstatus)=@_; my %status=&Apache::lonnet::get('email_status',[$msgid]); if ($status{$msgid}=~/^error\:/) { $status{$msgid}=''; } unless ($status{$msgid}) { $status{$msgid}='new'; } unless (($status{$msgid} eq 'replied') || ($status{$msgid} eq 'forwarded')) { &Apache::lonnet::put('email_status',{$msgid => $newstatus}); } if (($newstatus eq 'deleted') || ($newstatus eq 'new')) { &Apache::lonnet::put('email_status',{$msgid => $newstatus}); } } # ======================================================= Display a course list sub discourse { my $r=shift; my %courselist=&Apache::lonnet::dump( 'classlist', $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}, $ENV{'course.'.$ENV{'request.course.id'}.'.num'}); my $now=time; $r->print(<    

ENDDISHEADER foreach (sort keys %courselist) { my ($end,$start)=split(/\:/,$courselist{$_}); my $active=1; if (($end) && ($now>$end)) { $active=0; } if ($active) { my ($sname,$sdom)=split(/\:/,$_); my %reply=&Apache::lonnet::get('environment', ['firstname','middlename','lastname','generation'], $sdom,$sname); my $section=&Apache::lonnet::usection ($sdom,$sname,$ENV{'request.course.id'}); $r->print( '
'. $reply{'firstname'}.' '. $reply{'middlename'}.' '. $reply{'lastname'}.' '. $reply{'generation'}. ' ('.$_.') '.$section); } } } # ==================================================== Display Critical Message sub discrit { my $r=shift; my $header = '

Critical Messages

'. '
'. ''; my %what=&Apache::lonnet::dump('critical'); my $result = ''; foreach (sort keys %what) { my %content=&unpackagemsg($what{$_}); next if ($content{'senderdomain'} eq ''); $content{'message'}=~s/\n/\/g; $result.='
From: '. &Apache::loncommon::aboutmewrapper( &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).' ('. $content{'sendername'}.'@'. $content{'senderdomain'}.') '.$content{'time'}. '
Subject: '.$content{'subject'}. '
'. &Apache::lontexconvert::msgtexconverted($content{'message'}). '
'. ''. ''; } # Check to see if there were any messages. if ($result eq '') { $result = "

You have no critical messages.

"; } else { $r->print($header); } $r->print($result); $r->print(''); } # =============================================================== Compose reply sub comprep { my ($r,$msgid)=@_; my %message=&Apache::lonnet::get('nohist_email',[$msgid]); my %content=&unpackagemsg($message{$msgid},1); my $quotemsg='> '.$content{'message'}; $quotemsg=~s/\r/\n/g; $quotemsg=~s/\f/\n/g; $quotemsg=~s/\n+/\n\> /g; my $subject='Re: '.$content{'subject'}; my $dispcrit=''; if (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) { my $crithelp = Apache::loncommon::help_open_topic("Course_Critical_Message"); $dispcrit= ' Send as critical message ' . $crithelp . '
'. ' Send as critical message ' . ' and return receipt' . $crithelp . '

'; } $r->print(<<"ENDREPLY");

Subject:

$dispcrit

ENDREPLY } # ======================================================== Display all messages sub disall { my $r=shift; $r->print(< function checkall() { for (i=0; i ENDDISHEADER $r->print( '

Display All Messages

'. ''. ''); foreach (sort split(/\&/,&Apache::lonnet::reply('keys:'. $ENV{'user.domain'}.':'. $ENV{'user.name'}.':nohist_email', $ENV{'user.home'}))) { my ($sendtime,$shortsubj,$fromname,$fromdomain,$status)= &Apache::lonmsg::unpackmsgid($_); if (($status ne 'deleted') && defined($sendtime) && $sendtime!~/error/) { if ($status eq 'new') { $r->print(''); } elsif ($status eq 'read') { $r->print(''); } elsif ($status eq 'replied') { $r->print(''); } else { $r->print(''); } $r->print(''. ''); } } $r->print('
 DateUsernameDomainSubjectStatus
OpenDelete'.localtime($sendtime).''. $fromname.''.$fromdomain.''. &Apache::lonnet::unescape($shortsubj).''. $status.'

'. 'Check All '. 'Uncheck All

'. ''. '

'); } # ============================================================== Compose output sub compout { my ($r,$forwarding,$broadcast)=@_; my $dispcrit=''; my $dissub=''; my $dismsg=''; my $func='Send New'; if (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) { my $crithelp = Apache::loncommon::help_open_topic("Course_Critical_Message"); $dispcrit= ' Send as critical message ' . $crithelp . '
'. ' Send as critical message ' . ' and return receipt' . $crithelp . '

'; } if ($forwarding) { $dispcrit.=''; $func='Forward'; my %message=&Apache::lonnet::get('nohist_email',[$forwarding]); my %content=&unpackagemsg($message{$forwarding}); $dissub='Forwarding: '.$content{'subject'}; $dismsg='Forwarded message from '. $content{'sendername'}.' at '.$content{'senderdomain'}; } my $defdom=$ENV{'user.domain'}; if ($ENV{'form.recdom'}) { $defdom=$ENV{'form.recdom'}; } $r->print( '

'."\n". ''."\n". ''); unless (($broadcast eq 'group') || ($broadcast eq 'upload')) { my $domform = &Apache::loncommon::select_dom_form($defdom,'recdomain'); my $selectlink=&Apache::loncommon::selectstudent_link ('compemail','recuname','recdomain'); $r->print(<<"ENDREC");
ENDREC } if ($broadcast ne 'upload') { $r->print(<<"ENDCOMP");
Username:$selectlink
Domain: $domform
Additional Recipients
username\@domain,username\@domain, ...
Subject:

$dispcrit ENDCOMP } else { # $broadcast is 'upload' $r->print(<

Generate messages from a file

Subject:

General message text

The file format for the uploaded portion of the message is:

username1\@domain1: text
username2\@domain2: text
username3\@domain1: text

The messages will be assembled from all lines with the respective username\@domain, and appended to the general message text.

$dispcrit ENDUPLOAD } if ($broadcast eq 'group') { &discourse; } $r->print('

'); } # ---------------------------------------------------- Display all face to face sub disfacetoface { my ($r,$user,$domain)=@_; unless ($ENV{'request.course.id'}) { return; } unless (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) { return; } my %records=&Apache::lonnet::dump('nohist_email', $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}, $ENV{'course.'.$ENV{'request.course.id'}.'.num'}, '%255b'.$user.'%253a'.$domain.'%255d'); my $result=''; foreach (sort keys %records) { my %content=&unpackagemsg($records{$_}); next if ($content{'senderdomain'} eq ''); $content{'message'}=~s/\n/\/g; if ($content{'subject'}=~/^Record/) { $result.='

Record

'; } else { $result.='

Sent Message

'; %content=&unpackagemsg($content{'message'}); $content{'message'}= 'Subject: '.$content{'subject'}.'
'. $content{'message'}; } $result.='By: '. &Apache::loncommon::aboutmewrapper( &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).' ('. $content{'sendername'}.'@'. $content{'senderdomain'}.') '.$content{'time'}. '
'. &Apache::lontexconvert::msgtexconverted($content{'message'}). '
'; } # Check to see if there were any messages. if ($result eq '') { $r->print("

No notes, face-to-face discussion records, or critical messages in this course.

"); } else { $r->print($result); } } # ---------------------------------------------------------------- Face to face sub facetoface { my ($r,$stage)=@_; unless (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) { return; } # from query string if ($ENV{'form.recname'}) { $ENV{'form.recuname'}=$ENV{'form.recname'}; } if ($ENV{'form.recdom'}) { $ENV{'form.recdomain'}=$ENV{'form.recdom'}; } my $defdom=$ENV{'user.domain'}; # already filled in if ($ENV{'form.recdomain'}) { $defdom=$ENV{'form.recdomain'}; } # generate output my $domform = &Apache::loncommon::select_dom_form($defdom,'recdomain'); my $stdbrws = &Apache::loncommon::selectstudent_link ('stdselect','recuname','recdomain'); $r->print(<<"ENDTREC");

User Notes, Records of Face-To-Face Discussions, and Critical Messages in Course

Username: $stdbrws
Domain: $domform
ENDTREC if (($stage ne 'query') && ($ENV{'form.recdomain'}) && ($ENV{'form.recuname'})) { chomp($ENV{'form.newrecord'}); if ($ENV{'form.newrecord'}) { &user_normal_msg_raw( $ENV{'course.'.$ENV{'request.course.id'}.'.num'}, $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}, 'Record ['.$ENV{'form.recuname'}.':'.$ENV{'form.recdomain'}.']', $ENV{'form.newrecord'}); } $r->print('

'.&Apache::loncommon::plainname($ENV{'form.recuname'}, $ENV{'form.recdomain'}).'

'); &disfacetoface($r,$ENV{'form.recuname'},$ENV{'form.recdomain'}); $r->print(< ENDRHEAD $r->print(<New Record (record is visible to course faculty and staff)

ENDBFORM } } # ===================================================================== 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 &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['display','replyto','forward','markread','markdel','markunread', 'sendreply','compose','sendmail','critical','recname','recdom', 'recordftf']); # ------------------------------------------------------ They checked for email &Apache::lonnet::put('email_status',{'recnewemail'=>0}); # --------------------------------------------------------------- Render Output if (!$ENV{'form.display'}) { $r->print('EMail and Messaging'. &Apache::loncommon::studentbrowser_javascript().''. &Apache::loncommon::bodytag('EMail and Messages')); } if ($ENV{'form.display'}) { my $msgid=$ENV{'form.display'}; &statuschange($msgid,'read'); my %message=&Apache::lonnet::get('nohist_email',[$msgid]); my %content=&unpackagemsg($message{$msgid}); $r->print('EMail and Messaging'); if (defined($content{'baseurl'})) { $r->print(""); } $r->print(&Apache::loncommon::studentbrowser_javascript(). ''. &Apache::loncommon::bodytag('EMail and Messages')); $r->print('Subject: '.$content{'subject'}. '
From: '. &Apache::loncommon::aboutmewrapper( &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}), $content{'sendername'},$content{'senderdomain'}).' ('. $content{'sendername'}.' at '. $content{'senderdomain'}.') '. '
Time: '.$content{'time'}.'

'. ''. ''. ''. ''. ''. ''. '
Functions:ReplyForwardMark UnreadDeleteDisplay all Messages

'.
             &Apache::lontexconvert::msgtexconverted($content{'message'}).
             '

'.$content{'citation'}); } elsif ($ENV{'form.replyto'}) { &comprep($r,$ENV{'form.replyto'}); } elsif ($ENV{'form.sendreply'}) { my $msgid=$ENV{'form.sendreply'}; my %message=&Apache::lonnet::get('nohist_email',[$msgid]); my %content=&unpackagemsg($message{$msgid},1); &statuschange($msgid,'replied'); if ((($ENV{'form.critmsg'}) || ($ENV{'form.sendbck'})) && (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'}))) { $r->print('Sending critical: '. &user_crit_msg($content{'sendername'}, $content{'senderdomain'}, $ENV{'form.subject'}, $ENV{'form.message'}, $ENV{'form.sendbck'})); } else { $r->print('Sending: '.&user_normal_msg($content{'sendername'}, $content{'senderdomain'}, $ENV{'form.subject'}, $ENV{'form.message'})); } if ($ENV{'form.displayedcrit'}) { &discrit($r); } else { &disall($r); } } elsif ($ENV{'form.confirm'}) { foreach (keys %ENV) { if ($_=~/^form\.rec\_(.*)$/) { $r->print('Confirming Receipt: '. &user_crit_received($1).'
'); } if ($_=~/^form\.reprec\_(.*)$/) { my $msgid=$1; $r->print('Confirming Receipt: '. &user_crit_received($msgid).'
'); &comprep($r,$msgid); } } &discrit($r); } elsif ($ENV{'form.critical'}) { &discrit($r); } elsif ($ENV{'form.forward'}) { &compout($r,$ENV{'form.forward'}); } elsif ($ENV{'form.markread'}) { } elsif ($ENV{'form.markdel'}) { &statuschange($ENV{'form.markdel'},'deleted'); &disall($r); } elsif ($ENV{'form.markeddel'}) { my $total=0; foreach (keys %ENV) { if ($_=~/^form\.delmark_(.*)$/) { &statuschange(&Apache::lonnet::unescape($1),'deleted'); $total++; } } $r->print('Deleted '.$total.' message(s)

'); &disall($r); } elsif ($ENV{'form.markunread'}) { &statuschange($ENV{'form.markunread'},'new'); &disall($r); } elsif ($ENV{'form.compose'}) { &compout($r,'',$ENV{'form.compose'}); } elsif ($ENV{'form.recordftf'}) { &facetoface($r,$ENV{'form.recordftf'}); } elsif ($ENV{'form.sendmail'}) { my %content=(); undef %content; if ($ENV{'form.forwid'}) { my $msgid=$ENV{'form.forwid'}; my %message=&Apache::lonnet::get('nohist_email',[$msgid]); %content=&unpackagemsg($message{$msgid},1); &statuschange($msgid,'forwarded'); $ENV{'form.message'}.="\n\n-- Forwarded message --\n\n". $content{'message'}; } my %toaddr=(); undef %toaddr; if ($ENV{'form.sendmode'} eq 'group') { foreach (keys %ENV) { if ($_=~/^form\.send\_to\_\&\&\&[^\&]*\&\&\&\_(.+)$/) { $toaddr{$1}=''; } } } elsif ($ENV{'form.sendmode'} eq 'upload') { foreach (split(/[\n\r\f]+/,$ENV{'form.upfile'})) { my ($rec,$txt)=split(/\s*\:\s*/,$_); if ($txt) { $rec=~s/\@/\:/; $toaddr{$rec}.=$txt."\n"; } } } else { $toaddr{$ENV{'form.recuname'}.':'.$ENV{'form.recdomain'}}=''; } if ($ENV{'form.additionalrec'}) { foreach (split(/\,/,$ENV{'form.additionalrec'})) { my ($auname,$audom)=split(/\@/,$_); $toaddr{$auname.':'.$audom}=''; } } foreach (keys %toaddr) { my ($recuname,$recdomain)=split(/\:/,$_); my $msgtxt=$ENV{'form.message'}; if ($toaddr{$_}) { $msgtxt.='


'.$toaddr{$_}; } if ((($ENV{'form.critmsg'}) || ($ENV{'form.sendbck'})) && (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'}))) { $r->print('Sending critical: '. &user_crit_msg($recuname,$recdomain, $ENV{'form.subject'}, $msgtxt, $ENV{'form.sendbck'})); } else { $r->print('Sending: '.&user_normal_msg($recuname,$recdomain, $ENV{'form.subject'}, $msgtxt, $content{'citation'})); } $r->print('
'); } if ($ENV{'form.displayedcrit'}) { &discrit($r); } else { &disall($r); } } else { &disall($r); } $r->print(''); return OK; } # ================================================= Main program, reset counter BEGIN { $msgcount=0; } 1; __END__