--- loncom/interface/lonmsgdisplay.pm 2006/12/06 23:44:33 1.46
+++ loncom/interface/lonmsgdisplay.pm 2007/05/03 12:13:35 1.75
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Routines for messaging display
#
-# $Id: lonmsgdisplay.pm,v 1.46 2006/12/06 23:44:33 raeburn Exp $
+# $Id: lonmsgdisplay.pm,v 1.75 2007/05/03 12:13:35 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -33,12 +33,13 @@ package Apache::lonmsgdisplay;
=head1 NAME
-Apache::lonmsg: supports internal messaging
+Apache::lonmsgdisplay: supports internal messaging
=head1 SYNOPSIS
-lonmsg provides routines for sending messages, receiving messages, and
-a handler to allow users to read, send, and delete messages.
+lonmsgdisplay provides a handler to allow users to read, send,
+and delete messages, and to create and delete message folders,
+and to move messages between folders.
=head1 OVERVIEW
@@ -74,8 +75,8 @@ email program, so they have full access
interface, or other features they may wish to use in response to the
student's query.
-=item * B
Subject:
-General message text
+
$lt{'gmt'}:
-The file format for the uploaded portion of the message is: -
-username1:domain1: text -username2:domain2: text -username3:domain1: text -+$lt{'tff'}: +ENDBLOCK + $r->print(' +
'."\n". +&mt('username1:domain1: text')."\n". +&mt('username2:domain2: text')."\n". +&mt('username3:domain1: text')."\n". +'
-The messages will be assembled from all lines with the respective -username:domain, and appended to the general message text.
+'.&mt('The messages will be assembled from all lines with the respective'."\n".'username:domain, and appended to the general message text.')); + $r->print(<
$dispcrit -
+ ENDUPLOAD } if ($broadcast eq 'group') { @@ -1338,12 +1468,44 @@ ENDREC return $output; } +sub additional_rec_row { + my ($lt) = @_; + my $cc = &mt('Cc:'); + my $bcc = &mt('Bcc:'); + my $output = <<"ENDADD"; +'); my $escmsgid=&escape($msgid); @@ -1872,7 +2045,6 @@ sub displaymessage { ''.&mt('Delete').' '. ''.&mt('Back to Folder Display').' '); if ($counter > 0){ $r->print(''.&mt('Next').' '); } $r->print(''); + my $symb; + if (defined($content{'symb'})) { + $symb = $content{'symb'}; + } elsif (defined($content{'baseurl'})) { + $symb=&Apache::lonnet::symbread($content{'baseurl'}); + } if ($env{'user.adv'}) { $r->print('
'.&mt('Currently available actions (will open extra window)').': | '); - my $symb=&Apache::lonnet::symbread($content{'baseurl'}); if (&Apache::lonnet::allowed('vgr',$env{'request.course.id'})) { $r->print(''.&Apache::loncommon::track_student_link(&mt('View recent activity'),$content{'sendername'},$content{'senderdomain'},'check').' | '); } @@ -1897,33 +2074,137 @@ sub displaymessage { } $r->print('
'. + $content{'senderdomain'}.') '); + if ($cclist) { + $r->print('
'.&mt('Cc').': '.$cclist); + } + } + if ($content{'courseid'}) { + $r->print('
'.&mt($crstype).': '.$courseinfo{'description'}); + if ($content{'coursesec'}) { + $r->print(' ('.&mt('Section').': '.$content{'coursesec'}.')'); + } + } + $r->print('
'.&mt('Time').': '.$content{'time'}); + if ($baseurl) { + if (defined($content{'courseid'}) && defined($env{'request.course.id'})) { + if ($content{'courseid'} eq $env{'request.course.id'}) { + my $symblink; + my $showsymb = &Apache::lonenc::check_decrypt($symb); + my $showurl = &Apache::lonenc::check_decrypt($baseurl); + my $encrypturl = &Apache::lonnet::EXT('resource.0.encrypturl', + $showsymb,$env{'user.domain'},$env{'user.name'}); + if ($symb) { + if ($encrypturl =~ /^yes$/i && !$env{'request.role.adv'}) { + $showsymb = &Apache::lonenc::check_encrypt($symb); + } + $symblink = '?symb='.$showsymb; + } + if ($encrypturl =~ /^yes$/i && !$env{'request.role.adv'}) { + $showurl = $baseurl; + } + $r->print('
'.&mt('Refers to').': '.$restitle.''); + $refers_to = 1; + } + } + if (!$refers_to) { + if ($baseurl =~ m-^/enc/-) { + if (defined($content{'courseid'})) { + if (!$env{'request.course.id'}) { + my $unencurl = + &Apache::lonenc::unencrypted($baseurl, + $content{'courseid'}); + if ($unencurl ne '') { + if (&Apache::lonnet::allowed('bre',$unencurl)) { + $r->print('
'.&mt('Refers to'). + ': '. + $restitle.''); + } + } + } + } + } else { + if (&Apache::lonnet::allowed('bre',$baseurl)) { + $r->print('
'.&mt('Refers to'). + ': '.$restitle.''); + } + } + } + } + $r->print(''. &Apache::lontexconvert::msgtexconverted($content{'message'},1). '
'.&displayresource(%content).''); - return; + return; +} + +sub retrieve_cc_recips { + my ($context,%content) = @_; + my %reciphash = + &Apache::lonnet::get('nohist_emailrecip',[$content{'recipid'}], + $content{'senderdomain'},$content{'sendername'}); + my $recipinfo = $reciphash{$content{'recipid'}}; + my @ccs; + if (ref($recipinfo) eq 'HASH') { + if (ref($recipinfo->{'cc'}) eq 'HASH') { + foreach my $cc (sort(keys(%{$recipinfo->{'cc'}}))) { + my ($ccname,$ccdom) = split(/:/,$cc); + if (!(($ccname eq $env{'user.name'}) && + ($ccdom eq $env{'user.domain'}))) { + my $showcc =''; + if ($context eq 'replying') { + $showcc = ''; + } + $showcc .= ''; + push(@ccs,$showcc); + } + } + } + } + return @ccs; } # =========================================================== Show the citation @@ -1936,7 +2217,12 @@ sub displayresource { # if (($env{'request.course.id'} eq $content{'courseid'}) && (&Apache::lonnet::allowed('vgr',$content{'courseid'}))) { - my $symb=&Apache::lonnet::symbread($content{'baseurl'}); + my $symb; + if (defined($content{'symb'})) { + $symb = $content{'symb'}; + } else { + $symb=&Apache::lonnet::symbread($content{'baseurl'}); + } # Could not get a symb, give up unless ($symb) { return $content{'citation'}; } # Have a symb, can render @@ -2005,10 +2291,10 @@ sub storedcommentlisting { my ($r)=@_; my %msgs=&Apache::lonnet::dump('nohist_stored_comments',undef,undef, '^'.&escape(&escape($env{'form.showcommentbaseurl'}))); - $r->print(&Apache::loncommon::start_page('Stored Comment Listing',undef, + $r->print(&Apache::loncommon::start_page('Saved Comment Listing',undef, {'onlybody' => 1})); if ((keys %msgs)[0]=~/^error\:/) { - $r->print(&mt('No stored comments yet.')); + $r->print(&mt('No saved comments yet.')); } else { my $found=0; foreach my $key (sort(keys(%msgs))) { @@ -2016,7 +2302,7 @@ sub storedcommentlisting { $found=1; } unless ($found) { - $r->print(&mt('No stored comments yet for this resource.')); + $r->print(&mt('No saved comments yet for this resource.')); } } } @@ -2027,8 +2313,9 @@ sub sendoffmail { my ($r,$folder)=@_; my $suffix=&Apache::lonmsg::foldersuffix($folder); my $sendstatus=''; - my %specialmsg_status; - my $numspecial = 0; + my %msg_status; + my $numsent = 0; + my $nosentstore = 1; my ($cdom,$cnum,$group); if (exists($env{'form.group'})) { $group = $env{'form.group'}; @@ -2038,10 +2325,12 @@ sub sendoffmail { $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; } if ($env{'form.send'}) { - if ($group eq '') { - &printheader($r,'','Messages being sent.'); - } else { - $r->print(&groupmail_header('sending',$group)); + if (!$env{'form.multiforward'}) { + if ($group eq '') { + &printheader($r,'','Messages being sent.'); + } else { + $r->print(&groupmail_header('sending',$group)); + } } $r->rflush(); my %content=(); @@ -2065,7 +2354,7 @@ sub sendoffmail { &Apache::loncommon::get_env_multiple('form.selectedusers_forminput'); my $mode = $env{'form.sendmode'}; - my %toaddr; + my (%toaddr,$cc,$bcc); if (@to) { foreach my $dest (@to) { my ($user,$domain) = split(/:/, $dest); @@ -2083,6 +2372,7 @@ sub sendoffmail { } } } elsif ($env{'form.sendmode'} eq 'upload') { + $nosentstore = 0; foreach my $line (split(/[\n\r\f]+/,$env{'form.upfile'})) { my ($rec,$txt) = ($line =~ /^([^:]+:[^:]+):(.*)$/); if ($txt) { @@ -2094,17 +2384,38 @@ sub sendoffmail { } else { if (($env{'form.recuname'} ne '') && ($env{'form.recdomain'} ne '')) { $toaddr{$env{'form.recuname'}.':'.$env{'form.recdomain'}}=''; + $cc->{$env{'form.recuname'}.':'.$env{'form.recdomain'}}=''; } } - if ($env{'form.additionalrec'}) { - foreach my $rec (split(/\,/,$env{'form.additionalrec'})) { + if ($env{'form.additionalrec_cc'}) { + foreach my $rec (split(/\s*,\s*/,$env{'form.additionalrec_cc'})) { my ($auname,$audom)=split(/:/,$rec); if (($auname ne "") && ($audom ne "")) { - $toaddr{$auname.':'.$audom}=''; + $toaddr{$auname.':'.$audom}=''; + $cc->{$auname.':'.$audom}=''; } } } - + if ($env{'form.additionalrec_bcc'}) { + foreach my $rec (split(/\s*,\s*/,$env{'form.additionalrec_bcc'})) { + my ($auname,$audom)=split(/:/,$rec); + if (($auname ne "") && ($audom ne "")) { + $toaddr{$auname.':'.$audom}=''; + $bcc->{$auname.':'.$audom}=''; + } + } + } + if ($env{'form.replying_cc'}) { + my @ccreplies = + &Apache::loncommon::get_env_multiple('form.replying_cc'); + foreach my $rec (@ccreplies) { + my ($auname,$audom)=split(/:/,$rec); + if (($auname ne "") && ($audom ne "")) { + $toaddr{$auname.':'.$audom}=''; + $cc->{$auname.':'.$audom}=''; + } + } + } my $savemsg; my $msgtype; my %sentmessage; @@ -2120,23 +2431,35 @@ sub sendoffmail { } else { $savemsg=&Apache::lonfeedback::clear_out_html($env{'form.message'}); } - + my %reciphash = ( + cc => $cc, + bcc => $bcc, + ); + my ($recipid,$recipstatus) = + &Apache::lonmsg::store_recipients($msgsubj,$env{'user.name'}, + $env{'user.domain'},\%reciphash); + if ($recipstatus ne 'ok') { + &Apache::lonnet::logthis('Failed to store Bcc and Cc recipients for '.$env{'user.name'}.':'.$env{'user.domain'}); + } + my @recusers; + my @recudoms; foreach my $address (sort(keys(%toaddr))) { my ($recuname,$recdomain)=split(/\:/,$address); my $msgtxt = $savemsg; - if ($toaddr{$address}) { $msgtxt.='
'.$toaddr{$address}; } + if ($toaddr{$address}) { + $msgtxt.='
'.$toaddr{$address}; + } my @thismsg; - if ((($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'}))) { - $r->print(&mt('Sending critical message').' '.$recuname.':'.$recdomain.': '); + if ($msgtype eq 'critical') { + $r->print(&mt('Sending critical message').' '. + $recuname.':'.$recdomain.': '); @thismsg= &Apache::lonmsg::user_crit_msg($recuname,$recdomain, $msgsubj,$msgtxt, $env{'form.sendbck'}, $env{'form.permanent'}, - \$sentmessage{$address}); + \$sentmessage{$address}, + $nosentstore,$recipid); } else { $r->print(&mt('Sending').' '.$recuname.':'.$recdomain.': '); @thismsg= @@ -2145,94 +2468,96 @@ sub sendoffmail { $content{'citation'}, undef,undef, $env{'form.permanent'}, - \$sentmessage{$address}); + \$sentmessage{$address}, + undef,undef,undef, + $nosentstore,$recipid); } - if (($env{'request.course.id'}) && (($msgtype eq 'critical') || - ($env{'form.sendmode'} eq 'group'))) { - $specialmsg_status{$recuname.':'.$recdomain} = - join(' ',@thismsg); - foreach my $result (@thismsg) { - if ($result eq 'ok') { - $numspecial++; - } - } + $msg_status{$recuname.':'.$recdomain}=join(' ',@thismsg); + if ($msg_status{$recuname.':'.$recdomain} =~ /(ok|con_delayed)/) { + $numsent++; + push(@recusers,$recuname); + push(@recudoms,$recdomain); } $sendstatus.=' '.join(' ',@thismsg); } - if (($env{'request.course.id'}) && (($env{'form.sendmode'} eq 'group') - || ($msgtype eq 'critical'))) { - my $subj_prefix; - if ($msgtype eq 'critical') { - $subj_prefix = 'Critical.'; - } else { - $subj_prefix = 'Broadcast.'; - } - my ($specialmsgid,$specialresult); - my $course_str = &escape('['.$cnum.':'.$cdom.']'); + my $subj_prefix; + if ($numsent > 0) { + if (($env{'request.course.id'}) && + (($env{'form.sendmode'} eq 'group') || + ($env{'form.courserecord'}) || + ($msgtype eq 'critical'))) { + if ($msgtype eq 'critical') { + $subj_prefix = 'Critical.'; + } elsif ($env{'form.sendmode'} eq 'group') { + $subj_prefix = 'Broadcast.'; + } else { + $subj_prefix = 'Archive'; + } + my ($specialmsgid,$specialresult); + my $course_str = &escape('['.$cnum.':'.$cdom.']'); - if ($numspecial) { - $specialresult = &Apache::lonmsg::user_normal_msg_raw($cnum,$cdom,$subj_prefix. - ' '.$course_str,$savemsg,undef,undef,undef, - undef,undef,\$specialmsgid); + $specialresult = + &Apache::lonmsg::user_normal_msg_raw($cnum,$cdom, + $subj_prefix.' '.$course_str,$savemsg,undef,undef, + undef,undef,undef,\$specialmsgid,undef,undef,undef, + undef,undef,1); $specialmsgid = &unescape($specialmsgid); - } - if ($specialresult eq 'ok') { - my $record_sent; - my @recusers; - my @recudoms; - my ($stamp,$crssubj,$msgname,$msgdom,$msgcount,$context,$pid) = - split(/\:/,&unescape($specialmsgid)); - - foreach my $recipient (sort(keys(%toaddr))) { - if ($specialmsg_status{$recipient} eq 'ok') { - my $usersubj = $subj_prefix.'['.$recipient.']'; - my $usermsgid = - &Apache::lonmsg::buildmsgid($stamp,$usersubj, - $msgname,$msgdom, - $msgcount,$context, - $pid); - &Apache::lonmsg::user_normal_msg_raw($cnum,$cdom,$subj_prefix. - ' ['.$recipient.']',$msgsubj,undef, - undef,undef,undef,$usermsgid,undef,undef,$specialmsgid); - my ($uname,$udom) = split(/:/,$recipient); - push(@recusers,$uname); - push(@recudoms,$udom); + if ($specialresult eq 'ok') { + my ($stamp,$crssubj,$msgname,$msgdom,$msgcount,$context,$pid) = + split(/\:/,&unescape($specialmsgid)); + + foreach my $recipient (sort(keys(%toaddr))) { + if ($msg_status{$recipient} =~ /\s*(ok|con_delayed)\s*/) { + my $usersubj = $subj_prefix.'['.$recipient.']'; + my $usermsgid = + &Apache::lonmsg::buildmsgid($stamp,$usersubj, + $msgname,$msgdom, + $msgcount,$context, + $pid); + &Apache::lonmsg::user_normal_msg_raw($cnum,$cdom, + $subj_prefix.' ['.$recipient.']',$msgsubj, + undef,undef,undef,undef,$usermsgid,undef, + undef,$specialmsgid,undef,undef,undef,1); + } } - } - if (@recusers) { - my $specialmessage; - my $sentsubj = - $subj_prefix.' ('.$numspecial.' sent) '.$msgsubj; - $sentsubj = &HTML::Entities::encode($sentsubj,'<>&"'); - my $sentmsgid = - &Apache::lonmsg::buildmsgid($stamp,$sentsubj,$msgname, - $msgdom,$msgcount,$context, - $pid); - ($specialmsgid,$specialmessage) = &Apache::lonmsg::packagemsg($msgsubj,$savemsg, - undef,undef,undef,\@recusers,\@recudoms,$sentmsgid); - $record_sent = &Apache::lonmsg::store_sent_mail($specialmsgid,$specialmessage); + if (($env{'form.sendmode'} ne 'upload') && (@recusers > 0)) { + &Apache::lonmsg::process_sent_mail($msgsubj, + $subj_prefix,$numsent,$stamp,$msgname,$msgdom, + $msgcount,$context,$pid,$savemsg,\@recusers, + \@recudoms); + } + } else { + &Apache::lonnet::logthis('Failed to create record of critical, broadcast or archived message in '.$env{'course.'.$env{'request.course.id'}.'.num'}.' at '.$env{'course.'.$env{'request.course.id'}.'.domain'}.' - no msgid generated'); } } else { - &Apache::lonnet::logthis('Failed to create record of critical message or broadcast in '.$env{'course.'.$env{'request.course.id'}.'.num'}.' at '.$env{'course.'.$env{'request.course.id'}.'.domain'}.' - no msgid generated'); + my $stamp = time; + my $msgcount = &Apache::lonmsg::get_uniq(); + my $context = &Apache::lonmsg::get_course_context(); + &Apache::lonmsg::process_sent_mail($msgsubj,$subj_prefix, + $numsent,$stamp,$env{'user.name'}, + $env{'user.domain'},$msgcount,$context, + $$,$savemsg,\@recusers,\@recudoms); } } - } else { - &printheader($r,'','No messages sent.'); - } - if ($sendstatus=~/^(\s*(?:ok|con_delayed)\s*)*$/) { - $r->print('
'.&mt('Completed.').''); - if ($env{'form.displayedcrit'}) { - &discrit($r); + if (!$env{'form.multiforward'}) { + if ($sendstatus=~/^(\s*(?:ok|con_delayed)\s*)*$/) { + $r->print('
'.&mt('Completed.'). + ''); + if ($env{'form.displayedcrit'}) { + &discrit($r); + } + if ($group ne '') { + $r->print(&groupmail_sent($group,$cdom,$cnum)); + } else { + &Apache::loncommunicate::menu($r); + } + } else { + $r->print(''.&mt('Could not deliver message').' '. + &mt('Please use the browser "Back" button and correct the recipient addresses '."($sendstatus)").'
'); + } } - if ($group ne '') { - $r->print(&groupmail_sent($group,$cdom,$cnum)); - } else { - &Apache::loncommunicate::menu($r); - } - } else { - $r->print(''.&mt('Could not deliver message').' '. - &mt('Please use the browser "Back" button and correct the recipient addresses '."($sendstatus)").'
'); } + return $sendstatus; } # ===================================================================== Handler @@ -2252,7 +2577,8 @@ sub handler { ['display','replyto','forward','markread','markdel','markunread', 'sendreply','compose','sendmail','critical','recname','recdom', 'recordftf','sortedby','block','folder','startdis','interdis', - 'showcommentbaseurl','dismode','group','subject','text','ref']); + 'showcommentbaseurl','dismode','group','subject','text','ref', + 'msgstatus']); $sqs='&sortedby='.$env{'form.sortedby'}; # ------------------------------------------------------ They checked for email @@ -2282,19 +2608,17 @@ sub handler { unless ($dismode) { $dismode=''; } else { - $sqs.='&dismode='.&escape($dismode); + $sqs.='&dismode='.&escape($dismode); } # --------------------------------------------------------------------- Display - + my $msgstatus = $env{'form.msgstatus'}; $startdis=$env{'form.startdis'}; - $startdis--; + if ($startdis ne '') { + $startdis--; + } unless ($startdis) { $startdis=0; } - $interdis=$env{'form.interdis'}; - unless ($interdis) { $interdis=20; } - $sqs.='&interdis='.$interdis; - if ($env{'form.firstview'}) { $startdis=0; } @@ -2313,23 +2637,25 @@ sub handler { # --------------------------------------------------------------- Render Output if ($env{'form.display'}) { - &displaymessage($r,$env{'form.display'},$folder); + &displaymessage($r,$env{'form.display'},$folder,$msgstatus); } elsif ($env{'form.replyto'}) { &compout($r,'',$env{'form.replyto'},undef,undef,$folder,$dismode); } elsif ($env{'form.confirm'}) { &printheader($r,'','Confirmed Receipt'); my $replying = 0; foreach my $envkey (keys(%env)) { - if ($envkey=~/^form\.rec\_(.*)$/) { - $r->print(''.&mt('Confirming Receipt').': '. - &Apache::lonmsg::user_crit_received($1).'
'); - } - if ($envkey=~/^form\.reprec\_(.*)$/) { - my $msgid=$1; - $r->print(''.&mt('Confirming Receipt').': '. - &Apache::lonmsg::user_crit_received($msgid).'
'); - &compout($r,'','','',$msgid); - $replying = 1; + if ($envkey=~/^form\.(rep)?rec\_(.*)$/) { + my $msgid = $2; + $r->print(''.&mt('Confirming Receipt').': '); + my $result = &Apache::lonmsg::user_crit_received($msgid); + if ($result =~ /trans:\s+ok/) { + &statuschange($msgid,'read'); + } + $r->print($result.'
'); + if ($1 eq 'rep') { + &compout($r,'','','',$msgid); + $replying = 1; + } } } if (!$replying) { @@ -2350,47 +2676,82 @@ sub handler { ''.$msg."
\n"); } &Apache::loncommunicate::menu($r); - &disall($r,($folder?$folder:$dismode)); - } elsif ($env{'form.markedmove'}) { - my ($total,$failed,@failed_msg)=(0,0); - foreach my $key (keys(%env)) { - if ($key=~/^form\.delmark_(.*)$/) { - my ($result,$msg) = - &movemsg(&unescape($1),$folder, - $env{'form.movetofolder'}); - if ($result) { + &disall($r,($folder?$folder:$dismode),$msgstatus); + } elsif ($env{'form.markedaction'} eq 'markedforward') { + my $total = 0; + my @to_forward = &Apache::loncommon::get_env_multiple('form.delmark'); + foreach my $msgid (@to_forward) { + &statuschange(&unescape($msgid),'forwarded',$folder); + $total ++; + } + if ($total > 0) { + &compout($r,undef,undef,undef,undef,$folder,$dismode,$total); + } + } elsif ($env{'form.markedaction'} eq 'markedread') { + my $total = 0; + my @to_markread = &Apache::loncommon::get_env_multiple('form.delmark'); + foreach my $msgid (@to_markread) { + &statuschange(&unescape($msgid),'read',$folder); + $total ++; + } + &printheader($r,'','Marked Messages Read'); + $r->print(&mt('Marked [_1] message(s) read',$total).''); + &Apache::loncommunicate::menu($r); + &disall($r,($folder?$folder:$dismode),$msgstatus); + } elsif ($env{'form.markedaction'} eq 'markedunread') { + my $total = 0; + my @to_markunread = &Apache::loncommon::get_env_multiple('form.delmark'); + foreach my $msgid (@to_markunread) { + &statuschange(&unescape($msgid),'new',$folder); + $total ++; + } + &printheader($r,'','Marked Messages Unread'); + $r->print(&mt('Marked [_1] message(s) unread',$total).'
'); + &Apache::loncommunicate::menu($r); + &disall($r,($folder?$folder:$dismode),$msgstatus); + } elsif ($env{'form.markedaction'} eq 'markedmove') { + my $destfolder = $env{'form.movetofolder'}; + my %gotfolders = &Apache::lonmsg::get_user_folders(); + &printheader($r,'','Moved Messages'); + if (!defined($gotfolders{$destfolder})) { + $r->print(&mt('Destination folder [_1] is not a valid folder', + $destfolder)); + } else { + my ($total,$failed,@failed_msg)=(0,0); + my @to_move = &Apache::loncommon::get_env_multiple('form.delmark'); + foreach my $msgid (@to_move) { + my ($result,$msg) = &movemsg(&unescape($msgid),$folder, + $env{'form.movetofolder'}); + if ($result) { $total++; - } else { + } else { $failed++; push(@failed_msg,$msg); - } + } } - } - &printheader($r,'','Moved Messages'); - if ($failed) { - $r->print('
+ if ($failed) { + $r->print('
'.&mt('Failed to move [_1] message(s)',$failed). '
'); - $r->print(''. - join("
\n",@failed_msg). - "
\n"); - } - $r->print(&mt('Moved [_1] message(s)',$total).''); + $r->print('
'. + join("
\n",@failed_msg). + "
\n"); + } + $r->print(&mt('Moved [_1] message(s)',$total).''); + } &Apache::loncommunicate::menu($r); - &disall($r,($folder?$folder:$dismode)); - } elsif ($env{'form.markeddel'}) { + &disall($r,($folder?$folder:$dismode),$msgstatus); + } elsif ($env{'form.markedaction'} eq 'markeddel') { my ($total,$failed,@failed_msg)=(0,0); - foreach my $key (keys(%env)) { - if ($key=~/^form\.delmark_(.*)$/) { - my ($result,$msg) = - &statuschange(&unescape($1),'deleted', - $folder); - if ($result) { - $total++; - } else { - $failed++; - push(@failed_msg,$msg); - } + my @to_delete = &Apache::loncommon::get_env_multiple('form.delmark'); + foreach my $msgid (@to_delete) { + my ($result,$msg) = &statuschange(&unescape($msgid),'deleted', + $folder); + if ($result) { + $total++; + } else { + $failed++; + push(@failed_msg,$msg); } } &printheader($r,'','Deleted Messages'); @@ -2404,12 +2765,12 @@ sub handler { } $r->print(&mt('Deleted [_1] message(s)',$total).'
'); &Apache::loncommunicate::menu($r); - &disall($r,($folder?$folder:$dismode)); + &disall($r,($folder?$folder:$dismode),$msgstatus); } elsif ($env{'form.markunread'}) { &printheader($r,'','Marked Message as Unread'); &statuschange($env{'form.markunread'},'new'); &Apache::loncommunicate::menu($r); - &disall($r,($folder?$folder:$dismode)); + &disall($r,($folder?$folder:$dismode),$msgstatus); } elsif ($env{'form.compose'}) { &compout($r,'','',$env{'form.compose'}); } elsif ($env{'form.recordftf'}) { @@ -2417,7 +2778,63 @@ sub handler { } elsif ($env{'form.block'}) { &examblock($r,$env{'form.block'}); } elsif ($env{'form.sendmail'}) { - &sendoffmail($r,$folder); + if ($env{'form.multiforward'}) { + &printheader($r,'','Messages being sent.'); + my $fixed_subj = $env{'form.subject'}; + my $suffix=&Apache::lonmsg::foldersuffix($folder); + my (%sendresult,%forwardok,%forwardfail,$fwdcount); + my @to_forward = &Apache::loncommon::get_env_multiple('form.delmark'); + foreach my $item (@to_forward) { + my $msgid=&unescape($item); + my %message=&Apache::lonnet::get('nohist_email'.$suffix,[$msgid]); + my %content=&Apache::lonmsg::unpackagemsg($message{$msgid},1); + if ($env{'form.showorigsubj'}) { + $env{'form.subject'} = $fixed_subj.$content{'subject'}; + } else { + $env{'form.subject'} = ''; + } + my $uname = $content{'sendername'}; + my $udom = $content{'senderdomain'}; + &statuschange($msgid,'forwarded',$folder); + if ($env{'form.showorigsender'}) { + $env{'form.message'} = $env{'form.msgheader'}.' '. + &Apache::loncommon::plainname($uname,$udom).' ('. + $uname.':'.$udom.')'; + } + $env{'form.message'} .= "\n\n-- Forwarded message --\n\n". + $content{'message'}; + $fwdcount ++; + $r->print($fwdcount.': '); + $sendresult{$msgid} = &sendoffmail($r,$folder); + $r->print('
'); + } + foreach my $key (keys(%sendresult)) { + if ($sendresult{$key} =~/^(\s*(?:ok|con_delayed)\s*)*$/) { + $forwardok{$key} = $sendresult{$key}; + } else { + $forwardfail{$key} = $sendresult{$key}; + } + } + if (keys(%forwardok) > 0) { + my $count = keys(%forwardok); + $r->print('
'. + &mt('[quant,_1,message] forwarded.',$count). + ''); + } + if (keys(%forwardfail) > 0) { + my $count = keys(%forwardfail); + $r->print(''. + &mt('Could not forward [quant,_1,message].',$count). + ' '); + foreach my $key (keys(%forwardfail)) { + $r->print(&mt('Could not deliver forwarded message.').' '. + &mt('The recipient addresses may need to be corrected').' ('.$forwardfail{$key}.').
'); + } + } + &Apache::loncommunicate::menu($r); + } else { + &sendoffmail($r,$folder); + } if ($env{'form.storebasecomment'}) { &storecomment($r); } @@ -2429,7 +2846,7 @@ sub handler { $env{'form.message'},'/adm/communicate','public'); } if ((!exists($env{'form.group'})) && (!$env{'form.displayedcrit'})) { - &disall($r,($folder?$folder:$dismode)); + &disall($r,($folder?$folder:$dismode),$msgstatus); } } elsif ($env{'form.newfolder'}) { &printheader($r,'','New Folder'); @@ -2443,7 +2860,7 @@ sub handler { $showfolder = $folder; } &Apache::loncommunicate::menu($r); - &disall($r,$showfolder); + &disall($r,$showfolder,$msgstatus); } elsif ($env{'form.showcommentbaseurl'}) { &storedcommentlisting($r); } elsif ($env{'form.folderaction'} eq 'delete') { @@ -2452,12 +2869,13 @@ sub handler { my $delresult = &deletefolder($folder); if ($delresult eq 'ok') { $r->print(&mt('Mail folder "[_1]" deleted.',$folder).'
'); + $env{'form.folder'} = ''; } else { $r->print(&mt('Deletion failed.').' '.$delresult.'
'); $showfolder = $folder; } &Apache::loncommunicate::menu($r); - &disall($r,$showfolder); + &disall($r,$showfolder,$msgstatus); } elsif ($env{'form.folderaction'} eq 'rename') { &printheader($r,'','Renamed Folder'); my $showfolder = $env{'form.renamed'}; @@ -2469,11 +2887,11 @@ sub handler { $showfolder = $folder; } &Apache::loncommunicate::menu($r); - &disall($r,$showfolder); + &disall($r,$showfolder,$msgstatus); } else { &printheader($r,'','Display All Messages'); &Apache::loncommunicate::menu($r); - &disall($r,($folder?$folder:$dismode)); + &disall($r,($folder?$folder:$dismode),$msgstatus); } $r->print(&Apache::loncommon::end_page()); return OK; @@ -2482,8 +2900,6 @@ sub handler { =pod -=back - =cut 1;