Diff for /loncom/interface/lonmsg.pm between versions 1.214.2.5 and 1.215

version 1.214.2.5, 2009/01/05 20:08:25 version 1.215, 2008/11/19 17:38:26
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)>: 
       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)>:
    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
   
   =item user_lang()
   
   =back
   
 =cut  =cut
   
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|^http://[^/]+/|/|;
     $baseurl =&HTML::Entities::encode($baseurl,'<>&"');      $baseurl =&HTML::Entities::encode($baseurl,'<>&"');
     #remove machine specification      #remove machine specification
     $attachmenturl =~ s|^https?\://[^/]+/|/|;      $attachmenturl =~ s|^http://[^/]+/|/|;
     $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 283  sub unpackmsgid { Line 422  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)=@_;
       my %senderemails=&Apache::loncommon::getemails();
     my $senderaddress='';      my $senderaddress='';
     my $replytoaddress='';      foreach my $type ('notification','permanentemail','critnotification') {
     if ($env{'form.can_reply'} eq 'N') {   if ($senderemails{$type}) {
         my $lonhost = $Apache::lonnet::perlvar{'lonHostID'};      $senderaddress=$senderemails{$type};
         my $hostname = &Apache::lonnet::hostname($lonhost);   }
         $replytoaddress = 'do-not-reply@'.$hostname;  
     } else {  
         my %senderemails;  
         my $have_sender;  
         if ($env{'form.reply_to_addr'}) {  
             my ($replytoname,$replytodom) = split(/:/,$env{'form.reply_to_addr'});  
             if (!($replytoname eq $env{'user.name'} && $replytodom eq $env{'user.domain'})) {  
                 if (&Apache::lonnet::homeserver($replytoname,$replytodom) ne 'no_host') {  
                     %senderemails =   
                         &Apache::loncommon::getemails($replytoname,$replytodom);  
                     $have_sender = 1;  
                 }  
             }  
         }  
         if (!$have_sender) {  
             %senderemails=&Apache::loncommon::getemails();  
         }  
         foreach my $type ('permanentemail','critnotification','notification') {  
     if ($senderemails{$type}) {  
                 ($senderaddress) = split(/,/,$senderemails{$type});  
                 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 message 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 message'):&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;      my $msg = new Mail::Send;
     $msg->to($to);      $msg->to($to);
     $msg->subject('[LON-CAPA] '.$subject);      $msg->subject('[LON-CAPA] '.$subject);
     if ($replytoaddress) {       if ($senderaddress) { $msg->add('Reply-to',$senderaddress); $msg->add('From',$senderaddress); }
         $msg->add('Reply-to',$replytoaddress);  
     }  
     if ($senderaddress) {  
         $msg->add('From',$senderaddress);   
     }  
     if (my $fh = $msg->open()) {      if (my $fh = $msg->open()) {
  print $fh $body;   print $fh $body;
  $fh->close;   $fh->close;
Line 343  sub sendnotification { Line 455  sub sendnotification {
   
     $text=~s/\&lt\;/\</gs;      $text=~s/\&lt\;/\</gs;
     $text=~s/\&gt\;/\>/gs;      $text=~s/\&gt\;/\>/gs;
     my $homeserver = &Apache::lonnet::homeserver($touname,$toudom);      my $url='http://'.
     my $protocol = $Apache::lonnet::protocol{$homeserver};   &Apache::lonnet::hostname(&Apache::lonnet::homeserver($touname,$toudom)).
     $protocol = 'http' if ($protocol ne 'https');        '/adm/email?username='.$touname.'&domain='.$toudom;
     my $url = $protocol.'://'.&Apache::lonnet::hostname($homeserver).  
               '/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);
     my ($coursetext,$body,$bodybegin,$bodysubj,$bodyend);      my ($coursetext,$body,$bodybegin,$bodysubj,$bodyend);
Line 422  to access the full message.',$url); Line 532  to access the full message.',$url);
         &sendemail($to,$subject,$body,$touname,$toudom,$user_lh);          &sendemail($to,$subject,$body,$touname,$toudom,$user_lh);
     }      }
 }  }
 # ============================================================= Check for email  
   
 sub newmail {  sub newmail {
     if ((time-$env{'user.mailcheck.time'})>300) {      if ((time-$env{'user.mailcheck.time'})>300) {
Line 433  sub newmail { Line 543  sub newmail {
     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 565  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 482  sub retrieve_author_res_msg { Line 585  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;
Line 496  sub del_url_author_res_msg { Line 600  sub del_url_author_res_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;
Line 510  sub clear_author_res_msg { Line 614  sub clear_author_res_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)=@_;
Line 522  sub all_url_author_res_msg { Line 627  sub all_url_author_res_msg {
     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 641  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,
Line 591  sub user_crit_msg_raw { Line 694  sub user_crit_msg_raw {
     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,
Line 637  sub user_crit_msg { Line 723  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 758  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,
Line 734  sub user_normal_msg_raw { Line 820  sub user_normal_msg_raw {
     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)=@_;
Line 836  sub store_recipients { Line 903  sub store_recipients {
     }      }
 }  }
   
 # =============================================================== Folder suffix  
   
 sub foldersuffix {  sub foldersuffix {
     my $folder=shift;      my $folder=shift;
Line 851  sub foldersuffix { Line 917  sub foldersuffix {
     return $suffix;      return $suffix;
 }  }
   
 # ========================================================= User-defined folders   
   
 sub get_user_folders {  sub get_user_folders {
     my ($folder) = @_;      my ($folder) = @_;
Line 892  sub secapply { Line 957  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 965  sub user_lang { Line 1003  sub user_lang {
         @userlangs=(@userlangs,split(/\s*(\,|\;|\:)\s*/,          @userlangs=(@userlangs,split(/\s*(\,|\;|\:)\s*/,
                     $env{'course.'.$fromcid.'.languages'}));                      $env{'course.'.$fromcid.'.languages'}));
     } else {      } else {
         my %langhash = &Apache::loncommon::getlangs($touname,$toudom);          my %langhash = &Apache::lonnet::get('environment',['languages'],$toudom,$touname);
         if ($langhash{'languages'} ne '') {          if ($langhash{'languages'} ne '') {
             @userlangs = split(/\s*(\,|\;|\:)\s*/,$langhash{'languages'});                @userlangs = split(/\s*(\,|\;|\:)\s*/,$langhash{'languages'});  
         } else {          } else {
Line 975  sub user_lang { Line 1013  sub user_lang {
             }              }
         }          }
     }      }
     my @languages=&Apache::lonlocal::get_genlanguages(@userlangs);      my @languages=&Apache::loncommon::get_genlanguages(@userlangs);
     my $user_lh = Apache::localize->get_handle(@languages);      my $user_lh = Apache::localize->get_handle(@languages);
     return $user_lh;      return $user_lh;
 }  }
   
 =pod  
   
 =back  
   
 =cut  
   
 1;  1;
 __END__  __END__
   

Removed from v.1.214.2.5  
changed lines
  Added in v.1.215


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