Diff for /loncom/interface/lonmsg.pm between versions 1.195 and 1.203

version 1.195, 2006/12/28 19:43:24 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 256  sub sendnotification { Line 295  sub sendnotification {
     $text=~s/\&gt\;/\>/gs;      $text=~s/\&gt\;/\>/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 ($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);
Line 399  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 413  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 422  sub user_crit_msg_raw { Line 467  sub user_crit_msg_raw {
         if (defined($sentmessage)) {          if (defined($sentmessage)) {
             $$sentmessage = $packed_message;              $$sentmessage = $packed_message;
         }          }
         if ($env{'request.course.id'} eq '') {          if (!$nosentstore) {
             (undef,my $packed_message_no_citation) =              (undef,my $packed_message_no_citation) =
             &packagemsg($subject,$message,undef,undef,undef,$user,$domain,              &packagemsg($subject,$message,undef,undef,undef,$user,$domain,
                         $msgid);                          $msgid);
Line 459  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 474  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 484  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 528  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 539  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 549  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);
Line 563  sub user_normal_msg_raw { Line 606  sub user_normal_msg_raw {
                &store_sent_mail($msgid,$packed_message_no_citation);                 &store_sent_mail($msgid,$packed_message_no_citation);
            }             }
        }         }
     } else {         if (ref($newid) eq 'SCALAR') {
        $status='no_host';     $$newid = $msgid;
     }         }
     if (defined($newid)) {         if (ref($sentmessage) eq 'SCALAR') {
         $$newid = $msgid;     $$sentmessage = $packed_message;
     }         }
     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,$msgid);       $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,$msgid);       $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 596  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 666  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__
   

Removed from v.1.195  
changed lines
  Added in v.1.203


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>