--- loncom/interface/lonmsg.pm 2004/09/28 14:12:40 1.109
+++ loncom/interface/lonmsg.pm 2005/06/06 19:51:05 1.146
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Routines for messaging
#
-# $Id: lonmsg.pm,v 1.109 2004/09/28 14:12:40 matthew Exp $
+# $Id: lonmsg.pm,v 1.146 2005/06/06 19:51:05 www Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -90,7 +90,7 @@ also has a student role in the course, A
Users can ask LON-CAPA to forward messages to conventional e-mail
addresses on their B screen, but generally, LON-CAPA messages
-are much more useful then traditional email can be made to be, even
+are much more useful than traditional email can be made to be, even
with HTML support.
Right now, this document will cover just how to send a message, since
@@ -104,7 +104,7 @@ since lonmsg already implements that fun
=cut
use strict;
-use Apache::lonnet();
+use Apache::lonnet;
use vars qw($msgcount);
use HTML::TokeParser();
use Apache::Constants qw(:common);
@@ -140,24 +140,25 @@ sub packagemsg {
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'}.''.
+ $now.':'.$partsubj.':'.$env{'user.name'}.':'.
+ $env{'user.domain'}.':'.$msgcount.':'.
+ $env{'request.course.id'}.':'.$$);
+ 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{'browser.type'}.''.
+ ''.$env{'browser.os'}.''.
+ ''.$env{'browser.version'}.''.
+ ''.$env{'browser.mathml'}.''.
''.$ENV{'HTTP_USER_AGENT'}.''.
- ''.$ENV{'request.course.id'}.''.
- ''.$ENV{'request.course.sec'}.''.
- ''.$ENV{'request.role'}.''.
- ''.$ENV{'request.filename'}.''.
+ ''.$env{'request.course.id'}.''.
+ ''.$env{'request.course.sec'}.''.
+ ''.$env{'request.role'}.''.
+ ''.$env{'request.filename'}.''.
''.$msgid.''.
''.$recuser.''.
''.$recdomain.''.
@@ -209,13 +210,13 @@ sub unpackmsgid {
my ($msgid,$folder)=@_;
$msgid=&Apache::lonnet::unescape($msgid);
my $suffix=&foldersuffix($folder);
- my ($sendtime,$shortsubj,$fromname,$fromdomain)=split(/\:/,
+ my ($sendtime,$shortsubj,$fromname,$fromdomain,$count,$fromcid)=split(/\:/,
&Apache::lonnet::unescape($msgid));
my %status=&Apache::lonnet::get('email_status'.$suffix,[$msgid]);
if ($status{$msgid}=~/^error\:/) { $status{$msgid}=''; }
unless ($status{$msgid}) { $status{$msgid}='new'; }
- return ($sendtime,$shortsubj,$fromname,$fromdomain,$status{$msgid});
-}
+ return ($sendtime,$shortsubj,$fromname,$fromdomain,$status{$msgid},$fromcid);
+}
sub sendemail {
@@ -226,22 +227,24 @@ sub sendemail {
my $msg = new Mail::Send;
$msg->to($to);
$msg->subject('[LON-CAPA] '.$subject);
- my %oldENV=%ENV;
- undef(%ENV);
if (my $fh = $msg->open()) {
print $fh $body;
$fh->close;
}
- %ENV=%oldENV;
- undef(%oldENV);
}
# ==================================================== Send notification emails
sub sendnotification {
- my ($to,$touname,$toudom,$subj,$crit)=@_;
- my $sender=$ENV{'environment.firstname'}.' '.$ENV{'environment.lastname'};
+ my ($to,$touname,$toudom,$subj,$crit,$text)=@_;
+ my $sender=$env{'environment.firstname'}.' '.$env{'environment.lastname'};
+ unless ($sender=~/\w/) {
+ $sender=$env{'user.name'}.'@'.$env{'user.domain'};
+ }
my $critical=($crit?' critical':'');
+ $text=~s/\<\;/\/gs;
+ $text=~s/\<\/*[^\>]+\>//gs;
my $url='http://'.
$Apache::lonnet::hostname{&Apache::lonnet::homeserver($touname,$toudom)}.
'/adm/email?username='.$touname.'&domain='.$toudom;
@@ -250,18 +253,22 @@ You received a$critical message from $se
$subj
+=== Excerpt ============================================================
+$text
+========================================================================
+
Use
$url
-to access this message.
+to access the full message.
ENDMSG
&sendemail($to,'New'.$critical.' message from '.$sender,$body);
}
# ============================================================= Check for email
sub newmail {
- if ((time-$ENV{'user.mailcheck.time'})>300) {
+ if ((time-$env{'user.mailcheck.time'})>300) {
my %what=&Apache::lonnet::get('email_status',['recnewemail']);
&Apache::lonnet::appenv('user.mailcheck.time'=>time);
if ($what{'recnewemail'}>0) { return 1; }
@@ -346,11 +353,12 @@ sub all_url_author_res_msg {
# ================================================== Critical message to a user
sub user_crit_msg_raw {
- my ($user,$domain,$subject,$message,$sendback)=@_;
+ my ($user,$domain,$subject,$message,$sendback,$toperm)=@_;
# Check if allowed missing
my $status='';
my $msgid='undefined';
unless (($message)&&($user)&&($domain)) { $status='empty'; };
+ my $text=$message;
my $homeserver=&Apache::lonnet::homeserver($user,$domain);
if ($homeserver ne 'no_host') {
($msgid,$message)=&packagemsg($subject,$message);
@@ -359,10 +367,10 @@ sub user_crit_msg_raw {
'put:'.$domain.':'.$user.':critical:'.
&Apache::lonnet::escape($msgid).'='.
&Apache::lonnet::escape($message),$homeserver);
- if ($ENV{'request.course.id'}) {
+ if ($env{'request.course.id'}) {
&user_normal_msg_raw(
- $ENV{'course.'.$ENV{'request.course.id'}.'.num'},
- $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
+ $env{'course.'.$env{'request.course.id'}.'.num'},
+ $env{'course.'.$env{'request.course.id'}.'.domain'},
'Critical ['.$user.':'.$domain.']',
$message);
}
@@ -370,17 +378,23 @@ sub user_crit_msg_raw {
$status='no_host';
}
# Notifications
- my %userenv = &Apache::lonnet::get('environment',['critnotification'],
+ my %userenv = &Apache::lonnet::get('environment',['critnotification',
+ 'permanentemail'],
$domain,$user);
if ($userenv{'critnotification'}) {
- &sendnotification($userenv{'critnotification'},$user,$domain,$subject,1);
+ &sendnotification($userenv{'critnotification'},$user,$domain,$subject,1,
+ $text);
+ }
+ if ($toperm && $userenv{'permanentemail'}) {
+ &sendnotification($userenv{'permanentemail'},$user,$domain,$subject,1,
+ $text);
}
# Log this
&Apache::lonnet::logthis(
'Sending critical email '.$msgid.
', log status: '.
- &Apache::lonnet::log($ENV{'user.domain'},$ENV{'user.name'},
- $ENV{'user.home'},
+ &Apache::lonnet::log($env{'user.domain'},$env{'user.name'},
+ $env{'user.home'},
'Sending critical '.$msgid.' to '.$user.' at '.$domain.' with status: '
.$status));
return $status;
@@ -397,7 +411,7 @@ sub user_crit_msg_raw {
=cut
sub user_crit_msg {
- my ($user,$domain,$subject,$message,$sendback)=@_;
+ my ($user,$domain,$subject,$message,$sendback,$toperm)=@_;
my $status='';
my %userenv = &Apache::lonnet::get('environment',['msgforward'],
$domain,$user);
@@ -407,10 +421,10 @@ sub user_crit_msg {
my ($forwuser,$forwdomain)=split(/\:/,$_);
$status.=
&user_crit_msg_raw($forwuser,$forwdomain,$subject,$message,
- $sendback).' ';
+ $sendback,$toperm).' ';
}
} else {
- $status=&user_crit_msg_raw($user,$domain,$subject,$message,$sendback);
+ $status=&user_crit_msg_raw($user,$domain,$subject,$message,$sendback,$toperm);
}
return $status;
}
@@ -423,8 +437,8 @@ sub user_crit_received {
my %contents=&unpackagemsg($message{$msgid},1);
my $status='rec: '.($contents{'sendback'}?
&user_normal_msg($contents{'sendername'},$contents{'senderdomain'},
- &mt('Receipt').': '.$ENV{'user.name'}.' '.&mt('at').' '.$ENV{'user.domain'}.', '.$contents{'subject'},
- &mt('User').' '.$ENV{'user.name'}.' '.&mt('at').' '.$ENV{'user.domain'}.
+ &mt('Receipt').': '.$env{'user.name'}.' '.&mt('at').' '.$env{'user.domain'}.', '.$contents{'subject'},
+ &mt('User').' '.$env{'user.name'}.' '.&mt('at').' '.$env{'user.domain'}.
' acknowledged receipt of message'."\n".' "'.
$contents{'subject'}.'"'."\n".&mt('dated').' '.
$contents{'time'}.".\n"
@@ -434,8 +448,8 @@ sub user_crit_received {
'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 '.
+ &Apache::lonnet::log($env{'user.domain'},$env{'user.name'},
+ $env{'user.home'},'Received critical message '.
$contents{'msgid'}.
', '.$status);
return $status;
@@ -444,10 +458,12 @@ sub user_crit_received {
# ======================================================== Normal communication
sub user_normal_msg_raw {
- my ($user,$domain,$subject,$message,$citation,$baseurl,$attachmenturl)=@_;
+ my ($user,$domain,$subject,$message,$citation,$baseurl,$attachmenturl,
+ $toperm)=@_;
# Check if allowed missing
my $status='';
my $msgid='undefined';
+ my $text=$message;
unless (($message)&&($user)&&($domain)) { $status='empty'; };
my $homeserver=&Apache::lonnet::homeserver($user,$domain);
if ($homeserver ne 'no_host') {
@@ -463,21 +479,27 @@ sub user_normal_msg_raw {
('email_status',{'recnewemail'=>time},$domain,$user);
# Into sent-mail folder
$status.=' '.&Apache::lonnet::critical(
- 'put:'.$ENV{'user.domain'}.':'.$ENV{'user.name'}.
+ 'put:'.$env{'user.domain'}.':'.$env{'user.name'}.
':nohist_email_sent:'.
&Apache::lonnet::escape($msgid).'='.
- &Apache::lonnet::escape($message),$ENV{'user.home'});
+ &Apache::lonnet::escape($message),$env{'user.home'});
} else {
$status='no_host';
}
# Notifications
- my %userenv = &Apache::lonnet::get('environment',['notification'],
+ my %userenv = &Apache::lonnet::get('environment',['notification',
+ 'permanentemail'],
$domain,$user);
if ($userenv{'notification'}) {
- &sendnotification($userenv{'notification'},$user,$domain,$subject,0);
+ &sendnotification($userenv{'notification'},$user,$domain,$subject,0,
+ $text);
}
- &Apache::lonnet::log($ENV{'user.domain'},$ENV{'user.name'},
- $ENV{'user.home'},
+ if ($toperm && $userenv{'permanentemail'}) {
+ &sendnotification($userenv{'permanentemail'},$user,$domain,$subject,0,
+ $text);
+ }
+ &Apache::lonnet::log($env{'user.domain'},$env{'user.name'},
+ $env{'user.home'},
'Sending '.$msgid.' to '.$user.' at '.$domain.' with status: '.$status);
return $status;
}
@@ -493,7 +515,8 @@ sub user_normal_msg_raw {
=cut
sub user_normal_msg {
- my ($user,$domain,$subject,$message,$citation,$baseurl,$attachmenturl)=@_;
+ my ($user,$domain,$subject,$message,$citation,$baseurl,$attachmenturl,
+ $toperm)=@_;
my $status='';
my %userenv = &Apache::lonnet::get('environment',['msgforward'],
$domain,$user);
@@ -503,11 +526,11 @@ sub user_normal_msg {
my ($forwuser,$forwdomain)=split(/\:/,$_);
$status.=
&user_normal_msg_raw($forwuser,$forwdomain,$subject,$message,
- $citation,$baseurl,$attachmenturl).' ';
+ $citation,$baseurl,$attachmenturl,$toperm).' ';
}
} else {
$status=&user_normal_msg_raw($user,$domain,$subject,$message,
- $citation,$baseurl,$attachmenturl);
+ $citation,$baseurl,$attachmenturl,$toperm);
}
return $status;
}
@@ -523,20 +546,31 @@ sub folderlist {
&mt('Folder').': '.
&Apache::loncommon::select_form($folder,'folder',
('' => &mt('INBOX'),'trash' => &mt('TRASH'),
+ 'new' => &mt('New Messages Only'),
+ 'critical' => &mt('Critical'),
'sent' => &mt('Sent Messages'),
map { $_ => $_ } @allfolders)).
- ' '.&mt('Show').' '.
- &Apache::loncommon::select_form($interdis,'interdis',
-(' 10' => '10', ' 20' => '20', ' 50' => '50', '100' => '100', '200' => '200')).
+ ' '.&mt('Show').
+ ''.
' '.
+ ''.
+ ($folder=~/^(new|critical)/?'':'');
+}
+
+sub scrollbuttons {
+ my ($start,$maxdis,$first,$finish,$total)=@_;
+ unless ($total>0) { return ''; }
+ $start++; $maxdis++;$first++;$finish++;
+ return
''.
''.
- ''.
+ ' of '.$maxdis.
''.
- ''.
- ''.
- &mt('View Critical Messages').''.
- '';
+ ' '.
+ &mt('Messages [_1] through [_2] of [_3]',$first,$finish,$total).'';
}
# =============================================================== Folder suffix
@@ -568,6 +602,10 @@ sub statuschange {
sub makefolder {
my ($newfolder)=@_;
+ if (($newfolder eq 'sent')
+ || ($newfolder eq 'critical')
+ || ($newfolder eq 'trash')
+ || ($newfolder eq 'new')) { return; }
&Apache::lonnet::put('email_folders',{$newfolder => time});
}
@@ -575,7 +613,7 @@ sub makefolder {
sub movemsg {
my ($msgid,$srcfolder,$trgfolder)=@_;
- my $unmsgid=&Apache::lonnet::unescape($msgid);
+ if ($srcfolder eq 'new') { $srcfolder=''; }
my $srcsuffix=&foldersuffix($srcfolder);
my $trgsuffix=&foldersuffix($trgfolder);
@@ -584,16 +622,13 @@ sub movemsg {
&Apache::lonnet::put('nohist_email'.$trgsuffix,{$msgid => $message{$msgid}});
# Copy status
- my %status=&Apache::lonnet::get('email_status'.$srcsuffix,[$unmsgid]);
- &Apache::lonnet::put('email_status'.$trgsuffix,{$unmsgid => $status{$unmsgid}});
-# See if was deleted -> becomes "read" in trash
- my $currentstatus=(&unpackmsgid($status{$unmsgid}),$srcfolder);
- if ($currentstatus eq 'deleted') {
- &statuschange($msgid,'read',$trgfolder);
+ unless ($trgfolder eq 'trash') {
+ my %status=&Apache::lonnet::get('email_status'.$srcsuffix,[$msgid]);
+ &Apache::lonnet::put('email_status'.$trgsuffix,{$msgid => $status{$msgid}});
}
# Delete orginals
&Apache::lonnet::del('nohist_email'.$srcsuffix,[$msgid]);
- &Apache::lonnet::del('email_status'.$srcsuffix,[$unmsgid]);
+ &Apache::lonnet::del('email_status'.$srcsuffix,[$msgid]);
}
# ======================================================= Display a course list
@@ -602,9 +637,9 @@ sub discourse {
my $r=shift;
my $classlist = &Apache::loncoursedata::get_classlist();
my $now=time;
- my %lt=&Apache::lonlocal::texthash('cfa' => 'Check for All',
- 'cfs' => 'Check for Section/Group',
- 'cfn' => 'Check for None');
+ my %lt=&Apache::lonlocal::texthash('cfa' => 'Check All',
+ 'cfs' => 'Check Section/Group',
+ 'cfn' => 'Uncheck All');
$r->print(<
-
+
ENDDISHEADER
@@ -655,23 +690,33 @@ ENDDISHEADER
'
('.$_.'),
'.$role.'
');
}
}
- $r->print('
');
- while (my ($student,$info) = each(%$classlist)) {
+ $r->print('
');
+ my $sort = sub {
+ my $aname=lc($classlist->{$a}[&Apache::loncoursedata::CL_FULLNAME()]);
+ if (!$aname) { $aname=$a; }
+ my $bname=lc($classlist->{$b}[&Apache::loncoursedata::CL_FULLNAME()]);
+ if (!$bname) { $bname=$b; }
+ return $aname cmp $bname;
+ };
+ foreach my $student (sort $sort (keys(%{$classlist}))) {
+ my $info=$classlist->{$student};
my ($sname,$sdom,$status,$fullname,$section) =
(@{$info}[&Apache::loncoursedata::CL_SNAME(),
&Apache::loncoursedata::CL_SDOM(),
&Apache::loncoursedata::CL_STATUS(),
&Apache::loncoursedata::CL_FULLNAME(),
&Apache::loncoursedata::CL_SECTION()]);
- # next if ($status ne 'Active');
- my $key = 'send_to_&&&'.$section.'&&&'.$student;
+ next if ($status ne 'Active');
+ next if ($env{'request.course.sec'} &&
+ $section ne $env{'request.course.sec'});
+ my $key = 'send_to_&&&'.$section.'&&&_'.$student;
if (! defined($fullname) || $fullname eq '') { $fullname = $sname; }
$r->print('
'.$sname.'@'.$sdom.'
'.$section.
+ qq{}.(' 'x2).
+ $fullname.'
'.$sname.'@'.$sdom.'
'.$section.
'
');
}
- $r->print('
');
+ $r->print('');
}
# ==================================================== Display Critical Message
@@ -679,28 +724,27 @@ ENDDISHEADER
sub discrit {
my $r=shift;
my $header = '