--- loncom/interface/lonmsg.pm 2022/01/19 03:33:46 1.239.2.4 +++ loncom/interface/lonmsg.pm 2021/11/30 15:55:37 1.247 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines for messaging # -# $Id: lonmsg.pm,v 1.239.2.4 2022/01/19 03:33:46 raeburn Exp $ +# $Id: lonmsg.pm,v 1.247 2021/11/30 15:55:37 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -120,7 +120,7 @@ Critical message to a user New routine that respects "forward" and calls old routine -=item * B: +=item * B: Sends a critical message $message to the $user at $domain. If $sendback is true, a receipt will be sent to the current user when $user receives the message. @@ -148,7 +148,7 @@ New routine that respects "forward" and =item * B: + $error,$nosentstore,$recipid,$permresults)>: Sends a message to the $user at $domain, with subject $subject and message $message. Additionally it will check if the user has a Forwarding address @@ -200,9 +200,9 @@ Returns use strict; use Apache::lonnet; +use Apache::loncommon; use HTML::TokeParser(); use Apache::lonlocal; -use Mail::Send; use HTML::Entities; use Encode; use LONCAPA qw(:DEFAULT :match); @@ -218,8 +218,8 @@ use LONCAPA qw(:DEFAULT :match); sub packagemsg { - my ($subject,$message,$citation,$baseurl,$attachmenturl,$recuser,$recdomain, - $msgid,$type,$crsmsgid,$symb,$error,$recipid,$senthide,$origmsgid)=@_; + my ($subject,$message,$citation,$baseurl,$attachmenturl, + $recuser,$recdomain,$msgid,$type,$crsmsgid,$symb,$error,$recipid)=@_; $message =&HTML::Entities::encode($message,'<>&"'); $citation=&HTML::Entities::encode($citation,'<>&"'); $subject =&HTML::Entities::encode($subject,'<>&"'); @@ -229,22 +229,6 @@ sub packagemsg { #remove machine specification $attachmenturl =~ s|^https?://[^/]+/|/|; $attachmenturl =&HTML::Entities::encode($attachmenturl,'<>&"'); - if ($senthide) { - foreach my $item ($subject,$message) { - if ($item ne '') { - $item = 'Not shown due to IP block'; - } - } - if ($attachmenturl ne '') { - $attachmenturl = ''; - } - if ($citation ne '') { - $citation = ''; - } - if ($msgid ne '') { - $msgid = ''; - } - } my $course_context = &get_course_context(); my $now=time; my $ip = &Apache::lonnet::get_requestor_ip(); @@ -335,9 +319,6 @@ sub packagemsg { } } } - if ($senthide) { - $result .= '$origmsgid'; - } return ($msgid,$result); } @@ -428,7 +409,6 @@ sub unpackmsgid { $shortsubj = &unescape($shortsubj); $shortsubj = &HTML::Entities::decode($shortsubj); $symb = &unescape($symb); - if (!defined($processid)) { $fromcid = ''; } my %status=(); unless ($skipstatus) { if (ref($status_cache)) { @@ -445,7 +425,7 @@ sub unpackmsgid { sub sendemail { - my ($to,$subject,$body,$to_uname,$to_udom,$user_lh)=@_; + my ($to,$subject,$body,$to_uname,$to_udom,$user_lh,$attachmenturl)=@_; my $senderaddress=''; my $replytoaddress=''; my $msgsent; @@ -481,19 +461,18 @@ sub sendemail { "*** ".($senderaddress?&mt_user($user_lh,'You can reply to this e-mail'):&mt_user($user_lh,'Please do not reply to this address.')."\n*** ". &mt_user($user_lh,'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 ($replytoaddress) { - $msg->add('Reply-to',$replytoaddress); - } - if ($senderaddress) { - $msg->add('From',$senderaddress); - } - $msg->add('Content-type','text/plain; charset=UTF-8'); - if (my $fh = $msg->open()) { - print $fh $body; - $fh->close; + $attachmenturl = &Apache::lonnet::filelocation("",$attachmenturl); + my $filesize = (stat($attachmenturl))[7]; + if ($filesize > 1048576) { + # Don't send if it exceeds 1 MB. + print '

' + .&mt('Email not sent. Attachment exceeds permitted length.') + .'

