--- loncom/interface/lonmsgdisplay.pm 2016/02/26 21:44:39 1.183 +++ loncom/interface/lonmsgdisplay.pm 2022/01/19 15:04:15 1.197 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines for messaging display # -# $Id: lonmsgdisplay.pm,v 1.183 2016/02/26 21:44:39 raeburn Exp $ +# $Id: lonmsgdisplay.pm,v 1.197 2022/01/19 15:04:15 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -782,11 +782,14 @@ sub groupmail_header { if ($grouppagelink) { &Apache::lonhtmlcommon::add_breadcrumb ({href=>$grouppagelink, - text=>"Group: $description", - title=>"Go to group's home page"},); + text=>&mt('Group').": $description", + title=>&mt("Go to group's home page"), + no_mt=>1, + },); } else { &Apache::lonhtmlcommon::add_breadcrumb - ({text=>"Group: $description",}); + ({text=>&mt('Group').": $description", + no_mt=>1,}); } &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/email?compose=group&group=". @@ -799,8 +802,9 @@ sub groupmail_header { title=>"E-mails sent"},); } my $groupheader = &Apache::loncommon::start_page('Group Message'); - $groupheader .= &Apache::lonhtmlcommon::breadcrumbs - ('Group - '.$env{'form.group'}.' Email'); + $groupheader .= &Apache::lonhtmlcommon::breadcrumbs( + &mt('Group messages - [_1]',$description), + undef,undef,undef,undef,1); return $groupheader; } @@ -861,7 +865,7 @@ sub discrit { .&Apache::lonhtmlcommon::row_closure(1); } $result .= &Apache::lonhtmlcommon::row_title(&mt('Message'),undef,'LC_evenrow_value') - .'
'.&Apache::lontexconvert::msgtexconverted($content{'message'}).'
' + .'
'.&Apache::lontexconvert::msgtexconverted($content{'message'}).'
' .&Apache::lonhtmlcommon::row_closure() .&Apache::lonhtmlcommon::row_title('',undef,'LC_oddrow_value') .'
'; @@ -908,7 +912,7 @@ sub discrit { } sub sortedmessages { - my ($blocked,$startblock,$endblock,$numblocked,$folder,$msgstatus) = @_; + my ($blocked,$startblock,$endblock,$by_ip,$numblocked,$folder,$msgstatus) = @_; my $suffix=&Apache::lonmsg::foldersuffix($folder); my @messages = &Apache::lonnet::getkeys('nohist_email'.$suffix); #unpack the varibles and repack into temp for sorting @@ -940,7 +944,8 @@ sub sortedmessages { push(@temp1,$content{'recuser'},$content{'recdomain'}); } # Check whether message was sent during blocking period. - if ($sendtime >= $startblock && ($sendtime <= $endblock && $endblock > 0) ) { + if (($by_ip) || + (($sendtime >= $startblock) && ($sendtime <= $endblock && $endblock > 0))) { $$blocked{$msgid} = 'ON'; $$numblocked ++; } else { @@ -1067,7 +1072,9 @@ sub disfolder { my %blocked = (); my %setters = (); my $numblocked = 0; - my ($startblock,$endblock) = &Apache::loncommon::blockcheck(\%setters,'com'); + my $clientip = &Apache::lonnet::get_requestor_ip($r); + my ($startblock,$endblock,$triggerblock,$by_ip,$blockdom) = + &Apache::loncommon::blockcheck(\%setters,'com',$clientip); my %js_lt = &Apache::lonlocal::texthash( sede => 'Select a destination folder to which the messages will be moved.', nome => 'No messages have been selected to apply this action to.', @@ -1111,7 +1118,7 @@ sub disfolder { ENDDISHEADER my $fsqs='&folder='.$folder; - my @temp=&sortedmessages(\%blocked,$startblock,$endblock,\$numblocked,$folder,$msgstatus); + my @temp=&sortedmessages(\%blocked,$startblock,$endblock,$by_ip,\$numblocked,$folder,$msgstatus); my $totalnumber=$#temp+1; if ($totalnumber < 1) { $r->print('

'); @@ -1124,7 +1131,7 @@ ENDDISHEADER } $r->print('

