--- loncom/interface/lonmsg.pm 2015/02/12 21:22:07 1.238 +++ loncom/interface/lonmsg.pm 2020/12/18 15:23:02 1.246 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines for messaging # -# $Id: lonmsg.pm,v 1.238 2015/02/12 21:22:07 raeburn Exp $ +# $Id: lonmsg.pm,v 1.246 2020/12/18 15:23:02 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -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); @@ -231,6 +231,7 @@ sub packagemsg { $attachmenturl =&HTML::Entities::encode($attachmenturl,'<>&"'); my $course_context = &get_course_context(); my $now=time; + my $ip = &Apache::lonnet::get_requestor_ip(); my $msgcount = &get_uniq(); unless(defined($msgid)) { $msgid = &buildmsgid($now,$subject,$env{'user.name'},$env{'user.domain'}, @@ -250,7 +251,7 @@ sub packagemsg { } $result .= ''.$ENV{'SERVER_NAME'}.''. ''.$ENV{'HTTP_HOST'}.''. - ''.$ENV{'REMOTE_ADDR'}.''. + ''.$ip.''. ''.$env{'browser.type'}.''. ''.$env{'browser.os'}.''. ''.$env{'browser.version'}.''. @@ -397,14 +398,17 @@ sub buildmsgid { } sub unpackmsgid { - my ($msgid,$folder,$skipstatus,$status_cache)=@_; + my ($msgid,$folder,$skipstatus,$status_cache,$onlycid)=@_; $msgid=&unescape($msgid); my ($sendtime,$shortsubj,$fromname,$fromdomain,$count,$fromcid, $processid,$symb,$error) = split(/\:/,&unescape($msgid)); + if (!defined($processid)) { $fromcid = ''; } + if (($onlycid) && ($onlycid ne $fromcid)) { + return ($sendtime,'',$fromname,$fromdomain,'',$fromcid,'',$error); + } $shortsubj = &unescape($shortsubj); $shortsubj = &HTML::Entities::decode($shortsubj); $symb = &unescape($symb); - if (!defined($processid)) { $fromcid = ''; } my %status=(); unless ($skipstatus) { if (ref($status_cache)) { @@ -421,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; @@ -457,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; @@ -478,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'}; @@ -489,9 +492,10 @@ 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). + my $url = $protocol.'://'.$hostname. '/adm/email?username='.$touname.'&domain='.$toudom. '&display='.&escape($msgid); my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$fromcid, @@ -562,7 +566,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 ++; } } @@ -573,7 +577,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 ++; } } @@ -634,9 +638,9 @@ sub retrieve_author_res_msg { my ($domain,$author)=($url=~/^($match_domain)\/($match_username)\//); my %errormsgs=&Apache::lonnet::dump('nohist_res_msgs',$domain,$author); my $msgs=''; - foreach (keys(%errormsgs)) { - if ($_=~/^\Q$url\E\_\d+$/) { - my %content=&unpackagemsg($errormsgs{$_}); + foreach my $msg (keys(%errormsgs)) { + if ($msg =~ /^\Q$url\E\_\d+$/) { + my %content=&unpackagemsg($errormsgs{$msg}); $msgs.='

'. $content{'time'}.': '.$content{'message'}. '

'; @@ -654,9 +658,9 @@ sub del_url_author_res_msg { $url=&Apache::lonnet::declutter($url); my ($domain,$author)=($url=~/^($match_domain)\/($match_username)\//); my @delmsgs=(); - foreach (&Apache::lonnet::getkeys('nohist_res_msgs',$domain,$author)) { - if ($_=~/^\Q$url\E\_\d+$/) { - push (@delmsgs,$_); + foreach my $msg (&Apache::lonnet::getkeys('nohist_res_msgs',$domain,$author)) { + if ($msg =~ /^\Q$url\E\_\d+$/) { + push (@delmsgs,$msg); } } return &Apache::lonnet::del('nohist_res_msgs',\@delmsgs,$domain,$author); @@ -668,9 +672,9 @@ sub clear_author_res_msg { $url=&Apache::lonnet::declutter($url); my ($domain,$author)=($url=~/^($match_domain)\/($match_username)\//); my @delmsgs=(); - foreach (&Apache::lonnet::getkeys('nohist_res_msgs',$domain,$author)) { - if ($_=~/^\Q$url\E/) { - push (@delmsgs,$_); + foreach my $msg (&Apache::lonnet::getkeys('nohist_res_msgs',$domain,$author)) { + if ($msg =~ /^\Q$url\E/) { + push (@delmsgs,$msg); } } return &Apache::lonnet::del('nohist_res_msgs',\@delmsgs,$domain,$author); @@ -681,8 +685,8 @@ sub clear_author_res_msg { sub all_url_author_res_msg { my ($author,$domain)=@_; my %returnhash=(); - foreach (&Apache::lonnet::getkeys('nohist_res_msgs',$domain,$author)) { - $_=~/^(.+)\_\d+/; + foreach my $msg (&Apache::lonnet::getkeys('nohist_res_msgs',$domain,$author)) { + $msg =~ /^(.+)\_\d+/; $returnhash{$1}=1; } return %returnhash; @@ -742,7 +746,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) { @@ -751,7 +755,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) { @@ -886,7 +890,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) { @@ -896,7 +900,7 @@ sub user_normal_msg_raw { } unless ($numperm) { $numperm = &sendnotification($permemail,$user,$domain,$subject,0, - $text,$msgid); + $text,$msgid,$attachmenturl); } } if ($toperm) { @@ -926,8 +930,8 @@ sub user_normal_msg { $domain,$user); my $msgforward=$userenv{'msgforward'}; if ($msgforward) { - foreach (split(/\,/,$msgforward)) { - my ($forwuser,$forwdomain)=split(/\:/,$_); + foreach my $fwd (split(/\,/,$msgforward)) { + my ($forwuser,$forwdomain)=split(/\:/,$fwd); push(@status, &user_normal_msg_raw($forwuser,$forwdomain,$subject,$message, $citation,$baseurl,$attachmenturl,$toperm,