'; + } else { + # Otherwise build and send the email + $subject = '[LON-CAPA] '.$subject; + &Apache::loncommon::mime_email($senderaddress,$replytoaddress,$to, + $subject,$body,'','',$attachmenturl,'',''); $msgsent = 1; } return $msgsent; @@ -502,7 +481,7 @@ sub sendemail { # ==================================================== Send notification emails sub sendnotification { - my ($to,$touname,$toudom,$subj,$crit,$text,$msgid)=@_; + my ($to,$touname,$toudom,$subj,$crit,$text,$msgid,$attachmenturl)=@_; my $sender=$env{'environment.firstname'}.' '.$env{'environment.lastname'}; unless ($sender=~/\w/) { $sender=$env{'user.name'}.':'.$env{'user.domain'}; @@ -513,9 +492,11 @@ sub sendnotification { $text=~s/\<\;/\/gs; my $homeserver = &Apache::lonnet::homeserver($touname,$toudom); + my $hostname = &Apache::lonnet::hostname($homeserver); my $protocol = $Apache::lonnet::protocol{$homeserver}; $protocol = 'http' if ($protocol ne 'https'); - my $url = $protocol.'://'.&Apache::lonnet::hostname($homeserver). +#FIXME + my $url = $protocol.'://'.$hostname. '/adm/email?username='.$touname.'&domain='.$toudom. '&display='.&escape($msgid); my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$fromcid, @@ -590,7 +571,7 @@ to access the full message.',$url); } $body = $bodybegin.$bodysubj.$sendtext.$bodyend; } - if (&sendemail($addr,$subject,$body,$touname,$toudom,$user_lh)) { + if (&sendemail($addr,$subject,$body,$touname,$toudom,$user_lh,$attachmenturl)) { $numsent ++; } } @@ -601,7 +582,7 @@ to access the full message.',$url); my $htmlfree = &make_htmlfree($text); $body = $bodybegin.$bodysubj.$htmlfree.$bodyend; } - if (&sendemail($to,$subject,$body,$touname,$toudom,$user_lh)) { + if (&sendemail($to,$subject,$body,$touname,$toudom,$user_lh,$attachmenturl)) { $numsent ++; } } @@ -733,7 +714,7 @@ sub store_instructor_comment { sub user_crit_msg_raw { my ($user,$domain,$subject,$message,$sendback,$toperm,$sentmessage, - $nosentstore,$recipid,$attachmenturl,$permresults,$senthide)=@_; + $nosentstore,$recipid,$attachmenturl,$permresults)=@_; # Check if allowed missing my ($status,$packed_message); my $msgid='undefined'; @@ -751,15 +732,11 @@ sub user_crit_msg_raw { $$sentmessage = $packed_message; } if (!$nosentstore) { - my ($sentmsgid,$packed_message_no_citation) = + (undef,my $packed_message_no_citation) = &packagemsg($subject,$message,undef,undef,$attachmenturl,$user, - $domain,$msgid,undef,undef,undef,undef,undef,$senthide,$msgid); + $domain,$msgid); if ($status eq 'ok' || $status eq 'con_delayed') { - if ($senthide && $sentmsgid) { - &store_sent_mail($sentmsgid,$packed_message_no_citation); - } else { - &store_sent_mail($msgid,$packed_message_no_citation); - } + &store_sent_mail($msgid,$packed_message_no_citation); } } } else { @@ -774,7 +751,7 @@ sub user_crit_msg_raw { my $numperm = 0; my $permlogmsgstatus; if ($critnotify) { - $numcrit = &sendnotification($critnotify,$user,$domain,$subject,1,$text,$msgid); + $numcrit = &sendnotification($critnotify,$user,$domain,$subject,1,$text,$msgid,$attachmenturl); } if ($toperm && $permemail) { if ($critnotify && $numcrit) { @@ -783,7 +760,7 @@ sub user_crit_msg_raw { } } unless ($numperm) { - $numperm = &sendnotification($permemail,$user,$domain,$subject,1,$text,$msgid); + $numperm = &sendnotification($permemail,$user,$domain,$subject,1,$text,$msgid,$attachmenturl); } } if ($toperm) { @@ -809,7 +786,7 @@ sub user_crit_msg_raw { sub user_crit_msg { my ($user,$domain,$subject,$message,$sendback,$toperm,$sentmessage, - $nosentstore,$recipid,$attachmenturl,$permresults,$senthide)=@_; + $nosentstore,$recipid,$attachmenturl,$permresults)=@_; my @status; my %userenv = &Apache::lonnet::get('environment',['msgforward'], $domain,$user); @@ -820,13 +797,13 @@ sub user_crit_msg { push(@status, &user_crit_msg_raw($forwuser,$forwdomain,$subject,$message, $sendback,$toperm,$sentmessage,$nosentstore, - $recipid,$attachmenturl,$permresults,$senthide)); + $recipid,$attachmenturl,$permresults)); } } else { push(@status, &user_crit_msg_raw($user,$domain,$subject,$message,$sendback, $toperm,$sentmessage,$nosentstore,$recipid, - $attachmenturl,$permresults,$senthide)); + $attachmenturl,$permresults)); } if (wantarray) { return @status; @@ -875,7 +852,7 @@ sub user_crit_received { sub user_normal_msg_raw { my ($user,$domain,$subject,$message,$citation,$baseurl,$attachmenturl, $toperm,$currid,$newid,$sentmessage,$crsmsgid,$symb,$restitle, - $error,$nosentstore,$recipid,$permresults,$senthide)=@_; + $error,$nosentstore,$recipid,$permresults)=@_; # Check if allowed missing my ($status,$packed_message); my $msgid='undefined'; @@ -897,16 +874,11 @@ sub user_normal_msg_raw { ('email_status',{'recnewemail'=>time},$domain,$user); # Into sent-mail folder if sent mail storage required if (!$nosentstore) { - my ($sentmsgid,$packed_message_no_citation) = + (undef,my $packed_message_no_citation) = &packagemsg($subject,$message,undef,$baseurl,$attachmenturl, - $user,$domain,$currid,undef,$crsmsgid,$symb,$error, - undef,$senthide,$msgid); + $user,$domain,$currid,undef,$crsmsgid,$symb,$error); if ($status eq 'ok' || $status eq 'con_delayed') { - if ($senthide && $sentmsgid) { - &store_sent_mail($sentmsgid,$packed_message_no_citation); - } else { - &store_sent_mail($msgid,$packed_message_no_citation); - } + &store_sent_mail($msgid,$packed_message_no_citation); } } if (ref($newid) eq 'SCALAR') { @@ -923,7 +895,7 @@ sub user_normal_msg_raw { my $numperm = 0; my $permlogmsgstatus; if ($notify) { - $numnotify = &sendnotification($notify,$user,$domain,$subject,0,$text,$msgid); + $numnotify = &sendnotification($notify,$user,$domain,$subject,0,$text,$msgid,$attachmenturl); } if ($toperm && $permemail) { if ($notify && $numnotify) { @@ -933,7 +905,7 @@ sub user_normal_msg_raw { } unless ($numperm) { $numperm = &sendnotification($permemail,$user,$domain,$subject,0, - $text,$msgid); + $text,$msgid,$attachmenturl); } } if ($toperm) { @@ -957,7 +929,7 @@ sub user_normal_msg_raw { sub user_normal_msg { my ($user,$domain,$subject,$message,$citation,$baseurl,$attachmenturl, $toperm,$sentmessage,$symb,$restitle,$error,$nosentstore,$recipid, - $permresults,$senthide)=@_; + $permresults)=@_; my @status; my %userenv = &Apache::lonnet::get('environment',['msgforward'], $domain,$user); @@ -969,15 +941,13 @@ sub user_normal_msg { &user_normal_msg_raw($forwuser,$forwdomain,$subject,$message, $citation,$baseurl,$attachmenturl,$toperm, undef,undef,$sentmessage,undef,$symb, - $restitle,$error,$nosentstore,$recipid, - $permresults,$senthide)); + $restitle,$error,$nosentstore,$recipid,$permresults)); } } else { push(@status,&user_normal_msg_raw($user,$domain,$subject,$message, $citation,$baseurl,$attachmenturl,$toperm, undef,undef,$sentmessage,undef,$symb, - $restitle,$error,$nosentstore,$recipid, - $permresults,$senthide)); + $restitle,$error,$nosentstore,$recipid,$permresults)); } if (wantarray) { return @status;