'); if ($numblocked > 0) { - $r->print(&blocked_in_folder($numblocked,$startblock,$endblock, + $r->print(&blocked_in_folder($numblocked,$startblock,$endblock,$by_ip,$clientip,$blockdom, \%setters)); } return; @@ -1314,20 +1321,26 @@ ENDDISHEADER $r->print(''); if ($numblocked > 0) { $r->print(&blocked_in_folder($numblocked,$startblock,$endblock, - \%setters)); + $by_ip,$clientip,$blockdom,\%setters)); } } sub blocked_in_folder { - my ($numblocked,$startblock,$endblock,$setters) = @_; - my $beginblock = &Apache::lonlocal::locallocaltime($startblock); - my $finishblock = &Apache::lonlocal::locallocaltime($endblock); - my $output = '

'. + my ($numblocked,$startblock,$endblock,$by_ip,$clientip,$blockdom,$setters) = @_; + my $output; + if ($by_ip) { + $output = '

'. + &mt('[quant,_1,message is, messages are] not viewable because display of LON-CAPA messages is blocked for your current IP address: [_2].',$numblocked,$clientip).'
'. + &mt('Note: communication is being blocked for certain IP address(es).'); + } else { + my $beginblock = &Apache::lonlocal::locallocaltime($startblock); + my $finishblock = &Apache::lonlocal::locallocaltime($endblock); + $output = '

'. &mt('[quant,_1,message is, messages are] not viewable because display of LON-CAPA messages sent to you by other students between [_2] and [_3] is currently being blocked because of online exams.',$numblocked,$beginblock,$finishblock); + } #$output .= &Apache::loncommon::build_block_table($startblock,$endblock, # $setters); - - my ($blocked, $blocktext) = &Apache::loncommon::blocking_status("com"); + my ($blocked, $blocktext) = &Apache::loncommon::blocking_status("com",$clientip); $output .="

".$blocktext; return $output; @@ -1338,6 +1351,26 @@ sub blocked_in_folder { sub compout { my ($r,$forwarding,$replying,$broadcast,$replycrit,$folder,$dismode, $multiforward)=@_; + my $clientip = &Apache::lonnet::get_requestor_ip($r); + my %setters; + my ($startblock,$endblock,$triggerblock,$by_ip,$blockdom) = + &Apache::loncommon::blockcheck(\%setters,'com',$clientip); + if ($by_ip) { + my $showdom = &Apache::lonnet::domain($blockdom); + if ($showdom eq '') { + $showdom = $blockdom; + } + $r->print(&Apache::loncommon::start_page('Messages')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Send and display messages')); + $r->print('

'. + &mt('Sending of LON-CAPA messages is blocked for your current IP address: [_1].',$clientip).'

'. + ''); + return; + } my $suffix=&Apache::lonmsg::foldersuffix($folder); my ($cdom,$cnum,$group,$refarg); if (exists($env{'form.group'})) { @@ -1417,9 +1450,9 @@ sub compout { ); if (!$forwarding && !$multiforward) { $attachrow = ''.$lt{'atta'}.' '.$attachmax{'text'} - .': ' - .'' - .''; + .': ' + .'' + .''; } if (&Apache::lonnet::allowed('srm',$env{'request.course.id'}) || &Apache::lonnet::allowed('srm',$env{'request.course.id'}. @@ -1974,7 +2007,7 @@ sub disfacetoface { &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).' ('. $content{'sendername'}.':'. $content{'senderdomain'}.') '.$content{'time'}. - '
'.
+            '
'.
               &Apache::lontexconvert::msgtexconverted($content{'message'}).
 	      '
