--- loncom/interface/lonmsg.pm 2006/04/25 19:45:50 1.183 +++ loncom/interface/lonmsg.pm 2007/02/09 15:30:48 1.196 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines for messaging # -# $Id: lonmsg.pm,v 1.183 2006/04/25 19:45:50 albertel Exp $ +# $Id: lonmsg.pm,v 1.196 2007/02/09 15:30:48 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -33,6 +33,7 @@ use Apache::lonnet; use HTML::TokeParser(); use Apache::lonlocal; use Mail::Send; +use LONCAPA qw(:DEFAULT :match); { my $uniq; @@ -46,7 +47,7 @@ use Mail::Send; 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,'<>&"'); @@ -59,13 +60,13 @@ sub packagemsg { my $course_context; if (defined($env{'form.replyid'})) { my ($sendtime,$shortsubj,$fromname,$fromdomain,$count,$origcid)= - split(/\:/,&Apache::lonnet::unescape($env{'form.replyid'})); + split(/\:/,&unescape($env{'form.replyid'})); $course_context = $origcid; } foreach my $key (keys(%env)) { if ($key=~/^form\.(rep)?rec\_(.*)$/) { my ($sendtime,$shortsubj,$fromname,$fromdomain,$count,$origcid) = - split(/\:/,&Apache::lonnet::unescape($2)); + split(/\:/,&unescape($2)); $course_context = $origcid; last; } @@ -77,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'}.''. @@ -108,8 +109,8 @@ sub packagemsg { for (my $i=0; $i<@{$recuser}; $i++) { if ($type eq 'dcmail') { my ($username,$email) = split(/:/,$$recuser[$i]); - $username = &Apache::lonnet::unescape($username); - $email = &Apache::lonnet::unescape($email); + $username = &unescape($username); + $email = &unescape($email); $username = &HTML::Entities::encode($username,'<>&"'); $email = &HTML::Entities::encode($email,'<>&"'); $result .= ''. @@ -133,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 @@ -177,19 +189,21 @@ sub unpackagemsg { # ======================================================= Get info out of msgid sub buildmsgid { - my ($now,$subject,$uname,$udom,$msgcount,$course_context,$pid) = @_; - $subject=&Apache::lonnet::escape($subject); - return(&Apache::lonnet::escape($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.':'.$symb.':'.$error)); } sub unpackmsgid { my ($msgid,$folder,$skipstatus,$status_cache)=@_; - $msgid=&Apache::lonnet::unescape($msgid); + $msgid=&unescape($msgid); my ($sendtime,$shortsubj,$fromname,$fromdomain,$count,$fromcid, - $processid)=split(/\:/,&Apache::lonnet::unescape($msgid)); - $shortsubj = &Apache::lonnet::unescape($shortsubj); + $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) { @@ -202,18 +216,27 @@ 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); } sub sendemail { my ($to,$subject,$body)=@_; + my %senderemails=&Apache::loncommon::getemails(); + my $senderaddress=''; + foreach my $type ('notification','permanentemail','critnotification') { + if ($senderemails{$type}) { + $senderaddress=$senderemails{$type}; + } + } $body= "*** ".&mt('This is an automatic message generated by the LON-CAPA system.')."\n". - "*** ".&mt('Please do not reply to this address.')."\n\n".$body; + "*** ".($senderaddress?&mt('You can reply to this message'):&mt('Please do not reply to this address.')."\n*** ". + &mt('A reply will not be received by the recipient!'))."\n\n".$body; my $msg = new Mail::Send; $msg->to($to); $msg->subject('[LON-CAPA] '.$subject); + if ($senderaddress) { $msg->add('Reply-to',$senderaddress); $msg->add('From',$senderaddress); } if (my $fh = $msg->open()) { print $fh $body; $fh->close; @@ -223,7 +246,7 @@ sub sendemail { # ==================================================== Send notification emails sub sendnotification { - my ($to,$touname,$toudom,$subj,$crit,$text)=@_; + my ($to,$touname,$toudom,$subj,$crit,$text,$msgid)=@_; my $sender=$env{'environment.firstname'}.' '.$env{'environment.lastname'}; unless ($sender=~/\w/) { $sender=$env{'user.name'}.'@'.$env{'user.domain'}; @@ -235,21 +258,36 @@ sub sendnotification { my $url='http://'. $Apache::lonnet::hostname{&Apache::lonnet::homeserver($touname,$toudom)}. '/adm/email?username='.$touname.'&domain='.$toudom; - my $body=(<time},$domain,$user); @@ -495,41 +553,40 @@ sub user_normal_msg_raw { unless (($env{'request.course.id'}) && (($env{'form.sendmode'} eq 'group') || (($env{'form.critmsg'}) || ($env{'form.sendbck'})) && - (&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); - - $status .= &store_sent_mail($msgid,$packed_message_no_citation); + (&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,$symb,$error); + if ($status eq 'ok' || $status eq 'con_delayed') { + &store_sent_mail($msgid,$packed_message_no_citation); + } + } + if (defined($newid)) { + $$newid = $msgid; + } + if (defined($sentmessage)) { + $$sentmessage = $packed_message; } - } else { - $status='no_host'; - } - if (defined($newid)) { - $$newid = $msgid; - } - if (defined($sentmessage)) { - $$sentmessage = $packed_message; - } - # Notifications - my %userenv = &Apache::lonnet::get('environment',['notification', - 'permanentemail'], - $domain,$user); - if ($userenv{'notification'}) { - &sendnotification($userenv{'notification'},$user,$domain,$subject,0, - $text); - } - 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); + my %userenv = &Apache::lonnet::get('environment',['notification', + 'permanentemail'], + $domain,$user); + if ($userenv{'notification'}) { + &sendnotification($userenv{'notification'},$user,$domain,$subject,0, + $text,$msgid); + } + if ($toperm && $userenv{'permanentemail'}) { + &sendnotification($userenv{'permanentemail'},$user,$domain,$subject,0, + $text,$msgid); + } + &Apache::lonnet::log($env{'user.domain'},$env{'user.name'}, + $env{'user.home'}, + 'Sending '.$msgid.' to '.$user.' at '.$domain.' with status: '.$status); + } else { + $status='no_host'; + } return $status; } @@ -537,15 +594,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); @@ -556,12 +613,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; } @@ -571,8 +628,8 @@ sub store_sent_mail { my $status =' '.&Apache::lonnet::critical( 'put:'.$env{'user.domain'}.':'.$env{'user.name'}. ':nohist_email_sent:'. - &Apache::lonnet::escape($msgid).'='. - &Apache::lonnet::escape($message),$env{'user.home'}); + &escape($msgid).'='. + &escape($message),$env{'user.home'}); return $status; } @@ -581,7 +638,31 @@ sub store_sent_mail { sub foldersuffix { my $folder=shift; unless ($folder) { return ''; } - return '_'.&Apache::lonnet::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;