--- loncom/interface/lonmsg.pm 2006/12/05 02:55:53 1.187
+++ loncom/interface/lonmsg.pm 2006/12/27 18:00:00 1.192
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Routines for messaging
#
-# $Id: lonmsg.pm,v 1.187 2006/12/05 02:55:53 albertel Exp $
+# $Id: lonmsg.pm,v 1.192 2006/12/27 18:00:00 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -47,7 +47,7 @@ use LONCAPA qw(:DEFAULT :match);
sub packagemsg {
my ($subject,$message,$citation,$baseurl,$attachmenturl,
- $recuser,$recdomain,$msgid,$type,$crsmsgid)=@_;
+ $recuser,$recdomain,$msgid,$type,$crsmsgid,$symb,$error)=@_;
$message =&HTML::Entities::encode($message,'<>&"');
$citation=&HTML::Entities::encode($citation,'<>&"');
$subject =&HTML::Entities::encode($subject,'<>&"');
@@ -78,7 +78,7 @@ sub packagemsg {
my $msgcount = &get_uniq();
unless(defined($msgid)) {
$msgid = &buildmsgid($now,$subject,$env{'user.name'},$env{'user.domain'},
- $msgcount,$course_context,$$);
+ $msgcount,$course_context,$symb,$error,$$);
}
my $result = ''.$env{'user.name'}.''.
''.$env{'user.domain'}.''.
@@ -134,7 +134,18 @@ sub packagemsg {
if (defined($attachmenturl)) {
$result.= ''.$attachmenturl.'';
}
- return $msgid,$result;
+ if (defined($symb)) {
+ $result.= ''.$symb.'';
+ if (defined($course_context)) {
+ if ($course_context eq $env{'request.course.id'}) {
+ my $resource_title = &Apache::lonnet::gettitle($symb);
+ if (defined($resource_title)) {
+ $result .= ''.$resource_title.'';
+ }
+ }
+ }
+ }
+ return ($msgid,$result);
}
# ================================================== Unpack message into a hash
@@ -178,19 +189,21 @@ sub unpackagemsg {
# ======================================================= Get info out of msgid
sub buildmsgid {
- my ($now,$subject,$uname,$udom,$msgcount,$course_context,$pid) = @_;
+ my ($now,$subject,$uname,$udom,$msgcount,$course_context,$symb,$error,$pid) = @_;
$subject=&escape($subject);
+ $symb = &escape($symb);
return(&escape($now.':'.$subject.':'.$uname.':'.
- $udom.':'.$msgcount.':'.$course_context.':'.$pid));
+ $udom.':'.$msgcount.':'.$course_context.':'.$pid.':'.$symb.':'.$error));
}
sub unpackmsgid {
my ($msgid,$folder,$skipstatus,$status_cache)=@_;
$msgid=&unescape($msgid);
my ($sendtime,$shortsubj,$fromname,$fromdomain,$count,$fromcid,
- $processid)=split(/\:/,&unescape($msgid));
+ $processid,$symb,$error) = split(/\:/,&unescape($msgid));
$shortsubj = &unescape($shortsubj);
$shortsubj = &HTML::Entities::decode($shortsubj);
+ $symb = &unescape($symb);
if (!defined($processid)) { $fromcid = ''; }
my %status=();
unless ($skipstatus) {
@@ -203,7 +216,7 @@ sub unpackmsgid {
if ($status{$msgid}=~/^error\:/) { $status{$msgid}=''; }
unless ($status{$msgid}) { $status{$msgid}='new'; }
}
- return ($sendtime,$shortsubj,$fromname,$fromdomain,$status{$msgid},$fromcid);
+ return ($sendtime,$shortsubj,$fromname,$fromdomain,$status{$msgid},$fromcid,$symb,$error);
}
@@ -223,7 +236,7 @@ sub sendemail {
my $msg = new Mail::Send;
$msg->to($to);
$msg->subject('[LON-CAPA] '.$subject);
- if ($senderaddress) { $msg->add('Reply-to',$senderaddress); }
+ if ($senderaddress) { $msg->add('Reply-to',$senderaddress); $msg->add('From',$senderaddress); }
if (my $fh = $msg->open()) {
print $fh $body;
$fh->close;
@@ -379,24 +392,29 @@ sub store_instructor_comment {
sub user_crit_msg_raw {
my ($user,$domain,$subject,$message,$sendback,$toperm,$sentmessage)=@_;
# Check if allowed missing
- my $status='';
+ my ($status,$packed_message);
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);
- if ($sendback) { $message.='true'; }
+ ($msgid,$packed_message)=&packagemsg($subject,$message);
+ if ($sendback) { $packed_message.='true'; }
$status=&Apache::lonnet::critical(
'put:'.$domain.':'.$user.':critical:'.
&escape($msgid).'='.
- &escape($message),$homeserver);
+ &escape($packed_message),$homeserver);
if (defined($sentmessage)) {
- $$sentmessage = $message;
+ $$sentmessage = $packed_message;
}
+ (undef,my $packed_message_no_citation) =
+ &packagemsg($subject,$message,undef,undef,undef,$user,$domain,
+ $msgid);
+ $status .= &store_sent_mail($msgid,$packed_message_no_citation);
} else {
$status='no_host';
}
+
# Notifications
my %userenv = &Apache::loncommon::getemails($user,$domain);
if ($userenv{'critnotification'}) {
@@ -490,7 +508,8 @@ sub user_crit_received {
sub user_normal_msg_raw {
my ($user,$domain,$subject,$message,$citation,$baseurl,$attachmenturl,
- $toperm,$currid,$newid,$sentmessage,$crsmsgid)=@_;
+ $toperm,$currid,$newid,$sentmessage,$crsmsgid,$symb,$restitle,
+ $error)=@_;
# Check if allowed missing
my ($status,$packed_message);
my $msgid='undefined';
@@ -501,7 +520,7 @@ sub user_normal_msg_raw {
($msgid,$packed_message)=
&packagemsg($subject,$message,$citation,$baseurl,
$attachmenturl,$user,$domain,$currid,
- undef,$crsmsgid);
+ undef,$crsmsgid,$symb,$error);
# Store in user folder
$status=&Apache::lonnet::critical(
@@ -518,11 +537,9 @@ sub user_normal_msg_raw {
(&Apache::lonnet::allowed('srm',$env{'request.course.id'})
|| &Apache::lonnet::allowed('srm',$env{'request.course.id'}.
'/'.$env{'request.course.sec'})))) {
- (undef, my $packed_message_no_citation)=
- &packagemsg($subject,$message,undef ,$baseurl,
- $attachmenturl,$user,$domain,$currid,
- undef,$crsmsgid);
-
+ (undef,my $packed_message_no_citation) =
+ &packagemsg($subject,$message,undef,$baseurl,$attachmenturl,
+ $user,$domain,$currid,undef,$crsmsgid,$symb,$error);
$status .= &store_sent_mail($msgid,$packed_message_no_citation);
}
} else {
@@ -557,15 +574,15 @@ sub user_normal_msg_raw {
=pod
-=item * B: Sends a message to the
- $user at $domain, with subject $subject and message $message.
+=item * B:
+ Sends a message to the $user at $domain, with subject $subject and message $message.
=cut
sub user_normal_msg {
my ($user,$domain,$subject,$message,$citation,$baseurl,$attachmenturl,
- $toperm,$sentmessage)=@_;
+ $toperm,$sentmessage,$symb,$restitle,$error)=@_;
my $status='';
my %userenv = &Apache::lonnet::get('environment',['msgforward'],
$domain,$user);
@@ -576,12 +593,12 @@ sub user_normal_msg {
$status.=
&user_normal_msg_raw($forwuser,$forwdomain,$subject,$message,
$citation,$baseurl,$attachmenturl,$toperm,
- undef,undef,$sentmessage).' ';
+ undef,undef,$sentmessage,undef,$symb,$restitle,$error).' ';
}
- } else {
+ } else {
$status=&user_normal_msg_raw($user,$domain,$subject,$message,
$citation,$baseurl,$attachmenturl,$toperm,
- undef,undef,$sentmessage);
+ undef,undef,$sentmessage,undef,$symb,$restitle,$error);
}
return $status;
}
@@ -601,7 +618,31 @@ sub store_sent_mail {
sub foldersuffix {
my $folder=shift;
unless ($folder) { return ''; }
- return '_'.&escape($folder);
+ my $suffix;
+ my %folderhash = &get_user_folders($folder);
+ if (ref($folderhash{$folder}) eq 'HASH') {
+ $suffix = '_'.&escape($folderhash{$folder}{'id'});
+ } else {
+ $suffix = '_'.&escape($folder);
+ }
+ return $suffix;
+}
+
+# ========================================================= User-defined folders
+
+sub get_user_folders {
+ my ($folder) = @_;
+ my %userfolders =
+ &Apache::lonnet::dump('email_folders',undef,undef,$folder);
+ my $lock = "\0".'lock_counter'; # locks db while counter incremented
+ my $counter = "\0".'idcount'; # used in suffix for email db files
+ if (defined($userfolders{$lock})) {
+ delete($userfolders{$lock});
+ }
+ if (defined($userfolders{$counter})) {
+ delete($userfolders{$counter});
+ }
+ return %userfolders;
}
1;