'; } @@ -2102,14 +2135,16 @@ sub displaymessage { my %setters = (); my $numblocked = 0; my $crstype = &Apache::loncommon::course_type(); + my $clientip = &Apache::lonnet::get_requestor_ip($r); # info to generate "next" and "previous" buttons and check if message is blocked - my ($startblock,$endblock) = &Apache::loncommon::blockcheck(\%setters,'com'); - my @messages=&sortedmessages(\%blocked,$startblock,$endblock,\$numblocked,$folder,$msgstatus); + my ($startblock,$endblock,$triggerblock,$by_ip,$blockdom) = + &Apache::loncommon::blockcheck(\%setters,'com',$clientip); + my @messages=&sortedmessages(\%blocked,$startblock,$endblock,$by_ip,\$numblocked,$folder,$msgstatus); if ( $blocked{$msgid} eq 'ON' ) { &printheader($r,'/adm/email',&mt('Display a Message')); #$r->print(&mt('You attempted to display a message that is currently blocked because you are enrolled in one or more courses for which there is an ongoing online exam.')); - my($blocked, $blocktext) = &Apache::loncommon::blocking_status("com"); + my($blocked, $blocktext) = &Apache::loncommon::blocking_status("com",$clientip); $r->print("
".$blocktext); return; } @@ -2143,8 +2178,28 @@ sub displaymessage { my $number_of_messages = scalar(@messages); #subtract 1 for last index + my $head_extra; + +# if student's view of resource will be included +# get tag(s) for css file(s) in use, and pass to &header to include +# in call to loncommon::start_page() + + if (($env{'request.course.id'} eq $content{'courseid'}) && + (&Apache::lonnet::allowed('vgr',$content{'courseid'}))) { + my $symb; + if (defined($content{'symb'})) { + $symb = $content{'symb'}; + } elsif (defined($content{'baseurl'})) { + $symb=&Apache::lonnet::symbread($content{'baseurl'}); + } + if ($symb) { + $head_extra = &Apache::loncommon::css_links($symb); + } + } + # start output - &printheader($r,'/adm/email?display='.&escape($msgid),'Display a Message','',$content{'baseurl'}); + &printheader($r,'/adm/email?display='.&escape($msgid),'Display a Message','', + $content{'baseurl'},$head_extra); # Prepare available functions my @functionlist; @@ -2189,7 +2244,8 @@ sub displaymessage { my @actionlist; if ($env{'user.adv'}) { - if (&Apache::lonnet::allowed('vgr',$env{'request.course.id'})) { + if (($env{'request.course.id'}) && ($from_student) && + (&Apache::lonnet::allowed('vgr',$env{'request.course.id'}))) { push(@actionlist,&Apache::loncommon::track_student_link( 'View recent activity' ,$content{'sendername'} @@ -2492,7 +2548,7 @@ sub displaymessage { # Message $r->print(&Apache::lonhtmlcommon::row_title(&mt('Message')) - .'
'
+             .'
'
 	     .&Apache::lontexconvert::msgtexconverted($content{'message'},1)
 	     .'
' ); @@ -2652,6 +2708,13 @@ sub displayresource { } # Could not get a symb, give up unless ($symb) { return $content{'citation'}; } + if ($symb =~ /ext\.tool$/) { + return '

'.&mt('Current transactions for student (if applicable)').'

'. + &Apache::loncommon::get_previous_attempt($symb, + $content{'sendername'}, + $content{'senderdomain'}, + $content{'courseid'}); + } # Have a symb, can render return '

'.&mt('Current attempts of student (if applicable)').'

