--- loncom/interface/lonmsgdisplay.pm 2011/12/28 21:49:54 1.159
+++ loncom/interface/lonmsgdisplay.pm 2017/12/18 23:20:48 1.186
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Routines for messaging display
#
-# $Id: lonmsgdisplay.pm,v 1.159 2011/12/28 21:49:54 raeburn Exp $
+# $Id: lonmsgdisplay.pm,v 1.186 2017/12/18 23:20:48 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -102,6 +102,8 @@ use HTML::TokeParser();
use Apache::Constants qw(:common);
use Apache::loncommon();
use Apache::lonhtmlcommon();
+use Apache::longroup;
+use Apache::lonnavmaps;
use Apache::lontexconvert();
use HTML::Entities();
use Apache::lonlocal;
@@ -120,21 +122,23 @@ my $startdis='';
sub folderlist {
my ($folder,$msgstatus) = @_;
- my %lt = &Apache::lonlocal::texthash(
+ my %html_lt = &Apache::lonlocal::texthash(
actn => 'Action',
fold => 'Folder',
show => 'Show',
status => 'Message Status',
go => 'Go',
+
+ );
+ &html_escape(\%html_lt);
+ my %js_lt = &Apache::lonlocal::texthash(
nnff => 'New Name for Folder',
newn => 'New Name',
- thfm => 'The folder may not be renamed',
- fmnb => 'folder may not be renamed as it is a folder provided by the system.',
- asth => 'as this name is already in use for a system-provided or user-defined folder.',
- the => 'The',
- tnfm => 'The new folder may not be named',
+ fmnb => 'Folder may not be renamed as it is a folder provided by the system.',
+ asth => 'Requested name already in use for a system-provided or user-defined folder.',
);
+ &js_escape(\%js_lt);
# set se lastvisit for the new mail check in the toplevel menu
&Apache::lonnet::appenv({'user.mailcheck.lastvisit'=>time});
@@ -182,16 +186,16 @@ function folder_choice(targetform,caller
if (targetform.folderaction.options[targetform.folderaction.selectedIndex].value == 'rename') {
for (var i=0; i
+
'."\n".
''.
''.
@@ -261,8 +270,8 @@ sub get_permanent_folders {
my %permfolders =
&Apache::lonlocal::texthash('' => 'INBOX',
'trash' => 'TRASH',
- 'critical' => 'Critical',
- 'sent' => 'Sent Messages',
+ 'critical' => 'CRITICAL',
+ 'sent' => 'SENT MESSAGES',
);
return %permfolders;
}
@@ -378,7 +387,7 @@ sub deletefolder {
my ($folder)=@_;
my %permfolders = &get_permanent_folders();
if (defined($permfolders{$folder})) {
- return &mt('The folder "[_1]" may not be deleted.',$folder);
+ return &mt('The folder "[_1]" may not be deleted.',$permfolders{$folder});
}
my %userfolders = &Apache::lonmsg::get_user_folders();
if (!defined($userfolders{$folder})) {
@@ -543,7 +552,7 @@ sub discourse {
$result .= ' ';
if (ref($statushash) eq 'HASH') {
$statushash->{'active'} = 1;
@@ -564,7 +573,7 @@ sub discourse {
$result .= ' ';
if (ref($statushash) eq 'HASH') {
$statushash->{'previous'} = 1;
@@ -587,7 +596,7 @@ sub discourse {
$result .= '';
if (ref($statushash) eq 'HASH') {
$statushash->{'future'} = 1;
@@ -662,7 +671,7 @@ sub disgroup {
}
$r->print(''."\n"
+ );
my $postedstartdis=$startdis+1;
$r->print('');
if ($numblocked > 0) {
@@ -1381,11 +1412,14 @@ sub compout {
'to' => 'To:',
);
my %attachmax = (
- text => &mt('(128 KB max size)'),
- num => 131072,
+ text => &mt('(1 MB max size)'),
+ num => 1048576,
);
if (!$forwarding && !$multiforward) {
- $attachrow = '
'.$lt{'atta'}.' '.$attachmax{'text'}.':
';
+ $attachrow = '
'.$lt{'atta'}.' '.$attachmax{'text'}
+ .': '
+ .'
'
+ .'';
}
if (&Apache::lonnet::allowed('srm',$env{'request.course.id'})
|| &Apache::lonnet::allowed('srm',$env{'request.course.id'}.
@@ -1462,9 +1496,12 @@ function courseRecipients() {
document.compemail.groupmail.value = document.$formname.groupmail[document.$formname.groupmail.selectedIndex].value;
|;
}
+ #typeof(...forminput.length) returns 'undefined' if only one entry exists
$broadcast_js .= qq|
if (typeof(document.$formname.selectedusers_forminput.length)=="undefined") {
- document.compemail.courserecips.value += '_&&&_'+document.$formname.selectedusers_forminput.value;
+ if (document.$formname.selectedusers_forminput.checked) {
+ document.compemail.courserecips.value += '_&&&_'+document.$formname.selectedusers_forminput.value;
+ }
} else {
for (var i=0; iprint(&additional_rec_row(\%lt));
$r->print('
'.
&mt('Unless you choose otherwise:').'
'.
- &mt("The subject in each forwarded message will be 'Forwarding:' followed by the original subject.").'
'.
- &mt("The message itself will begin with a first line: 'Forwarded message from' followed by the original sender's name.").'
');
+ &mt("The subject in each forwarded message will be [_1]'Forwarding:'[_2] followed by the original subject.",'','').'
'.
+ &mt("The message itself will begin with a first line: [_1]'Forwarded message from'[_2] followed by the original sender's name.",'','').'
');
$func1='Forward'; # do not translate here!
$dissub = &mt('Forwarding').': ';
$subj_size = '10';
@@ -1730,7 +1767,7 @@ ENDBLOCK
'
-'.&mt('The messages will be assembled from all lines with the respective'."\n".'username:domain, and appended to the general message text.'));
+'.&mt('The messages will be assembled from all lines with the respective [_1][_2]username:domain[_3], and appended to the general message text.',' ','',''));
$r->print(<
@@ -1884,7 +1921,7 @@ sub disfacetoface {
$env{'course.'.$env{'request.course.id'}.'.domain'},
$env{'course.'.$env{'request.course.id'}.'.num'},
'%255b'.$user.'%253a'.$domain.'%255d');
- my $result='
';
+ my $result='';
foreach my $key (sort(keys(%records))) {
my %content=&Apache::lonmsg::unpackagemsg($records{$key});
next if ($content{'senderdomain'} eq '');
@@ -1916,8 +1953,7 @@ sub disfacetoface {
} else {
%content=&Apache::lonmsg::unpackagemsg($content{'message'});
$content{'message'} =
- ''.&mt('Subject').': '.$content{'subject'}.' '.&mt('Subject').': '.$content{'subject'}.' '.
$content{'message'};
}
} else {
@@ -1946,15 +1982,15 @@ $content{'sendername'}.':'.
if ($result eq '') {
my $lctype = &mt(lc(&Apache::loncommon::course_type()));
if ($target ne 'tex') {
- $r->print("
".&mt('No notes, face-to-face discussion records, critical messages, or broadcast messages in this [_1].',$lctype)."
");
+ $r->print("
".&mt('No notes, face-to-face discussion records, critical messages or broadcast messages in this '.$lctype.'.')."
");
} else {
- $r->print('\textbf{'.&mt('No notes, face-to-face discussion records, critical messages or broadcast messages in this [_1].',$lctype).'}\\\\');
+ $r->print('\textbf{'.&mt('No notes, face-to-face discussion records, critical messages or broadcast messages in this '.$lctype.'.').'}\\\\');
}
- } elsif ($target ne 'tex') {
- $r->print($result.'
');
+ }
}
sub general_message {
@@ -2038,7 +2074,7 @@ sub facetoface {
.&mt('Discussion and message records for [_1] ([_2])'
,$aboutmelink
,$env{'form.recuname'}.':'.$env{'form.recdomain'})
- .'
'
+ .'
'
);
&disfacetoface($r,$env{'form.recuname'},$env{'form.recdomain'});
$r->print(<'
.&mt('Delete')
.'');
- push(@functionlist,''
- .&mt('Back to Folder Display')
- .'');
+
+# Prepare available navigation
+ my @navigationlist;
if ($counter > 0){
- push(@functionlist,''
+ push(@navigationlist,''
.&mt('Previous')
.'');
}
if ($counter < $number_of_messages - 1){
- push(@functionlist,''
+ push(@navigationlist,''
.&mt('Next')
.'');
}
+ push(@navigationlist,''
+ .&mt('Back to Folder Display')
+ .'');
# Prepare available actions
my $symb;
@@ -2147,12 +2186,13 @@ sub displaymessage {
} elsif (defined($content{'baseurl'})) {
$symb=&Apache::lonnet::symbread($content{'baseurl'});
}
- my @actionlist;
+ 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(
- &mt('View recent activity')
+ 'View recent activity'
,$content{'sendername'}
,$content{'senderdomain'}
,'check'));
@@ -2175,7 +2215,7 @@ sub displaymessage {
}
}
-# Print functionlist and actionlist in page header
+# Print functionlist, navigationlist, and actionlist in page header
my $functions='
';
# Functionlist
@@ -2185,10 +2225,18 @@ sub displaymessage {
}
$functions .= &Apache::lonhtmlcommon::end_funclist();
+ # Navigationlist
+ $functions.=&Apache::lonhtmlcommon::start_funclist(
+ &mt('Navigation'));
+ foreach my $item (@navigationlist) {
+ $functions.=&Apache::lonhtmlcommon::add_item_funclist($item);
+ }
+ $functions .= &Apache::lonhtmlcommon::end_funclist();
+
# Actionlist
if (@actionlist) {
- my $legendtext=&mt('Currently available actions (will open extra window)');
- $functions.=&Apache::lonhtmlcommon::start_funclist($legendtext);
+ $functions.=&Apache::lonhtmlcommon::start_funclist(
+ &mt('Currently available actions (will open extra window)'));
foreach my $item (@actionlist) {
$functions.=&Apache::lonhtmlcommon::add_item_funclist($item);
}
@@ -2605,6 +2653,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,
@@ -2635,6 +2690,8 @@ sub header {
if ($baseurl) {
$extra .= "";
}
+ $extra .= '';
$r->print(&Apache::loncommon::start_page('Messages',
$extra));
$r->print(&Apache::lonhtmlcommon::breadcrumbs
@@ -2672,7 +2729,7 @@ sub storedcommentlisting {
'^'.&escape(&escape($env{'form.showcommentbaseurl'})));
$r->print(&Apache::loncommon::start_page('Saved Comment Listing',undef,
{'onlybody' => 1}));
- if ((keys %msgs)[0]=~/^error\:/) {
+ if ((keys(%msgs))[0]=~/^error\:/) {
$r->print(&mt('No saved comments yet.'));
} else {
my $found=0;
@@ -2706,7 +2763,7 @@ sub sendoffmail {
$cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
}
if ($env{'form.send'}) {
- if (!$env{'form.multiforward'}) {
+ if (!$env{'form.multiforward'}) {
if ($group eq '') {
&printheader($r,'','Messages being sent.');
} else {
@@ -2736,6 +2793,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'})) {
@@ -2745,9 +2804,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;
+ }
}
}
}
@@ -2758,22 +2825,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};
+ }
}
}
}
@@ -2783,8 +2875,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};
+ }
}
}
}
@@ -2792,9 +2892,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};
+ }
}
}
}
@@ -2805,9 +2913,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;
+ }
}
}
}
@@ -2818,9 +2934,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;
+ }
}
}
}
@@ -2829,10 +2953,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;
+ }
}
}
}
@@ -2852,41 +2984,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'})<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'};
+ }
}
}
- my @recusers;
- my @recudoms;
foreach my $address (sort(keys(%toaddr))) {
my ($recuname,$recdomain)=split(/\:/,$address);
my $msgtxt = $savemsg;
@@ -2903,7 +3036,8 @@ sub sendoffmail {
$env{'form.sendbck'},
$env{'form.permanent'},
\$sentmessage{$address},
- $nosentstore,$recipid);
+ $nosentstore,$recipid,
+ $attachmenturl,\%permresults);
} else {
$r->print(&mt('Sending').' '.$recuname.':'.$recdomain.': ');
@thismsg=
@@ -2914,13 +3048,20 @@ sub sendoffmail {
$env{'form.permanent'},
\$sentmessage{$address},
undef,undef,undef,
- $nosentstore,$recipid);
+ $nosentstore,$recipid,
+ \%permresults);
}
$msg_status{$recuname.':'.$recdomain}=join(' ',@thismsg);
if ($msg_status{$recuname.':'.$recdomain} =~ /(ok|con_delayed)/) {
$numsent++;
push(@recusers,$recuname);
push(@recudoms,$recdomain);
+ if ($1 eq 'ok') {
+ $r->print('ok ');
+ }
+ if ($permresults{$recuname.':'.$recdomain}) {
+ $r->print(' (email) ');
+ }
}
$sendstatus.=' '.join(' ',@thismsg);
}
@@ -3016,6 +3157,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:").'