version 1.191, 2006/12/24 22:13:19
|
version 1.203, 2007/05/02 20:26:08
|
Line 28
|
Line 28
|
|
|
package Apache::lonmsg; |
package Apache::lonmsg; |
|
|
|
=pod |
|
|
|
=head1 NAME |
|
|
|
Apache::lonmsg: supports internal messaging |
|
|
|
=head1 SYNOPSIS |
|
|
|
lonmsg provides routines for sending messages. |
|
|
|
Right now, this document will cover just how to send a message, since |
|
it is likely you will not need to programmatically read messages, |
|
since lonmsg already implements that functionality. |
|
|
|
The routines used to package messages and unpackage messages are not |
|
only used by lonmsg when creating/extracting messages for LON-CAPA's |
|
internal messaging system, but also by lonnotify.pm which is available |
|
for use by Domain Coordinators to broadcast standard e-mail to specified |
|
users in their domain. The XML packaging used in the two cases is very |
|
similar. The differences are the use of <recuser>$uname</recuser> and |
|
<recdomain>$udom</recdomain> in stored internal messages, compared |
|
with <recipient username="$uname:$udom">$email</recipient> in stored |
|
Domain Coordinator e-mail for the storage of information about |
|
recipients of the message/e-mail. |
|
|
|
=head1 FUNCTIONS |
|
|
|
=over 4 |
|
|
|
=cut |
|
|
use strict; |
use strict; |
use Apache::lonnet; |
use Apache::lonnet; |
use HTML::TokeParser(); |
use HTML::TokeParser(); |
Line 47 use LONCAPA qw(:DEFAULT :match);
|
Line 78 use LONCAPA qw(:DEFAULT :match);
|
|
|
sub packagemsg { |
sub packagemsg { |
my ($subject,$message,$citation,$baseurl,$attachmenturl, |
my ($subject,$message,$citation,$baseurl,$attachmenturl, |
$recuser,$recdomain,$msgid,$type,$crsmsgid,$symb,$error)=@_; |
$recuser,$recdomain,$msgid,$type,$crsmsgid,$symb,$error,$recipid)=@_; |
$message =&HTML::Entities::encode($message,'<>&"'); |
$message =&HTML::Entities::encode($message,'<>&"'); |
$citation=&HTML::Entities::encode($citation,'<>&"'); |
$citation=&HTML::Entities::encode($citation,'<>&"'); |
$subject =&HTML::Entities::encode($subject,'<>&"'); |
$subject =&HTML::Entities::encode($subject,'<>&"'); |
Line 57 sub packagemsg {
|
Line 88 sub packagemsg {
|
#remove machine specification |
#remove machine specification |
$attachmenturl =~ s|^http://[^/]+/|/|; |
$attachmenturl =~ s|^http://[^/]+/|/|; |
$attachmenturl =&HTML::Entities::encode($attachmenturl,'<>&"'); |
$attachmenturl =&HTML::Entities::encode($attachmenturl,'<>&"'); |
my $course_context; |
my $course_context = &get_course_context(); |
if (defined($env{'form.replyid'})) { |
|
my ($sendtime,$shortsubj,$fromname,$fromdomain,$count,$origcid)= |
|
split(/\:/,&unescape($env{'form.replyid'})); |
|
$course_context = $origcid; |
|
} |
|
foreach my $key (keys(%env)) { |
|
if ($key=~/^form\.(rep)?rec\_(.*)$/) { |
|
my ($sendtime,$shortsubj,$fromname,$fromdomain,$count,$origcid) = |
|
split(/\:/,&unescape($2)); |
|
$course_context = $origcid; |
|
last; |
|
} |
|
} |
|
unless(defined($course_context)) { |
|
$course_context = $env{'request.course.id'}; |
|
} |
|
my $now=time; |
my $now=time; |
my $msgcount = &get_uniq(); |
my $msgcount = &get_uniq(); |
unless(defined($msgid)) { |
unless(defined($msgid)) { |
Line 136 sub packagemsg {
|
Line 151 sub packagemsg {
|
} |
} |
if (defined($symb)) { |
if (defined($symb)) { |
$result.= '<symb>'.$symb.'</symb>'; |
$result.= '<symb>'.$symb.'</symb>'; |
if (defined($course_context)) { |
if ($course_context ne '') { |
if ($course_context eq $env{'request.course.id'}) { |
if ($course_context eq $env{'request.course.id'}) { |
my $resource_title = &Apache::lonnet::gettitle($symb); |
my $resource_title = &Apache::lonnet::gettitle($symb); |
if (defined($resource_title)) { |
if (defined($resource_title)) { |
Line 145 sub packagemsg {
|
Line 160 sub packagemsg {
|
} |
} |
} |
} |
} |
} |
|
if (defined($recipid)) { |
|
$result.= '<recipid>'.$recipid.'</recipid>'; |
|
} |
return ($msgid,$result); |
return ($msgid,$result); |
} |
} |
|
|
|
sub get_course_context { |
|
my $course_context; |
|
if (defined($env{'form.replyid'})) { |
|
my ($sendtime,$shortsubj,$fromname,$fromdomain,$count,$origcid)= |
|
split(/\:/,&unescape($env{'form.replyid'})); |
|
$course_context = $origcid; |
|
} |
|
foreach my $key (keys(%env)) { |
|
if ($key=~/^form\.(rep)?rec\_(.*)$/) { |
|
my ($sendtime,$shortsubj,$fromname,$fromdomain,$count,$origcid) = |
|
split(/\:/,&unescape($2)); |
|
$course_context = $origcid; |
|
last; |
|
} |
|
} |
|
if ($course_context eq '') { |
|
$course_context = $env{'request.course.id'}; |
|
} |
|
return $course_context; |
|
} |
|
|
# ================================================== Unpack message into a hash |
# ================================================== Unpack message into a hash |
|
|
sub unpackagemsg { |
sub unpackagemsg { |
Line 191 sub unpackagemsg {
|
Line 230 sub unpackagemsg {
|
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) = @_; |
$subject=&escape($subject); |
$subject=&escape($subject); |
|
$symb = &escape($symb); |
return(&escape($now.':'.$subject.':'.$uname.':'. |
return(&escape($now.':'.$subject.':'.$uname.':'. |
$udom.':'.$msgcount.':'.$course_context.':'.$pid.':'.$symb.':'.$error)); |
$udom.':'.$msgcount.':'.$course_context.':'.$pid.':'.$symb.':'.$error)); |
} |
} |
Line 202 sub unpackmsgid {
|
Line 242 sub unpackmsgid {
|
$processid,$symb,$error) = split(/\:/,&unescape($msgid)); |
$processid,$symb,$error) = split(/\:/,&unescape($msgid)); |
$shortsubj = &unescape($shortsubj); |
$shortsubj = &unescape($shortsubj); |
$shortsubj = &HTML::Entities::decode($shortsubj); |
$shortsubj = &HTML::Entities::decode($shortsubj); |
|
$symb = &unescape($symb); |
if (!defined($processid)) { $fromcid = ''; } |
if (!defined($processid)) { $fromcid = ''; } |
my %status=(); |
my %status=(); |
unless ($skipstatus) { |
unless ($skipstatus) { |
Line 244 sub sendemail {
|
Line 285 sub sendemail {
|
# ==================================================== Send notification emails |
# ==================================================== Send notification emails |
|
|
sub sendnotification { |
sub sendnotification { |
my ($to,$touname,$toudom,$subj,$crit,$text)=@_; |
my ($to,$touname,$toudom,$subj,$crit,$text,$msgid)=@_; |
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'}; |
Line 254 sub sendnotification {
|
Line 295 sub sendnotification {
|
$text=~s/\>\;/\>/gs; |
$text=~s/\>\;/\>/gs; |
$text=~s/\<\/*[^\>]+\>//gs; |
$text=~s/\<\/*[^\>]+\>//gs; |
my $url='http://'. |
my $url='http://'. |
$Apache::lonnet::hostname{&Apache::lonnet::homeserver($touname,$toudom)}. |
&Apache::lonnet::hostname(&Apache::lonnet::homeserver($touname,$toudom)). |
'/adm/email?username='.$touname.'&domain='.$toudom; |
'/adm/email?username='.$touname.'&domain='.$toudom; |
my $body=(<<ENDMSG); |
my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$fromcid, |
You received a$critical message from $sender in LON-CAPA. The subject is |
$symb,$error) = &Apache::lonmsg::unpackmsgid($msgid); |
|
my $coursetext; |
|
if ($fromcid ne '') { |
|
$coursetext = "\n".&mt('Course').': '; |
|
if ($env{'course.'.$fromcid.'.description'} ne '') { |
|
$coursetext .= $env{'course.'.$fromcid.'.description'}; |
|
} else { |
|
my %coursehash = &Apache::lonnet::coursedescription($fromcid,); |
|
if ($coursehash{'description'} ne '') { |
|
$coursetext .= $coursehash{'description'}; |
|
} |
|
} |
|
$coursetext .= "\n\n"; |
|
} |
|
my $body = $coursetext. |
|
&mt('You received a'.$critical.' message from [_1] in LON-CAPA.',$sender).' '.&mt('The subject is |
|
|
$subj |
[_1] |
|
|
=== Excerpt ============================================================ |
',$subj)."\n". |
|
'=== '.&mt('Excerpt')." ============================================================ |
$text |
$text |
======================================================================== |
======================================================================== |
|
|
Use |
".&mt('Use |
|
|
$url |
[_1] |
|
|
to access the full message. |
to access the full message.',$url); |
ENDMSG |
|
&sendemail($to,'New'.$critical.' message from '.$sender,$body); |
&sendemail($to,'New'.$critical.' message from '.$sender,$body); |
} |
} |
# ============================================================= Check for email |
# ============================================================= Check for email |
Line 382 sub store_instructor_comment {
|
Line 438 sub store_instructor_comment {
|
my $cdom = $env{'course.'.$cid.'.domain'}; |
my $cdom = $env{'course.'.$cid.'.domain'}; |
my $subject= &mt('Record').' ['.$uname.':'.$udom.']'; |
my $subject= &mt('Record').' ['.$uname.':'.$udom.']'; |
my $result = &user_normal_msg_raw($cnum,$cdom,$subject,$msg); |
my $result = &user_normal_msg_raw($cnum,$cdom,$subject,$msg); |
|
if ($result eq 'ok' || $result eq 'con_delayed') { |
|
|
|
} |
return $result; |
return $result; |
} |
} |
|
|
# ================================================== Critical message to a user |
# ================================================== 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)=@_; |
# Check if allowed missing |
# Check if allowed missing |
my ($status,$packed_message); |
my ($status,$packed_message); |
my $msgid='undefined'; |
my $msgid='undefined'; |
Line 396 sub user_crit_msg_raw {
|
Line 456 sub user_crit_msg_raw {
|
my $text=$message; |
my $text=$message; |
my $homeserver=&Apache::lonnet::homeserver($user,$domain); |
my $homeserver=&Apache::lonnet::homeserver($user,$domain); |
if ($homeserver ne 'no_host') { |
if ($homeserver ne 'no_host') { |
($msgid,$packed_message)=&packagemsg($subject,$message); |
($msgid,$packed_message)=&packagemsg($subject,$message,undef,undef, |
|
undef,undef,undef,undef,undef,undef,undef, |
|
undef,$recipid); |
if ($sendback) { $packed_message.='<sendback>true</sendback>'; } |
if ($sendback) { $packed_message.='<sendback>true</sendback>'; } |
$status=&Apache::lonnet::critical( |
$status=&Apache::lonnet::critical( |
'put:'.$domain.':'.$user.':critical:'. |
'put:'.$domain.':'.$user.':critical:'. |
Line 405 sub user_crit_msg_raw {
|
Line 467 sub user_crit_msg_raw {
|
if (defined($sentmessage)) { |
if (defined($sentmessage)) { |
$$sentmessage = $packed_message; |
$$sentmessage = $packed_message; |
} |
} |
(undef,my $packed_message_no_citation) = |
if (!$nosentstore) { |
|
(undef,my $packed_message_no_citation) = |
&packagemsg($subject,$message,undef,undef,undef,$user,$domain, |
&packagemsg($subject,$message,undef,undef,undef,$user,$domain, |
$msgid); |
$msgid); |
$status .= &store_sent_mail($msgid,$packed_message_no_citation); |
if ($status eq 'ok' || $status eq 'con_delayed') { |
|
&store_sent_mail($msgid,$packed_message_no_citation); |
|
} |
|
} |
} else { |
} else { |
$status='no_host'; |
$status='no_host'; |
} |
} |
Line 417 sub user_crit_msg_raw {
|
Line 483 sub user_crit_msg_raw {
|
my %userenv = &Apache::loncommon::getemails($user,$domain); |
my %userenv = &Apache::loncommon::getemails($user,$domain); |
if ($userenv{'critnotification'}) { |
if ($userenv{'critnotification'}) { |
&sendnotification($userenv{'critnotification'},$user,$domain,$subject,1, |
&sendnotification($userenv{'critnotification'},$user,$domain,$subject,1, |
$text); |
$text,$msgid); |
} |
} |
if ($toperm && $userenv{'permanentemail'}) { |
if ($toperm && $userenv{'permanentemail'}) { |
&sendnotification($userenv{'permanentemail'},$user,$domain,$subject,1, |
&sendnotification($userenv{'permanentemail'},$user,$domain,$subject,1, |
$text); |
$text,$msgid); |
} |
} |
# Log this |
# Log this |
&Apache::lonnet::logthis( |
&Apache::lonnet::logthis( |
Line 438 sub user_crit_msg_raw {
|
Line 504 sub user_crit_msg_raw {
|
|
|
=pod |
=pod |
|
|
=item * B<user_crit_msg($user, $domain, $subject, $message, $sendback)>: Sends |
=item * B<user_crit_msg($user, $domain, $subject, $message, $sendback, $nosentstore,$recipid)>: |
a critical message $message to the $user at $domain. If $sendback is true, |
Sends a critical message $message to the $user at $domain. If $sendback |
a reciept will be sent to the current user when $user recieves the message. |
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 |
Additionally it will check if the user has a Forwarding address |
set, and send the message to that address instead |
set, and send the message to that address instead |
Line 453 sub user_crit_msg_raw {
|
Line 520 sub user_crit_msg_raw {
|
=cut |
=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)=@_; |
my @status; |
my @status; |
my %userenv = &Apache::lonnet::get('environment',['msgforward'], |
my %userenv = &Apache::lonnet::get('environment',['msgforward'], |
$domain,$user); |
$domain,$user); |
Line 463 sub user_crit_msg {
|
Line 531 sub user_crit_msg {
|
my ($forwuser,$forwdomain)=split(/\:/,$addr); |
my ($forwuser,$forwdomain)=split(/\:/,$addr); |
push(@status, |
push(@status, |
&user_crit_msg_raw($forwuser,$forwdomain,$subject,$message, |
&user_crit_msg_raw($forwuser,$forwdomain,$subject,$message, |
$sendback,$toperm,$sentmessage)); |
$sendback,$toperm,$sentmessage,$nosentstore, |
|
$recipid)); |
} |
} |
} 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)); |
$toperm,$sentmessage,$nosentstore,$recipid)); |
} |
} |
if (wantarray) { |
if (wantarray) { |
return @status; |
return @status; |
Line 507 sub user_crit_received {
|
Line 576 sub user_crit_received {
|
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)=@_; |
$error,$nosentstore,$recipid)=@_; |
# Check if allowed missing |
# Check if allowed missing |
my ($status,$packed_message); |
my ($status,$packed_message); |
my $msgid='undefined'; |
my $msgid='undefined'; |
Line 518 sub user_normal_msg_raw {
|
Line 587 sub user_normal_msg_raw {
|
($msgid,$packed_message)= |
($msgid,$packed_message)= |
&packagemsg($subject,$message,$citation,$baseurl, |
&packagemsg($subject,$message,$citation,$baseurl, |
$attachmenturl,$user,$domain,$currid, |
$attachmenturl,$user,$domain,$currid, |
undef,$crsmsgid,$symb,$error); |
undef,$crsmsgid,$symb,$error,$recipid); |
|
|
# Store in user folder |
# Store in user folder |
$status=&Apache::lonnet::critical( |
$status=&Apache::lonnet::critical( |
Line 528 sub user_normal_msg_raw {
|
Line 597 sub user_normal_msg_raw {
|
# Save new message received time |
# Save new message received time |
&Apache::lonnet::put |
&Apache::lonnet::put |
('email_status',{'recnewemail'=>time},$domain,$user); |
('email_status',{'recnewemail'=>time},$domain,$user); |
# Into sent-mail folder unless a broadcast message or critical message |
# Into sent-mail folder if sent mail storage required |
unless (($env{'request.course.id'}) && |
if (!$nosentstore) { |
(($env{'form.sendmode'} eq 'group') || |
|
(($env{'form.critmsg'}) || ($env{'form.sendbck'})) && |
|
(&Apache::lonnet::allowed('srm',$env{'request.course.id'}) |
|
|| &Apache::lonnet::allowed('srm',$env{'request.course.id'}. |
|
'/'.$env{'request.course.sec'})))) { |
|
(undef,my $packed_message_no_citation) = |
(undef,my $packed_message_no_citation) = |
&packagemsg($subject,$message,undef,$baseurl,$attachmenturl, |
&packagemsg($subject,$message,undef,$baseurl,$attachmenturl, |
$user,$domain,$currid,undef,$crsmsgid,$symb,$error); |
$user,$domain,$currid,undef,$crsmsgid,$symb,$error); |
$status .= &store_sent_mail($msgid,$packed_message_no_citation); |
if ($status eq 'ok' || $status eq 'con_delayed') { |
|
&store_sent_mail($msgid,$packed_message_no_citation); |
|
} |
|
} |
|
if (ref($newid) eq 'SCALAR') { |
|
$$newid = $msgid; |
|
} |
|
if (ref($sentmessage) eq 'SCALAR') { |
|
$$sentmessage = $packed_message; |
} |
} |
} else { |
|
$status='no_host'; |
|
} |
|
if (defined($newid)) { |
|
$$newid = $msgid; |
|
} |
|
if (defined($sentmessage)) { |
|
$$sentmessage = $packed_message; |
|
} |
|
|
|
# Notifications |
# Notifications |
my %userenv = &Apache::lonnet::get('environment',['notification', |
my %userenv = &Apache::lonnet::get('environment',['notification', |
'permanentemail'], |
'permanentemail'], |
$domain,$user); |
$domain,$user); |
if ($userenv{'notification'}) { |
if ($userenv{'notification'}) { |
&sendnotification($userenv{'notification'},$user,$domain,$subject,0, |
&sendnotification($userenv{'notification'},$user,$domain,$subject,0, |
$text); |
$text,$msgid); |
} |
} |
if ($toperm && $userenv{'permanentemail'}) { |
if ($toperm && $userenv{'permanentemail'}) { |
&sendnotification($userenv{'permanentemail'},$user,$domain,$subject,0, |
&sendnotification($userenv{'permanentemail'},$user,$domain,$subject,0, |
$text); |
$text,$msgid); |
} |
} |
&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); |
|
} else { |
|
$status='no_host'; |
|
} |
return $status; |
return $status; |
} |
} |
|
|
Line 573 sub user_normal_msg_raw {
|
Line 638 sub user_normal_msg_raw {
|
=pod |
=pod |
|
|
=item * B<user_normal_msg($user, $domain, $subject, $message, $citation, |
=item * B<user_normal_msg($user, $domain, $subject, $message, $citation, |
$baseurl, $attachmenturl, $toperm, $sentmessage, $symb, $restitle, $error)>: |
$baseurl, $attachmenturl, $toperm, $sentmessage, $symb, $restitle, |
|
$error,$nosentstore,$recipid)>: |
Sends a message to the $user at $domain, with subject $subject and message $message. |
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 |
=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)=@_; |
$toperm,$sentmessage,$symb,$restitle,$error,$nosentstore,$recipid)=@_; |
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 (split(/\,/,$msgforward)) { |
my ($forwuser,$forwdomain)=split(/\:/,$_); |
my ($forwuser,$forwdomain)=split(/\:/,$_); |
$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,$restitle,$error).' '; |
undef,undef,$sentmessage,undef,$symb, |
|
$restitle,$error,$nosentstore,$recipid)); |
} |
} |
} else { |
} else { |
$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,$restitle,$error); |
undef,undef,$sentmessage,undef,$symb, |
|
$restitle,$error,$nosentstore,$recipid)); |
|
} |
|
if (wantarray) { |
|
return @status; |
} |
} |
|
return join(' ',@status); |
|
} |
|
|
|
sub process_sent_mail { |
|
my ($msgsubj,$subj_prefix,$numsent,$stamp,$msgname,$msgdom,$msgcount,$context,$pid,$savemsg,$recusers,$recudoms,$baseurl,$attachmenturl,$symb,$error,$senderuname,$senderdom,$senderhome) = @_; |
|
my $sentsubj; |
|
if ($numsent > 1) { |
|
$sentsubj = $subj_prefix.' ('.$numsent.' sent) '.$msgsubj; |
|
} |
|
$sentsubj = &HTML::Entities::encode($sentsubj,'<>&"'); |
|
my $sentmsgid = |
|
&buildmsgid($stamp,$sentsubj,$msgname,$msgdom,$msgcount,$context,$pid); |
|
(undef,my $sentmessage) = |
|
&packagemsg($msgsubj,$savemsg,undef,$baseurl,$attachmenturl,$recusers, |
|
$recudoms,$sentmsgid,undef,undef,$symb,$error); |
|
my $status = &store_sent_mail($sentmsgid,$sentmessage,$senderuname, |
|
$senderdom,$senderhome); |
return $status; |
return $status; |
} |
} |
|
|
sub store_sent_mail { |
sub store_sent_mail { |
my ($msgid,$message) = @_; |
my ($msgid,$message,$senderuname,$senderdom,$senderhome) = @_; |
|
if ($senderuname eq '') { |
|
$senderuname = $env{'user.name'}; |
|
} |
|
if ($senderdom eq '') { |
|
$senderdom = $env{'user.domain'}; |
|
} |
|
if ($senderhome eq '') { |
|
$senderhome = $env{'user.home'}; |
|
} |
my $status =' '.&Apache::lonnet::critical( |
my $status =' '.&Apache::lonnet::critical( |
'put:'.$env{'user.domain'}.':'.$env{'user.name'}. |
'put:'.$senderdom.':'.$senderuname.':nohist_email_sent:'. |
':nohist_email_sent:'. |
&escape($msgid).'='.&escape($message),$senderhome); |
&escape($msgid).'='. |
|
&escape($message),$env{'user.home'}); |
|
return $status; |
return $status; |
} |
} |
|
|
|
sub store_recipients { |
|
my ($subject,$sendername,$senderdom,$reciphash) = @_; |
|
my $context = &get_course_context(); |
|
my $now = time(); |
|
my $msgcount = &get_uniq(); |
|
my $recipid = |
|
&buildmsgid($now,$subject,$sendername,$senderdom,$msgcount,$context,$$); |
|
my %recipinfo = ( |
|
$recipid => $reciphash, |
|
); |
|
my $status = &Apache::lonnet::put('nohist_emailrecip',\%recipinfo, |
|
$senderdom,$sendername); |
|
if ($status eq 'ok') { |
|
return ($recipid,$status); |
|
} else { |
|
return (undef,$status); |
|
} |
|
} |
|
|
# =============================================================== Folder suffix |
# =============================================================== Folder suffix |
|
|
sub foldersuffix { |
sub foldersuffix { |
Line 643 sub get_user_folders {
|
Line 765 sub get_user_folders {
|
return %userfolders; |
return %userfolders; |
} |
} |
|
|
|
sub secapply { |
|
my $rec=shift; |
|
my $defaultflag=shift; |
|
$rec=~s/\s+//g; |
|
$rec=~s/\@/\:/g; |
|
my ($adr,$sections_or_groups)=($rec=~/^([^\(]+)\(([^\)]+)\)/); |
|
if ($sections_or_groups) { |
|
foreach my $item (split(/\;/,$sections_or_groups)) { |
|
if (($item eq $env{'request.course.sec'}) || |
|
($defaultflag && ($item eq '*'))) { |
|
return $adr; |
|
} elsif ($env{'request.course.groups'}) { |
|
my @usersgroups = split(/:/,$env{'request.course.groups'}); |
|
if (grep(/^\Q$item\E$/,@usersgroups)) { |
|
return $adr; |
|
} |
|
} |
|
} |
|
} else { |
|
return $rec; |
|
} |
|
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 { |
|
my ($feedurl,$author,$question,$course,$policy,$defaultflag) = @_; |
|
&Apache::lonenc::check_decrypt(\$feedurl); |
|
my $typestyle=''; |
|
my %to=(); |
|
if ($env{'form.discuss'} eq 'author' ||$author) { |
|
$typestyle.='Submitting as Author Feedback<br />'; |
|
$feedurl=~ m{^/res/($LONCAPA::domain_re)/($LONCAPA::username_re)/}; |
|
$to{$2.':'.$1}=1; |
|
} |
|
my $cid = $env{'request.course.id'}; |
|
if ($env{'form.discuss'} eq 'question' ||$question) { |
|
$typestyle.=&mt('Submitting as Question').'<br />'; |
|
foreach my $item (split(/\,/,$env{'course.'.$cid.'.question.email'})) { |
|
my $rec=&secapply($item,$defaultflag); |
|
if ($rec) { $to{$rec}=1; } |
|
} |
|
} |
|
if ($env{'form.discuss'} eq 'course' ||$course) { |
|
$typestyle.=&mt('Submitting as Comment').'<br />'; |
|
foreach my $item (split(/\,/,$env{'course.'.$cid.'.comment.email'})) { |
|
my $rec=&secapply($item,$defaultflag); |
|
if ($rec) { $to{$rec}=1; } |
|
} |
|
} |
|
if ($env{'form.discuss'} eq 'policy' ||$policy) { |
|
$typestyle.=&mt('Submitting as Policy Feedback').'<br />'; |
|
foreach my $item (split(/\,/,$env{'course.'.$cid.'.policy.email'})) { |
|
my $rec=&secapply($item,$defaultflag); |
|
if ($rec) { $to{$rec}=1; } |
|
} |
|
} |
|
if ((scalar(%to) eq '0') && (!$defaultflag)) { |
|
($typestyle,%to)= |
|
&decide_receiver($feedurl,$author,$question,$course,$policy,1); |
|
} |
|
return ($typestyle,%to); |
|
} |
|
|
|
=pod |
|
|
|
=back |
|
|
|
=cut |
|
|
1; |
1; |
__END__ |
__END__ |
|
|