'. &Apache::loncommon::get_previous_attempt($symb, @@ -2677,13 +2740,16 @@ sub displayresource { # ================================================================== The Header sub header { - my ($r,$title,$baseurl)=@_; + my ($r,$title,$baseurl,$head_extra)=@_; my $extra = &Apache::loncommon::studentbrowser_javascript(); if ($baseurl) { $extra .= ""; } $extra .= ''; + if ($head_extra) { + $extra .= "\n$head_extra"; + } $r->print(&Apache::loncommon::start_page('Messages', $extra)); $r->print(&Apache::lonhtmlcommon::breadcrumbs @@ -2693,11 +2759,11 @@ sub header { # ---------------------------------------------------------------- Print header sub printheader { - my ($r,$url,$desc,$title,$baseurl)=@_; + my ($r,$url,$desc,$title,$baseurl,$head_extra)=@_; &Apache::lonhtmlcommon::add_breadcrumb ({href=>$url, text=>$desc}); - &header($r,$title,$baseurl); + &header($r,$title,$baseurl,$head_extra); } # ------------------------------------------------------------ Store the comment @@ -2754,8 +2820,15 @@ sub sendoffmail { $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; } - if ($env{'form.send'}) { - if (!$env{'form.multiforward'}) { + my $clientip = &Apache::lonnet::get_requestor_ip($r); + my %setters; + my ($startblock,$endblock,$triggerblock,$by_ip,$blockdom) = + &Apache::loncommon::blockcheck(\%setters,'com',$clientip); + if ($by_ip) { + &printheader($r,'','Sending messages blocked from your location.'); + return 'blocked'; + } elsif ($env{'form.send'}) { + if (!$env{'form.multiforward'}) { if ($group eq '') { &printheader($r,'','Messages being sent.'); } else { @@ -2785,6 +2858,8 @@ sub sendoffmail { my $mode = $env{'form.sendmode'}; my (%toaddr,$tos,$cc,$bcc,$broadcast); + my (%willtrust,%trustchecked,%disallowed); + my $serverdefdom = &Apache::lonnet::default_login_domain(); if ($mode eq 'group') { if (defined($env{'form.courserecips'})) { @@ -2794,9 +2869,17 @@ sub sendoffmail { foreach my $dest (@to) { my ($user,$domain) = split(/:/, $dest); if (($user ne '') && ($domain ne '')) { - my $rec = $user.":".$domain; - $toaddr{$rec} = ''; - $broadcast->{$rec} = ''; + unless ($trustchecked{$domain}) { + $willtrust{$domain} = &Apache::lonnet::will_trust('msg',$serverdefdom,$domain); + $trustchecked{$domain} = 1; + } + if ($willtrust{$domain}) { + my $rec = $user.":".$domain; + $toaddr{$rec} = ''; + $broadcast->{$rec} = ''; + } else { + $disallowed{'to'}{$user.":".$domain} = 1; + } } } } @@ -2807,22 +2890,47 @@ sub sendoffmail { if ($txt) { $rec =~ s/^\s+//; $rec =~ s/\s+$//; - $toaddr{$rec}.=$txt."\n"; - $broadcast->{$rec} = ''; + my ($recuname,$recudom) = split(/:/,$rec); + unless ($trustchecked{$recudom}) { + $willtrust{$recudom} = &Apache::lonnet::will_trust('msg',$serverdefdom,$recudom); + $trustchecked{$recudom} = 1; + } + if ($willtrust{$recudom}) { + $toaddr{$rec}.=$txt."\n"; + $broadcast->{$rec} = ''; + } else { + $disallowed{'to'}{$rec} = 1; + } } } } else { if (($env{'form.recuname'} ne '') && ($env{'form.recdomain'} ne '')) { - $toaddr{$env{'form.recuname'}.':'.$env{'form.recdomain'}}=''; - $tos->{$env{'form.recuname'}.':'.$env{'form.recdomain'}}=''; + unless ($trustchecked{$env{'form.recdomain'}}) { + $willtrust{$env{'form.recdomain'}} = &Apache::lonnet::will_trust('msg',$serverdefdom,$env{'form.recdomain'}); + $trustchecked{$env{'form.recdomain'}} = 1; + } + if ($willtrust{$env{'form.recdomain'}}) { + $toaddr{$env{'form.recuname'}.':'.$env{'form.recdomain'}}=''; + $tos->{$env{'form.recuname'}.':'.$env{'form.recdomain'}}=''; + } else { + $disallowed{'to'}{$env{'form.recuname'}.':'.$env{'form.recdomain'}}; + } } } if ($env{'form.additionalrec_to'}) { foreach my $rec (split(/\s*,\s*/,$env{'form.additionalrec_to'})) { my ($auname,$audom)=split(/:/,$rec); if (($auname ne "") && ($audom ne "")) { - $toaddr{$auname.':'.$audom}=''; - $tos->{$auname.':'.$audom}=''; + unless ($trustchecked{$audom}) { + $willtrust{$audom} = &Apache::lonnet::will_trust('msg',$serverdefdom,$audom); + $trustchecked{$audom} = 1; + } + if ($willtrust{$audom}) { + $toaddr{$auname.':'.$audom}=''; + $tos->{$auname.':'.$audom}=''; + } else { + $disallowed{'to'}{$auname.':'.$audom}; + } } } } @@ -2832,8 +2940,16 @@ sub sendoffmail { foreach my $rec (@toreplies) { my ($auname,$audom)=split(/:/,$rec); if (($auname ne "") && ($audom ne "")) { - $toaddr{$auname.':'.$audom}=''; - $tos->{$auname.':'.$audom}=''; + unless ($trustchecked{$audom}) { + $willtrust{$audom} = &Apache::lonnet::will_trust('msg',$serverdefdom,$audom); + $trustchecked{$audom} = 1; + } + if ($willtrust{$audom}) { + $toaddr{$auname.':'.$audom}=''; + $tos->{$auname.':'.$audom}=''; + } else { + $disallowed{'to'}{$auname.':'.$audom}; + } } } } @@ -2841,9 +2957,17 @@ sub sendoffmail { foreach my $rec (split(/\s*,\s*/,$env{'form.additionalrec_cc'})) { my ($auname,$audom)=split(/:/,$rec); if (($auname ne "") && ($audom ne "")) { - $toaddr{$auname.':'.$audom}=''; if (!defined($tos->{$auname.':'.$audom})) { - $cc->{$auname.':'.$audom}=''; + unless ($trustchecked{$audom}) { + $willtrust{$audom} = &Apache::lonnet::will_trust('msg',$serverdefdom,$audom); + $trustchecked{$audom} = 1; + } + if ($willtrust{$audom}) { + $toaddr{$auname.':'.$audom}=''; + $cc->{$auname.':'.$audom}=''; + } else { + $disallowed{'cc'}{$auname.':'.$audom}; + } } } } @@ -2854,9 +2978,17 @@ sub sendoffmail { foreach my $rec (@ccreplies) { my ($auname,$audom)=split(/:/,$rec); if (($auname ne "") && ($audom ne "")) { - $toaddr{$auname.':'.$audom}=''; if (!defined($tos->{$auname.':'.$audom})) { - $cc->{$auname.':'.$audom}=''; + unless ($trustchecked{$audom}) { + $willtrust{$audom} = &Apache::lonnet::will_trust('msg',$serverdefdom,$audom); + $trustchecked{$audom} = 1; + } + if ($willtrust{$audom}) { + $toaddr{$auname.':'.$audom}=''; + $cc->{$auname.':'.$audom}=''; + } else { + $disallowed{'cc'}{$auname.':'.$audom} = 1; + } } } } @@ -2867,9 +2999,17 @@ sub sendoffmail { foreach my $rec (@groupreplies) { my ($auname,$audom)=split(/:/,$rec); if (($auname ne "") && ($audom ne "")) { - $toaddr{$auname.':'.$audom}=''; if (!defined($tos->{$auname.':'.$audom})) { - $broadcast->{$auname.':'.$audom}=''; + unless ($trustchecked{$audom}) { + $willtrust{$audom} = &Apache::lonnet::will_trust('msg',$serverdefdom,$audom); + $trustchecked{$audom} = 1; + } + if ($willtrust{$audom}) { + $toaddr{$auname.':'.$audom}=''; + $broadcast->{$auname.':'.$audom}=''; + } else { + $disallowed{'to'}{$auname.':'.$audom} = 1; + } } } } @@ -2878,10 +3018,18 @@ sub sendoffmail { foreach my $rec (split(/\s*,\s*/,$env{'form.additionalrec_bcc'})) { my ($auname,$audom)=split(/:/,$rec); if (($auname ne "") && ($audom ne "")) { - $toaddr{$auname.':'.$audom}=''; - if ((!defined($tos->{$auname.':'.$audom})) && + if ((!defined($tos->{$auname.':'.$audom})) && (!defined($cc->{$auname.':'.$audom}))) { - $bcc->{$auname.':'.$audom}=''; + unless ($trustchecked{$audom}) { + $willtrust{$audom} = &Apache::lonnet::will_trust('msg',$serverdefdom,$audom); + $trustchecked{$audom} = 1; + } + if ($willtrust{$audom}) { + $toaddr{$auname.':'.$audom}=''; + $bcc->{$auname.':'.$audom}=''; + } else { + $disallowed{'bcc'}{$auname.':'.$audom} = 1; + } } } } @@ -2901,42 +3049,42 @@ sub sendoffmail { } else { $savemsg=&Apache::lonfeedback::clear_out_html($env{'form.message'}); } - my %reciphash = ( - to => $tos, - cc => $cc, - bcc => $bcc, - ); - if ($mode eq 'group') { - if ($group eq '') { - $reciphash{'course_broadcast'} = $broadcast; - } else { - if ($env{'form.groupmail'} eq 'cc') { - $reciphash{'group_cc_broadcast'} = $broadcast; + my ($recipid, @recusers, @recudoms, %permresults); + if (keys(%toaddr) > 0) { + my %reciphash = ( + to => $tos, + cc => $cc, + bcc => $bcc, + ); + if ($mode eq 'group') { + if ($group eq '') { + $reciphash{'course_broadcast'} = $broadcast; } else { - $reciphash{'group_bcc_broadcast'} = $broadcast; + if ($env{'form.groupmail'} eq 'cc') { + $reciphash{'group_cc_broadcast'} = $broadcast; + } else { + $reciphash{'group_bcc_broadcast'} = $broadcast; + } } } - } - 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 To, Bcc and Cc recipients for '.$env{'user.name'}.':'.$env{'user.domain'}); - } - if ($env{'form.attachment'}) { - if (length($env{'form.attachment'})<131072) { - $attachmenturl=&Apache::lonnet::userfileupload('attachment',undef,'feedback/'.$now); - } else { - $r->print('

'.&mt('Attachment not included - exceeded permitted length').'

'); - } - } elsif ($env{'form.multiforward'}) { - if ($env{'form.attachmenturl'} ne '') { - $attachmenturl = $env{'form.attachmenturl'}; + ($recipid,my $recipstatus) = + &Apache::lonmsg::store_recipients($msgsubj,$env{'user.name'}, + $env{'user.domain'},\%reciphash); + if ($recipstatus ne 'ok') { + &Apache::lonnet::logthis('Failed to store To, Bcc and Cc recipients for '.$env{'user.name'}.':'.$env{'user.domain'}); + } + if ($env{'form.attachment'}) { + if (length($env{'form.attachment'}) <= 1048576) { + $attachmenturl=&Apache::lonnet::userfileupload('attachment',undef,'feedback/'.$now); + } else { + $r->print('

'.&mt('Attachment not included - exceeded permitted length').'

'); + } + } elsif ($env{'form.multiforward'}) { + if ($env{'form.attachmenturl'} ne '') { + $attachmenturl = $env{'form.attachmenturl'}; + } } } - my @recusers; - my @recudoms; - my %permresults; foreach my $address (sort(keys(%toaddr))) { my ($recuname,$recdomain)=split(/\:/,$address); my $msgtxt = $savemsg; @@ -3074,6 +3222,23 @@ sub sendoffmail { $r->print($message); } } + if (keys(%disallowed)) { + if ((ref($disallowed{'to'}) eq 'HASH') && (keys(%{$disallowed{'to'}}) > 0)) { + $r->print(&mt("The following recipients were excluded because the user's domain does not accept messages from server's domain:").'
  • '. + join("
  • \n",sort(keys(%{$disallowed{'to'}}))). + '

    • '); + } + if (ref($disallowed{'cc'}) eq 'HASH') { + $r->print(&mt("The following CCs were excluded because the user's domain does not accept messages from server's domain:").'
      • '. + join("
      • \n",sort(keys(%{$disallowed{'cc'}}))). + '

        • '); + } + if (ref($disallowed{'bcc'}) eq 'HASH') { + $r->print(&mt("The following BCCs were excluded because the user's domain does not accept messages from server's domain:").'
          • '. + join("
          • \n",sort(keys(%{$disallowed{'bcc'}}))). + '

            • '); + } + } } else { &printheader($r,'','Messages cancelled.'); return 'cancelled'; @@ -3356,8 +3521,12 @@ sub handler { my $count = keys(%forwardfail); my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Could not forward [quant,_1,message].',$count),1); foreach my $key (keys(%forwardfail)) { - $message .= '
              '.&mt('Could not deliver forwarded message.').' '. - &mt('The recipient addresses may need to be corrected').' ('.$forwardfail{$key}.')'; + $message .= '
              '.&mt('Could not deliver forwarded message.').' '; + if ($forwardfail{$key} eq 'blocked') { + $message .= &mt('Sending messages is blocked from your IP address'); + } else { + $message .= &mt('The recipient addresses may need to be corrected').' ('.$forwardfail{$key}.')'; + } } $message = &Apache::loncommon::confirmwrapper($message); $r->print($message); 500 Internal Server Error

              Internal Server Error

              The server encountered an internal error or misconfiguration and was unable to complete your request.

              Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

              More information about this error may be available in the server error log.