--- loncom/interface/lonmsg.pm 2001/07/28 04:16:29 1.11
+++ loncom/interface/lonmsg.pm 2003/04/02 00:50:46 1.53
@@ -1,7 +1,31 @@
# The LearningOnline Network with CAPA
-#
# Routines for messaging
#
+# $Id: lonmsg.pm,v 1.53 2003/04/02 00:50:46 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
@@ -13,36 +37,45 @@
# 10/19,10/20,10/30,
# 02/06/01 Gerd Kortemeyer
# 07/27 Guy Albertelli
-# 07/27 Gerd Kortemeyer
-
+# 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 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)=@_;
- $message=~s/\\<\;/g;
- $message=~s/\>/\>\;/g;
- $citation=~s/\\<\;/g;
- $citation=~s/\>/\>\;/g;
- $subject=~s/\\<\;/g;
- $subject=~s/\>/\>\;/g;
+ 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);
- $partsubj=substr($partsubj,0,50);
my $msgid=&Apache::lonnet::escape(
$now.':'.$partsubj.':'.$ENV{'user.name'}.':'.
$ENV{'user.domain'}.':'.$msgcount.':'.$$);
- return $msgid,
- ''.$ENV{'user.name'}.' '.
+ my $result=''.$ENV{'user.name'}.' '.
''.$ENV{'user.domain'}.' '.
''.$subject.' '.
''.localtime($now).' '.
@@ -58,14 +91,23 @@ sub packagemsg {
''.$ENV{'request.role'}.' '.
''.$ENV{'request.filename'}.' '.
''.$msgid.' '.
- ''.$message.' '.
- ''.$citation.' ';
+ ''.$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=shift;
+ my ($message,$notoken)=@_;
my %content=();
my $parser=HTML::TokeParser->new(\$message);
my $token;
@@ -76,6 +118,16 @@ sub unpackagemsg {
$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;
}
@@ -91,6 +143,53 @@ sub unpackmsgid {
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/login&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 {
@@ -113,23 +212,37 @@ sub author_res_msg {
# ================================================== Critical message to a user
-sub user_crit_msg {
- my ($user,$domain,$subject,$message)=@_;
+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') {
- my $msgid;
($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: '.
@@ -140,53 +253,109 @@ sub user_crit_msg {
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 $message=shift;
- my %contents=&unpackagemsg($message);
- my $status='rec: '.
+ 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 "'.
- $contents{'subject'}.'" dated '.$contents{'time'}.".\n\n"
- .'Message ID: '.$contents{'msgid'});
+ ' 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});
+ &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 {
- my ($user,$domain,$subject,$message,$citation)=@_;
+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') {
- my $msgid;
- ($msgid,$message)=&packagemsg($subject,$message,$citation);
+ ($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 {
@@ -198,56 +367,121 @@ sub statuschange {
($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});
+ }
}
-# ===================================================================== Handler
-sub handler {
+# ======================================================= 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);
+ }
+ }
+}
- return OK if $r->header_only;
+# ==================================================== Display Critical Message
-# --------------------------- Get query string for limited number of parameters
+sub discrit {
+ my $r=shift;
+ my $header = '
Critical Messages '.
+ '');
+}
- 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') ||
- ($name eq 'sendreply') || ($name eq 'compose')) {
- unless ($ENV{'form.'.$name}) {
- $ENV{'form.'.$name}=$value;
- }
- }
- } (split(/&/,$ENV{'QUERY_STRING'}));
+# =============================================================== Compose reply
-# --------------------------------------------------------------- Render Output
-
- $r->print('EMail and Messaging ');
- $r->print(
- ' ');
- $r->print('EMail ');
- 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('Subject: '.$content{'subject'}.
- 'From: '.$content{'sendername'}.' at '.
- $content{'senderdomain'}.
- 'Time: '.$content{'time'}.' Functions: '.
- 'Reply '.
- $content{'message'}.' '.$content{'citation'});
- } elsif ($ENV{'form.replyto'}) {
- my $msgid=$ENV{'form.replyto'};
+sub comprep {
+ my ($r,$msgid)=@_;
my %message=&Apache::lonnet::get('nohist_email',[$msgid]);
- my %content=&unpackagemsg($message{$msgid});
+ my %content=&unpackagemsg($message{$msgid},1);
my $quotemsg='> '.$content{'message'};
$quotemsg=~s/\r/\n/g;
$quotemsg=~s/\f/\n/g;
@@ -255,74 +489,469 @@ sub handler {
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';
+ ' Send as critical message ' . $crithelp .
+ ' '.
+ ' Send as critical message ' .
+ ' and return receipt' . $crithelp . '
';
}
$r->print(<<"ENDREPLY");
ENDREPLY
+}
+
+# ======================================================== Display all messages
+
+sub disall {
+ my $r=shift;
+ $r->print(<
+ function checkall() {
+ for (i=0; i
+ENDDISHEADER
+ $r->print(
+ 'Display All Messages '.
+ ''.
+ '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");
+
+$dismsg
+
+$dispcrit
+
+ENDCOMP
+ } else { # $broadcast is 'upload'
+ $r->print(<
+Generate messages from a file
+
+Subject:
+
+General message text
+$dismsg
+
+
+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
+
+
+
+
+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'}.''.
+ '
'.
+ &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});
+ my %content=&unpackagemsg($message{$msgid},1);
&statuschange($msgid,'replied');
- $r->print('Sending: '.&user_normal_msg($content{'sendername'},
+ 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'}) {
- } elsif ($ENV{'form.mark'}) {
- } elsif ($ENV{'form.compose'}) {
- my $dispcrit='';
- if (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) {
- $dispcrit=
- ' Send as critical message';
+ &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(<<"ENDCOMP");
-
-
-Subject:
-
-
-$dispcrit
-
-
-ENDCOMP
+ $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 {
- $r->print('  Date '.
- 'Username Domain Subject Status ');
- 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('Open '.localtime($sendtime).' '.
- $fromname.' '.$fromdomain.' '.
- &Apache::lonnet::unescape($shortsubj).' '.
- $status.' ');
- } sort split(/\&/,&Apache::lonnet::reply('keys:'.
- $ENV{'user.domain'}.':'.
- $ENV{'user.name'}.':nohist_email',
- $ENV{'user.home'}));
- $r->print('
');
-
+ &disall($r);
}
$r->print('