version 1.214.2.4, 2009/01/04 16:21:10
|
version 1.244, 2018/12/27 18:14:25
|
Line 53 with <recipient username="$uname:$udom">
|
Line 53 with <recipient username="$uname:$udom">
|
Domain Coordinator e-mail for the storage of information about |
Domain Coordinator e-mail for the storage of information about |
recipients of the message/e-mail. |
recipients of the message/e-mail. |
|
|
=head1 FUNCTIONS |
=head1 SUBROUTINES |
|
|
=over 4 |
=over |
|
|
|
=pod |
|
|
|
=item packagemsg() |
|
|
|
Package |
|
|
|
=item get_course_context() |
|
|
|
=item unpackagemsg() |
|
|
|
Unpack message into a hash |
|
|
|
=item buildmsgid() |
|
|
|
Get info out of msgid |
|
|
|
=item unpackmsgid() |
|
|
|
=item sendemail() |
|
|
|
=item sendnotification() |
|
|
|
Send notification emails |
|
|
|
=item newmail() |
|
|
|
Check for email |
|
|
|
=item author_res_msg() |
|
|
|
Automated message to the author of a resource |
|
|
|
=item * B<author_res_msg($filename, $message)>: Sends message $message to the owner |
|
of the resource with the URI $filename. |
|
|
|
=item retrieve_author_res_msg() |
|
|
|
Retrieve author resource messages |
|
|
|
=item del_url_author_res_msg() |
|
|
|
Delete all author messages related to one URL |
|
|
|
=item clear_author_res_msg() |
|
|
|
Clear out all author messages in URL path |
|
|
|
=item all_url_author_res_msg() |
|
|
|
Return hash with URLs for which there is a resource message |
|
|
|
=item store_instructor_comment() |
|
|
|
Add a comment to the User Notes screen |
|
|
|
=item user_crit_msg_raw() |
|
|
|
Critical message to a user |
|
|
|
=item user_crit_msg() |
|
|
|
New routine that respects "forward" and calls old routine |
|
|
|
=item * B<user_crit_msg($user, $domain, $subject, $message, $sendback, $nosentstore, $recipid, $attachmenturl, $permresults)>: |
|
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. |
|
|
|
Additionally it will check if the user has a Forwarding address |
|
set, and send the message to that address instead |
|
|
|
returns |
|
- in array context a list of results for each message that was sent |
|
- in scalar context a space seperated list of results for each |
|
message sent |
|
|
|
|
|
=item user_crit_received() |
|
|
|
Critical message received |
|
|
|
=item user_normal_msg_raw() |
|
|
|
Normal communication |
|
|
|
=item user_normal_msg() |
|
|
|
New routine that respects "forward" and calls old routine |
|
|
|
=item * B<user_normal_msg($user, $domain, $subject, $message, $citation, |
|
$baseurl, $attachmenturl, $toperm, $sentmessage, $symb, $restitle, |
|
$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 |
|
set, and send the message to that address instead |
|
|
|
returns |
|
- in array context a list of results for each message that was sent |
|
- in scalar context a space seperated list of results for each |
|
message sent |
|
|
|
=item store_sent_mail() |
|
|
|
=item store_recipients() |
|
|
|
=item foldersuffix() |
|
|
|
=item get_user_folders() |
|
|
|
User-defined folders |
|
|
|
=item secapply() |
|
|
|
=item B<decide_receiver($feedurl,$author,$question,$course,$policy,$defaultflag)>: |
|
|
|
Arguments |
|
$feedurl - /res/ url of resource (only need if $author is true) |
|
$author,$question,$course,$policy - all true/false parameters |
|
if true will attempt to find the addresses of user that should receive |
|
this type of feedback (author - feedback to author of resource $feedurl, |
|
$question 'Resource Content Questions', $course 'Course Content Question', |
|
$policy 'Course Policy') |
|
(Additionally it also checks $env for whether the corresponding form.<name> |
|
element exists, for ease of use in a html response context) |
|
|
|
$defaultflag - (internal should be left blank) if true gather addresses |
|
that aren't for a section even if I have a section |
|
(used for reccursion internally, first we look for |
|
addresses for our specific section then we recurse |
|
and look for non section addresses) |
|
|
|
Returns |
|
$typestyle - string of html text, describing what addresses were found |
|
%to - a hash, which keys are addresses of users to send messages to |
|
the keys will look like name:domain |
|
|
|
=back |
|
|
=cut |
=cut |
|
|
use strict; |
use strict; |
use Apache::lonnet; |
use Apache::lonnet; |
|
use Apache::loncommon; |
use HTML::TokeParser(); |
use HTML::TokeParser(); |
use Apache::lonlocal; |
use Apache::lonlocal; |
use Mail::Send; |
use HTML::Entities; |
|
use Encode; |
use LONCAPA qw(:DEFAULT :match); |
use LONCAPA qw(:DEFAULT :match); |
|
|
{ |
{ |
Line 74 use LONCAPA qw(:DEFAULT :match);
|
Line 215 use LONCAPA qw(:DEFAULT :match);
|
} |
} |
} |
} |
|
|
# ===================================================================== Package |
|
|
|
sub packagemsg { |
sub packagemsg { |
my ($subject,$message,$citation,$baseurl,$attachmenturl, |
my ($subject,$message,$citation,$baseurl,$attachmenturl, |
Line 83 sub packagemsg {
|
Line 224 sub packagemsg {
|
$citation=&HTML::Entities::encode($citation,'<>&"'); |
$citation=&HTML::Entities::encode($citation,'<>&"'); |
$subject =&HTML::Entities::encode($subject,'<>&"'); |
$subject =&HTML::Entities::encode($subject,'<>&"'); |
#remove machine specification |
#remove machine specification |
$baseurl =~ s|^https?\://[^/]+/|/|; |
$baseurl =~ s|^https?://[^/]+/|/|; |
$baseurl =&HTML::Entities::encode($baseurl,'<>&"'); |
$baseurl =&HTML::Entities::encode($baseurl,'<>&"'); |
#remove machine specification |
#remove machine specification |
$attachmenturl =~ s|^https?\://[^/]+/|/|; |
$attachmenturl =~ s|^https?://[^/]+/|/|; |
$attachmenturl =&HTML::Entities::encode($attachmenturl,'<>&"'); |
$attachmenturl =&HTML::Entities::encode($attachmenturl,'<>&"'); |
my $course_context = &get_course_context(); |
my $course_context = &get_course_context(); |
my $now=time; |
my $now=time; |
Line 209 sub get_course_context {
|
Line 350 sub get_course_context {
|
return $course_context; |
return $course_context; |
} |
} |
|
|
# ================================================== Unpack message into a hash |
|
|
|
sub unpackagemsg { |
sub unpackagemsg { |
my ($message,$notoken,$noattachmentlink)=@_; |
my ($message,$notoken,$noattachmentlink)=@_; |
Line 247 sub unpackagemsg {
|
Line 387 sub unpackagemsg {
|
return %content; |
return %content; |
} |
} |
|
|
# ======================================================= Get info out of msgid |
|
|
|
sub buildmsgid { |
sub buildmsgid { |
my ($now,$subject,$uname,$udom,$msgcount,$course_context,$symb,$error,$pid) = @_; |
my ($now,$subject,$uname,$udom,$msgcount,$course_context,$symb,$error,$pid) = @_; |
Line 258 sub buildmsgid {
|
Line 397 sub buildmsgid {
|
} |
} |
|
|
sub unpackmsgid { |
sub unpackmsgid { |
my ($msgid,$folder,$skipstatus,$status_cache)=@_; |
my ($msgid,$folder,$skipstatus,$status_cache,$onlycid)=@_; |
$msgid=&unescape($msgid); |
$msgid=&unescape($msgid); |
my ($sendtime,$shortsubj,$fromname,$fromdomain,$count,$fromcid, |
my ($sendtime,$shortsubj,$fromname,$fromdomain,$count,$fromcid, |
$processid,$symb,$error) = split(/\:/,&unescape($msgid)); |
$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 = &unescape($shortsubj); |
$shortsubj = &HTML::Entities::decode($shortsubj); |
$shortsubj = &HTML::Entities::decode($shortsubj); |
$symb = &unescape($symb); |
$symb = &unescape($symb); |
if (!defined($processid)) { $fromcid = ''; } |
|
my %status=(); |
my %status=(); |
unless ($skipstatus) { |
unless ($skipstatus) { |
if (ref($status_cache)) { |
if (ref($status_cache)) { |
Line 282 sub unpackmsgid {
|
Line 424 sub unpackmsgid {
|
|
|
|
|
sub sendemail { |
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 $senderaddress=''; |
my $replytoaddress=''; |
my $replytoaddress=''; |
|
my $msgsent; |
if ($env{'form.can_reply'} eq 'N') { |
if ($env{'form.can_reply'} eq 'N') { |
my $lonhost = $Apache::lonnet::perlvar{'lonHostID'}; |
my $lonhost = $Apache::lonnet::perlvar{'lonHostID'}; |
my $hostname = &Apache::lonnet::hostname($lonhost); |
my $hostname = &Apache::lonnet::hostname($lonhost); |
Line 306 sub sendemail {
|
Line 449 sub sendemail {
|
%senderemails=&Apache::loncommon::getemails(); |
%senderemails=&Apache::loncommon::getemails(); |
} |
} |
foreach my $type ('permanentemail','critnotification','notification') { |
foreach my $type ('permanentemail','critnotification','notification') { |
if ($senderemails{$type}) { |
if ($senderemails{$type}) { |
($senderaddress) = split(/,/,$senderemails{$type}); |
($senderaddress) = split(/,/,$senderemails{$type}); |
last if ($senderaddress); |
last if ($senderaddress); |
} |
} |
} |
} |
} |
} |
$body= |
$body= |
"*** ".&mt_user($user_lh,'This is an automatic message generated by the LON-CAPA system.')."\n". |
"*** ".&mt_user($user_lh,'This is an automatic e-mail generated by the LON-CAPA system.')."\n". |
"*** ".($senderaddress?&mt_user($user_lh,'You can reply to this message'):&mt_user($user_lh,'Please do not reply to this address.')."\n*** ". |
"*** ".($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; |
&mt_user($user_lh,'A reply will not be received by the recipient!'))."\n\n".$body; |
my $msg = new Mail::Send; |
|
$msg->to($to); |
$attachmenturl = &Apache::lonnet::filelocation("",$attachmenturl); |
$msg->subject('[LON-CAPA] '.$subject); |
my $filesize = (stat($attachmenturl))[7]; |
if ($replytoaddress) { |
if ($filesize > 1048576) { |
$msg->add('Reply-to',$replytoaddress); |
# Don't send if it exceeds 1 MB. |
} |
print '<p><span class="LC_error">' |
if ($senderaddress) { |
.&mt('Email not sent. Attachment exceeds permitted length.') |
$msg->add('From',$senderaddress); |
.'</span><br /></p>'; |
} |
} else { |
if (my $fh = $msg->open()) { |
# Otherwise build and send the email |
print $fh $body; |
$subject = '[LON-CAPA] '.$subject; |
$fh->close; |
&Apache::loncommon::mime_email($senderaddress, $to, $subject, $body, ,'', |
|
'', $attachmenturl, '', ''); |
|
$msgsent = 1; |
} |
} |
|
return $msgsent; |
} |
} |
|
|
# ==================================================== Send notification emails |
# ==================================================== Send notification emails |
|
|
sub sendnotification { |
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'}; |
my $sender=$env{'environment.firstname'}.' '.$env{'environment.lastname'}; |
unless ($sender=~/\w/) { |
unless ($sender=~/\w/) { |
$sender=$env{'user.name'}.':'.$env{'user.domain'}; |
$sender=$env{'user.name'}.':'.$env{'user.domain'}; |
} |
} |
my $critical=($crit?' critical':''); |
my $critical=($crit?' critical':''); |
|
my $numsent = 0; |
|
|
$text=~s/\<\;/\</gs; |
$text=~s/\<\;/\</gs; |
$text=~s/\>\;/\>/gs; |
$text=~s/\>\;/\>/gs; |
my $homeserver = &Apache::lonnet::homeserver($touname,$toudom); |
my $homeserver = &Apache::lonnet::homeserver($touname,$toudom); |
|
my $hostname = &Apache::lonnet::hostname($homeserver); |
my $protocol = $Apache::lonnet::protocol{$homeserver}; |
my $protocol = $Apache::lonnet::protocol{$homeserver}; |
$protocol = 'http' if ($protocol ne 'https'); |
$protocol = 'http' if ($protocol ne 'https'); |
my $url = $protocol.'://'.&Apache::lonnet::hostname($homeserver). |
my $url = $protocol.'://'.$hostname. |
'/adm/email?username='.$touname.'&domain='.$toudom; |
'/adm/email?username='.$touname.'&domain='.$toudom. |
|
'&display='.&escape($msgid); |
my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$fromcid, |
my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$fromcid, |
$symb,$error) = &Apache::lonmsg::unpackmsgid($msgid); |
$symb,$error) = &Apache::lonmsg::unpackmsgid($msgid); |
my ($coursetext,$body,$bodybegin,$bodysubj,$bodyend); |
my ($coursetext,$body,$bodybegin,$bodysubj,$bodyend); |
my $user_lh = &user_lang($touname,$toudom,$fromcid); |
my $user_lh = &Apache::loncommon::user_lang($touname,$toudom,$fromcid); |
if ($fromcid ne '') { |
if ($fromcid ne '') { |
$coursetext = "\n".&mt_user($user_lh,'Course').': '; |
$coursetext = "\n".&mt_user($user_lh,'Course').': '; |
if ($env{'course.'.$fromcid.'.description'} ne '') { |
if ($env{'course.'.$fromcid.'.description'} ne '') { |
Line 384 sub sendnotification {
|
Line 533 sub sendnotification {
|
|
|
to access the full message.',$url); |
to access the full message.',$url); |
my %userenv = &Apache::lonnet::get('environment',['notifywithhtml'],$toudom,$touname); |
my %userenv = &Apache::lonnet::get('environment',['notifywithhtml'],$toudom,$touname); |
my $subject = &mt_user($user_lh,"'New' $critical message from ").$sender; |
my $subject = &mt_user($user_lh,"'New'$critical message from [_1]",$sender); |
|
unless ($subj eq '') { |
|
$subject = $subj; |
|
} |
|
|
my ($blocked,$blocktext); |
my ($blocked,$blocktext); |
if (!$crit) { |
if (!$crit) { |
Line 400 to access the full message.',$url);
|
Line 552 to access the full message.',$url);
|
} |
} |
if ($userenv{'notifywithhtml'} ne '') { |
if ($userenv{'notifywithhtml'} ne '') { |
my @htmlexcerpt = split(/,/,$userenv{'notifywithhtml'}); |
my @htmlexcerpt = split(/,/,$userenv{'notifywithhtml'}); |
|
my $htmlfree = &make_htmlfree($text); |
foreach my $addr (@recipients) { |
foreach my $addr (@recipients) { |
if ($blocked) { |
if ($blocked) { |
$body = $bodybegin."\n".$blocktext."\n".$bodyend; |
$body = $bodybegin."\n".$blocktext."\n".$bodyend; |
} else { |
} else { |
my $sendtext = $text; |
my $sendtext; |
if (!grep/^\Q$addr\E/,@htmlexcerpt) { |
if (!grep/^\Q$addr\E/,@htmlexcerpt) { |
$sendtext =~ s/\<\/*[^\>]+\>//gs; |
$sendtext = $htmlfree; |
|
} else { |
|
$sendtext = $text; |
} |
} |
$body = $bodybegin.$bodysubj.$sendtext.$bodyend; |
$body = $bodybegin.$bodysubj.$sendtext.$bodyend; |
} |
} |
&sendemail($addr,$subject,$body,$touname,$toudom,$user_lh); |
if (&sendemail($addr,$subject,$body,$touname,$toudom,$user_lh,$attachmenturl)) { |
|
$numsent ++; |
|
} |
} |
} |
} else { |
} else { |
if ($blocked) { |
if ($blocked) { |
$body = $bodybegin."\n".$blocktext."\n".$bodyend; |
$body = $bodybegin."\n".$blocktext."\n".$bodyend; |
} else { |
} else { |
$text =~ s/\<\/*[^\>]+\>//gs; |
my $htmlfree = &make_htmlfree($text); |
$body = $bodybegin.$bodysubj.$text.$bodyend; |
$body = $bodybegin.$bodysubj.$htmlfree.$bodyend; |
|
} |
|
if (&sendemail($to,$subject,$body,$touname,$toudom,$user_lh,$attachmenturl)) { |
|
$numsent ++; |
} |
} |
&sendemail($to,$subject,$body,$touname,$toudom,$user_lh); |
|
} |
} |
|
return $numsent; |
|
} |
|
|
|
sub make_htmlfree { |
|
my ($text) = @_; |
|
$text =~ s/\<\/*[^\>]+\>//gs; |
|
$text = &HTML::Entities::decode($text); |
|
$text = &Encode::encode('utf8',$text); |
|
return $text; |
|
} |
|
|
|
sub mynewmail{ |
|
&newmail(); |
|
return $env{'user.mailcheck.lastnewmessagetime'} > $env{'user.mailcheck.lastvisit'}; |
} |
} |
# ============================================================= Check for email |
|
|
|
sub newmail { |
sub newmail { |
if ((time-$env{'user.mailcheck.time'})>300) { |
if ((time-$env{'user.mailcheck.time'})>300) { |
my %what=&Apache::lonnet::get('email_status',['recnewemail']); |
my %what=&Apache::lonnet::get('email_status',['recnewemail']); |
&Apache::lonnet::appenv({'user.mailcheck.time'=>time}); |
&Apache::lonnet::appenv({'user.mailcheck.time'=>time}); |
|
&Apache::lonnet::appenv({'user.mailcheck.lastnewmessagetime'=> $what{'recnewemail'}}); |
if ($what{'recnewemail'}>0) { return 1; } |
if ($what{'recnewemail'}>0) { return 1; } |
} |
} |
return 0; |
return 0; |
} |
} |
|
|
# =============================== Automated message to the author of a resource |
|
|
|
=pod |
|
|
|
=item * B<author_res_msg($filename, $message)>: Sends message $message to the owner |
|
of the resource with the URI $filename. |
|
|
|
=cut |
|
|
|
sub author_res_msg { |
sub author_res_msg { |
my ($filename,$message)=@_; |
my ($filename,$message)=@_; |
Line 462 sub author_res_msg {
|
Line 629 sub author_res_msg {
|
return 'no_host'; |
return 'no_host'; |
} |
} |
|
|
# =========================================== Retrieve author resource messages |
|
|
|
sub retrieve_author_res_msg { |
sub retrieve_author_res_msg { |
my $url=shift; |
my $url=shift; |
Line 470 sub retrieve_author_res_msg {
|
Line 637 sub retrieve_author_res_msg {
|
my ($domain,$author)=($url=~/^($match_domain)\/($match_username)\//); |
my ($domain,$author)=($url=~/^($match_domain)\/($match_username)\//); |
my %errormsgs=&Apache::lonnet::dump('nohist_res_msgs',$domain,$author); |
my %errormsgs=&Apache::lonnet::dump('nohist_res_msgs',$domain,$author); |
my $msgs=''; |
my $msgs=''; |
foreach (keys %errormsgs) { |
foreach my $msg (keys(%errormsgs)) { |
if ($_=~/^\Q$url\E\_\d+$/) { |
if ($msg =~ /^\Q$url\E\_\d+$/) { |
my %content=&unpackagemsg($errormsgs{$_}); |
my %content=&unpackagemsg($errormsgs{$msg}); |
$msgs.='<p><img src="/adm/lonMisc/bomb.gif" /><b>'. |
$msgs.='<p><img src="/adm/lonMisc/bomb.gif" /><b>'. |
$content{'time'}.'</b>: '.$content{'message'}. |
$content{'time'}.'</b>: '.$content{'message'}. |
'<br /></p>'; |
'<br /></p>'; |
Line 482 sub retrieve_author_res_msg {
|
Line 649 sub retrieve_author_res_msg {
|
} |
} |
|
|
|
|
# =============================== Delete all author messages related to one URL |
|
|
|
|
|
sub del_url_author_res_msg { |
sub del_url_author_res_msg { |
my $url=shift; |
my $url=shift; |
$url=&Apache::lonnet::declutter($url); |
$url=&Apache::lonnet::declutter($url); |
my ($domain,$author)=($url=~/^($match_domain)\/($match_username)\//); |
my ($domain,$author)=($url=~/^($match_domain)\/($match_username)\//); |
my @delmsgs=(); |
my @delmsgs=(); |
foreach (&Apache::lonnet::getkeys('nohist_res_msgs',$domain,$author)) { |
foreach my $msg (&Apache::lonnet::getkeys('nohist_res_msgs',$domain,$author)) { |
if ($_=~/^\Q$url\E\_\d+$/) { |
if ($msg =~ /^\Q$url\E\_\d+$/) { |
push (@delmsgs,$_); |
push (@delmsgs,$msg); |
} |
} |
} |
} |
return &Apache::lonnet::del('nohist_res_msgs',\@delmsgs,$domain,$author); |
return &Apache::lonnet::del('nohist_res_msgs',\@delmsgs,$domain,$author); |
} |
} |
# =================================== Clear out all author messages in URL path |
|
|
|
sub clear_author_res_msg { |
sub clear_author_res_msg { |
my $url=shift; |
my $url=shift; |
$url=&Apache::lonnet::declutter($url); |
$url=&Apache::lonnet::declutter($url); |
my ($domain,$author)=($url=~/^($match_domain)\/($match_username)\//); |
my ($domain,$author)=($url=~/^($match_domain)\/($match_username)\//); |
my @delmsgs=(); |
my @delmsgs=(); |
foreach (&Apache::lonnet::getkeys('nohist_res_msgs',$domain,$author)) { |
foreach my $msg (&Apache::lonnet::getkeys('nohist_res_msgs',$domain,$author)) { |
if ($_=~/^\Q$url\E/) { |
if ($msg =~ /^\Q$url\E/) { |
push (@delmsgs,$_); |
push (@delmsgs,$msg); |
} |
} |
} |
} |
return &Apache::lonnet::del('nohist_res_msgs',\@delmsgs,$domain,$author); |
return &Apache::lonnet::del('nohist_res_msgs',\@delmsgs,$domain,$author); |
} |
} |
# ================= Return hash with URLs for which there is a resource message |
|
|
|
|
|
sub all_url_author_res_msg { |
sub all_url_author_res_msg { |
my ($author,$domain)=@_; |
my ($author,$domain)=@_; |
my %returnhash=(); |
my %returnhash=(); |
foreach (&Apache::lonnet::getkeys('nohist_res_msgs',$domain,$author)) { |
foreach my $msg (&Apache::lonnet::getkeys('nohist_res_msgs',$domain,$author)) { |
$_=~/^(.+)\_\d+/; |
$msg =~ /^(.+)\_\d+/; |
$returnhash{$1}=1; |
$returnhash{$1}=1; |
} |
} |
return %returnhash; |
return %returnhash; |
} |
} |
|
|
# ====================================== Add a comment to the User Notes screen |
|
|
|
sub store_instructor_comment { |
sub store_instructor_comment { |
my ($msg,$uname,$udom) = @_; |
my ($msg,$uname,$udom) = @_; |
Line 537 sub store_instructor_comment {
|
Line 705 sub store_instructor_comment {
|
return $result; |
return $result; |
} |
} |
|
|
# ================================================== Critical message to a user |
|
|
|
sub user_crit_msg_raw { |
sub user_crit_msg_raw { |
my ($user,$domain,$subject,$message,$sendback,$toperm,$sentmessage, |
my ($user,$domain,$subject,$message,$sendback,$toperm,$sentmessage, |
$nosentstore,$recipid,$attachmenturl)=@_; |
$nosentstore,$recipid,$attachmenturl,$permresults)=@_; |
# Check if allowed missing |
# Check if allowed missing |
my ($status,$packed_message); |
my ($status,$packed_message); |
my $msgid='undefined'; |
my $msgid='undefined'; |
Line 572 sub user_crit_msg_raw {
|
Line 739 sub user_crit_msg_raw {
|
|
|
# Notifications |
# Notifications |
my %userenv = &Apache::loncommon::getemails($user,$domain); |
my %userenv = &Apache::loncommon::getemails($user,$domain); |
if ($userenv{'critnotification'}) { |
my $critnotify = $userenv{'critnotification'}; |
&sendnotification($userenv{'critnotification'},$user,$domain,$subject,1, |
my $permemail = $userenv{'permanentemail'}; |
$text,$msgid); |
my $numcrit = 0; |
} |
my $numperm = 0; |
if ($toperm && $userenv{'permanentemail'}) { |
my $permlogmsgstatus; |
&sendnotification($userenv{'permanentemail'},$user,$domain,$subject,1, |
if ($critnotify) { |
$text,$msgid); |
$numcrit = &sendnotification($critnotify,$user,$domain,$subject,1,$text,$msgid,$attachmenturl); |
|
} |
|
if ($toperm && $permemail) { |
|
if ($critnotify && $numcrit) { |
|
if (grep(/^\Q$permemail\E/,split(/,/,$critnotify))) { |
|
$numperm = 1; |
|
} |
|
} |
|
unless ($numperm) { |
|
$numperm = &sendnotification($permemail,$user,$domain,$subject,1,$text,$msgid,$attachmenturl); |
|
} |
|
} |
|
if ($toperm) { |
|
$permlogmsgstatus = '. Perm. email log status '. |
|
&Apache::lonnet::log($env{'user.domain'},$env{'user.name'},$env{'user.home'}, |
|
"Perm. e-mail count $numperm for $user at $domain"); |
|
if (ref($permresults) eq 'HASH') { |
|
$permresults->{"$user:$domain"} = $numperm; |
|
} |
} |
} |
# Log this |
# Log this |
&Apache::lonnet::logthis( |
&Apache::lonnet::logthis( |
'Sending critical email '.$msgid. |
'Sending critical '.$msgid. |
', log status: '. |
', log status: '. |
&Apache::lonnet::log($env{'user.domain'},$env{'user.name'}, |
&Apache::lonnet::log($env{'user.domain'},$env{'user.name'}, |
$env{'user.home'}, |
$env{'user.home'}, |
'Sending critical '.$msgid.' to '.$user.' at '.$domain.' with status: ' |
'Sending critical '.$msgid.' to '.$user.' at '.$domain.' with status ' |
.$status)); |
.$status).$permlogmsgstatus); |
return $status; |
return $status; |
} |
} |
|
|
# New routine that respects "forward" and calls old routine |
|
|
|
=pod |
|
|
|
=item * B<user_crit_msg($user, $domain, $subject, $message, $sendback, $nosentstore,$recipid,$attachmenturl)>: |
|
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. |
|
|
|
Additionally it will check if the user has a Forwarding address |
|
set, and send the message to that address instead |
|
|
|
returns |
|
- in array context a list of results for each message that was sent |
|
- in scalar context a space seperated list of results for each |
|
message sent |
|
|
|
=cut |
|
|
|
sub user_crit_msg { |
sub user_crit_msg { |
my ($user,$domain,$subject,$message,$sendback,$toperm,$sentmessage, |
my ($user,$domain,$subject,$message,$sendback,$toperm,$sentmessage, |
$nosentstore,$recipid,$attachmenturl)=@_; |
$nosentstore,$recipid,$attachmenturl,$permresults)=@_; |
my @status; |
my @status; |
my %userenv = &Apache::lonnet::get('environment',['msgforward'], |
my %userenv = &Apache::lonnet::get('environment',['msgforward'], |
$domain,$user); |
$domain,$user); |
Line 623 sub user_crit_msg {
|
Line 791 sub user_crit_msg {
|
push(@status, |
push(@status, |
&user_crit_msg_raw($forwuser,$forwdomain,$subject,$message, |
&user_crit_msg_raw($forwuser,$forwdomain,$subject,$message, |
$sendback,$toperm,$sentmessage,$nosentstore, |
$sendback,$toperm,$sentmessage,$nosentstore, |
$recipid,$attachmenturl)); |
$recipid,$attachmenturl,$permresults)); |
} |
} |
} else { |
} else { |
push(@status, |
push(@status, |
&user_crit_msg_raw($user,$domain,$subject,$message,$sendback, |
&user_crit_msg_raw($user,$domain,$subject,$message,$sendback, |
$toperm,$sentmessage,$nosentstore,$recipid, |
$toperm,$sentmessage,$nosentstore,$recipid, |
$attachmenturl)); |
$attachmenturl,$permresults)); |
} |
} |
if (wantarray) { |
if (wantarray) { |
return @status; |
return @status; |
Line 637 sub user_crit_msg {
|
Line 805 sub user_crit_msg {
|
return join(' ',@status); |
return join(' ',@status); |
} |
} |
|
|
# =================================================== Critical message received |
|
|
|
sub user_crit_received { |
sub user_crit_received { |
my $msgid=shift; |
my $msgid=shift; |
Line 673 sub user_crit_received {
|
Line 840 sub user_crit_received {
|
return $status; |
return $status; |
} |
} |
|
|
# ======================================================== Normal communication |
|
|
|
|
|
sub user_normal_msg_raw { |
sub user_normal_msg_raw { |
my ($user,$domain,$subject,$message,$citation,$baseurl,$attachmenturl, |
my ($user,$domain,$subject,$message,$citation,$baseurl,$attachmenturl, |
$toperm,$currid,$newid,$sentmessage,$crsmsgid,$symb,$restitle, |
$toperm,$currid,$newid,$sentmessage,$crsmsgid,$symb,$restitle, |
$error,$nosentstore,$recipid)=@_; |
$error,$nosentstore,$recipid,$permresults)=@_; |
# Check if allowed missing |
# Check if allowed missing |
my ($status,$packed_message); |
my ($status,$packed_message); |
my $msgid='undefined'; |
my $msgid='undefined'; |
Line 715 sub user_normal_msg_raw {
|
Line 883 sub user_normal_msg_raw {
|
} |
} |
# Notifications |
# Notifications |
my %userenv = &Apache::loncommon::getemails($user,$domain); |
my %userenv = &Apache::loncommon::getemails($user,$domain); |
if ($userenv{'notification'}) { |
my $notify = $userenv{'notification'}; |
&sendnotification($userenv{'notification'},$user,$domain,$subject,0, |
my $permemail = $userenv{'permanentemail'}; |
$text,$msgid); |
my $numnotify = 0; |
|
my $numperm = 0; |
|
my $permlogmsgstatus; |
|
if ($notify) { |
|
$numnotify = &sendnotification($notify,$user,$domain,$subject,0,$text,$msgid,$attachmenturl); |
|
} |
|
if ($toperm && $permemail) { |
|
if ($notify && $numnotify) { |
|
if (grep(/^\Q$permemail\E/,split(/,/,$notify))) { |
|
$numperm = 1; |
|
} |
|
} |
|
unless ($numperm) { |
|
$numperm = &sendnotification($permemail,$user,$domain,$subject,0, |
|
$text,$msgid,$attachmenturl); |
|
} |
} |
} |
if ($toperm && $userenv{'permanentemail'}) { |
if ($toperm) { |
if ((!$userenv{'notification'}) || ($userenv{'notification'} ne $userenv{'permanentemail'})) { |
$permlogmsgstatus = '. Perm. email log status '. |
&sendnotification($userenv{'permanentemail'},$user,$domain,$subject,0, |
&Apache::lonnet::log($env{'user.domain'},$env{'user.name'},$env{'user.home'}, |
$text,$msgid); |
"Perm. e-mail count $numperm for $user at $domain"); |
|
if (ref($permresults) eq 'HASH') { |
|
$permresults->{"$user:$domain"} = $numperm; |
} |
} |
} |
} |
&Apache::lonnet::log($env{'user.domain'},$env{'user.name'}, |
&Apache::lonnet::log($env{'user.domain'},$env{'user.name'}, |
$env{'user.home'}, |
$env{'user.home'}, |
'Sending '.$msgid.' to '.$user.' at '.$domain.' with status: '.$status); |
'Sending '.$msgid.' to '.$user.' at '.$domain.' with status '.$status. |
|
$permlogmsgstatus); |
} else { |
} else { |
$status='no_host'; |
$status='no_host'; |
} |
} |
return $status; |
return $status; |
} |
} |
|
|
# New routine that respects "forward" and calls old routine |
|
|
|
=pod |
|
|
|
=item * B<user_normal_msg($user, $domain, $subject, $message, $citation, |
|
$baseurl, $attachmenturl, $toperm, $sentmessage, $symb, $restitle, |
|
$error,$nosentstore,$recipid)>: |
|
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 |
|
set, and send the message to that address instead |
|
|
|
returns |
|
- in array context a list of results for each message that was sent |
|
- in scalar context a space seperated list of results for each |
|
message sent |
|
|
|
=cut |
|
|
|
sub user_normal_msg { |
sub user_normal_msg { |
my ($user,$domain,$subject,$message,$citation,$baseurl,$attachmenturl, |
my ($user,$domain,$subject,$message,$citation,$baseurl,$attachmenturl, |
$toperm,$sentmessage,$symb,$restitle,$error,$nosentstore,$recipid)=@_; |
$toperm,$sentmessage,$symb,$restitle,$error,$nosentstore,$recipid, |
|
$permresults)=@_; |
my @status; |
my @status; |
my %userenv = &Apache::lonnet::get('environment',['msgforward'], |
my %userenv = &Apache::lonnet::get('environment',['msgforward'], |
$domain,$user); |
$domain,$user); |
my $msgforward=$userenv{'msgforward'}; |
my $msgforward=$userenv{'msgforward'}; |
if ($msgforward) { |
if ($msgforward) { |
foreach (split(/\,/,$msgforward)) { |
foreach my $fwd (split(/\,/,$msgforward)) { |
my ($forwuser,$forwdomain)=split(/\:/,$_); |
my ($forwuser,$forwdomain)=split(/\:/,$fwd); |
push(@status, |
push(@status, |
&user_normal_msg_raw($forwuser,$forwdomain,$subject,$message, |
&user_normal_msg_raw($forwuser,$forwdomain,$subject,$message, |
$citation,$baseurl,$attachmenturl,$toperm, |
$citation,$baseurl,$attachmenturl,$toperm, |
undef,undef,$sentmessage,undef,$symb, |
undef,undef,$sentmessage,undef,$symb, |
$restitle,$error,$nosentstore,$recipid)); |
$restitle,$error,$nosentstore,$recipid,$permresults)); |
} |
} |
} else { |
} else { |
push(@status,&user_normal_msg_raw($user,$domain,$subject,$message, |
push(@status,&user_normal_msg_raw($user,$domain,$subject,$message, |
$citation,$baseurl,$attachmenturl,$toperm, |
$citation,$baseurl,$attachmenturl,$toperm, |
undef,undef,$sentmessage,undef,$symb, |
undef,undef,$sentmessage,undef,$symb, |
$restitle,$error,$nosentstore,$recipid)); |
$restitle,$error,$nosentstore,$recipid,$permresults)); |
} |
} |
if (wantarray) { |
if (wantarray) { |
return @status; |
return @status; |
Line 782 sub user_normal_msg {
|
Line 950 sub user_normal_msg {
|
} |
} |
|
|
sub process_sent_mail { |
sub process_sent_mail { |
my ($msgsubj,$subj_prefix,$numsent,$stamp,$msgname,$msgdom,$msgcount,$context,$pid,$savemsg,$recusers,$recudoms,$baseurl,$attachmenturl,$symb,$error,$senderuname,$senderdom,$recipid) = @_; |
my ($msgsubj,$subj_prefix,$numsent,$stamp,$msgname,$msgdom,$msgcount, |
|
$context,$pid,$savemsg,$recusers,$recudoms,$baseurl,$attachmenturl, |
|
$symb,$error,$senderuname,$senderdom,$recipid) = @_; |
my $sentsubj; |
my $sentsubj; |
if ($numsent > 1) { |
if ($numsent > 1) { |
$sentsubj = $subj_prefix.' ('.$numsent.' sent) '.$msgsubj; |
$sentsubj = $subj_prefix.' ('.$numsent.' sent) '.$msgsubj; |
Line 836 sub store_recipients {
|
Line 1006 sub store_recipients {
|
} |
} |
} |
} |
|
|
# =============================================================== Folder suffix |
|
|
|
sub foldersuffix { |
sub foldersuffix { |
my $folder=shift; |
my $folder=shift; |
Line 851 sub foldersuffix {
|
Line 1020 sub foldersuffix {
|
return $suffix; |
return $suffix; |
} |
} |
|
|
# ========================================================= User-defined folders |
|
|
|
sub get_user_folders { |
sub get_user_folders { |
my ($folder) = @_; |
my ($folder) = @_; |
Line 872 sub secapply {
|
Line 1040 sub secapply {
|
my $rec=shift; |
my $rec=shift; |
my $defaultflag=shift; |
my $defaultflag=shift; |
$rec=~s/\s+//g; |
$rec=~s/\s+//g; |
$rec=~s/\@/\:/g; |
unless ($rec =~ /\:/) { |
|
$rec=~s/\@/\:/g; |
|
} |
my ($adr,$sections_or_groups)=($rec=~/^([^\(]+)\(([^\)]+)\)/); |
my ($adr,$sections_or_groups)=($rec=~/^([^\(]+)\(([^\)]+)\)/); |
if ($sections_or_groups) { |
if ($sections_or_groups) { |
foreach my $item (split(/\;/,$sections_or_groups)) { |
foreach my $item (split(/\;/,$sections_or_groups)) { |
Line 892 sub secapply {
|
Line 1062 sub secapply {
|
return ''; |
return ''; |
} |
} |
|
|
=pod |
|
|
|
=item * B<decide_receiver($feedurl,$author,$question,$course,$policy,$defaultflag)>: |
|
|
|
Arguments |
|
$feedurl - /res/ url of resource (only need if $author is true) |
|
$author,$question,$course,$policy - all true/false parameters |
|
if true will attempt to find the addresses of user that should receive |
|
this type of feedback (author - feedback to author of resource $feedurl, |
|
$question 'Resource Content Questions', $course 'Course Content Question', |
|
$policy 'Course Policy') |
|
(Additionally it also checks $env for whether the corresponding form.<name> |
|
element exists, for ease of use in a html response context) |
|
|
|
$defaultflag - (internal should be left blank) if true gather addresses |
|
that aren't for a section even if I have a section |
|
(used for reccursion internally, first we look for |
|
addresses for our specific section then we recurse |
|
and look for non section addresses) |
|
|
|
Returns |
|
$typestyle - string of html text, describing what addresses were found |
|
%to - a hash, which keys are addresses of users to send messages to |
|
the keys will look like name:domain |
|
|
|
=cut |
|
|
|
sub decide_receiver { |
sub decide_receiver { |
my ($feedurl,$author,$question,$course,$policy,$defaultflag) = @_; |
my ($feedurl,$author,$question,$course,$policy,$defaultflag) = @_; |
&Apache::lonenc::check_decrypt(\$feedurl); |
&Apache::lonenc::check_decrypt(\$feedurl); |
Line 958 sub decide_receiver {
|
Line 1101 sub decide_receiver {
|
return ($typestyle,%to); |
return ($typestyle,%to); |
} |
} |
|
|
sub user_lang { |
|
my ($touname,$toudom,$fromcid) = @_; |
|
my @userlangs; |
|
if (($fromcid ne '') && ($env{'course.'.$fromcid.'.languages'} ne '')) { |
|
@userlangs=(@userlangs,split(/\s*(\,|\;|\:)\s*/, |
|
$env{'course.'.$fromcid.'.languages'})); |
|
} else { |
|
my %langhash = &Apache::loncommon::getlangs($toudom,$touname); |
|
if ($langhash{'languages'} ne '') { |
|
@userlangs = split(/\s*(\,|\;|\:)\s*/,$langhash{'languages'}); |
|
} else { |
|
my %domdefs = &Apache::lonnet::get_domain_defaults($toudom); |
|
if ($domdefs{'lang_def'} ne '') { |
|
@userlangs = ($domdefs{'lang_def'}); |
|
} |
|
} |
|
} |
|
my @languages=&Apache::lonlocal::get_genlanguages(@userlangs); |
|
my $user_lh = Apache::localize->get_handle(@languages); |
|
return $user_lh; |
|
} |
|
|
|
=pod |
|
|
|
=back |
|
|
|
=cut |
|
|
|
1; |
1; |
__END__ |
__END__ |
|
|