--- loncom/interface/lonnotify.pm 2005/08/02 05:03:10 1.1 +++ loncom/interface/lonnotify.pm 2005/10/05 18:50:08 1.3 @@ -31,6 +31,9 @@ use Apache::lonsupportreq; use LONCAPA::Enrollment; use Apache::Constants qw(:common :http); use Apache::lonlocal; +use Mail::Send; +use HTML::TokeParser; +use HTML::Entities; sub handler { my ($r) = @_; @@ -40,31 +43,314 @@ sub handler { if ($r->header_only) { return OK; } -# my $codedom = $env{'request.role.domain'}; - my $cdom = 'northwood5'; - unless (&Apache::lonnet::allowed('psa',$env{'request.role.domain'})) { + my $cdom = $env{'request.role.domain'}; + unless (&Apache::lonnet::allowed('psa',$cdom)) { # Not allowed to broadcast e-mail system-wide $env{'user.error.msg'}="/adm/notify:psa:0:0:Cannot broadcast e-mail systemwide"; return HTTP_NOT_ACCEPTABLE; } + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, + ['command']); my $command = $env{'form.command'}; &Apache::lonhtmlcommon::clear_breadcrumbs(); + my %ltext=&Apache::lonlocal::texthash( + 'note' => 'Notification E-mail', + ); + my $function = &Apache::loncommon::get_users_function(); + my $tablecolor = &Apache::loncommon::designparm($function.'.tabbg'); + my $bodytag = &Apache::loncommon::bodytag('Broadcast e-mail to users'); + my $html=&Apache::lonxml::xmlbegin(); &Apache::lonhtmlcommon::add_breadcrumb ({href=>'/adm/notify', - text=>"Broadcast e-mail"}); + text=>"Broadcast E-mail"}); if ($command eq 'process') { - &print_request_receipt($r,$cdom); + &print_request_receipt($r,$cdom,$tablecolor,$bodytag,$html,\%ltext); } elsif ($command eq 'compose') { - &print_composition_form($r,$cdom); + &print_composition_form($r,$cdom,$tablecolor,$bodytag,$html,\%ltext); + } elsif ($command eq 'pick_target') { + &print_selection_form($r,$cdom,$tablecolor,$bodytag,$html,\%ltext); + } elsif ($command eq 'pick_display') { + &print_display_option_form($r,$cdom,$tablecolor,$bodytag,$html,\%ltext); + } elsif ($command eq 'display') { + &print_display($r,$cdom,$tablecolor,$bodytag,$html,\%ltext); } else { - &print_selection_form($r,$cdom); + &print_front_page($r,$cdom,$tablecolor,$bodytag,$html,\%ltext); } return OK; } +sub print_front_page { + my ($r,$cdom,$tablecolor,$bodytag,$html,$ltext) = @_; + my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs + (undef,'Broadcast e-mail to Domain','Broadcast_system_email'); + my $jscript = qq| +function next_page(caller) { + if (caller == 'view') { + document.front.command.value="pick_display" + } + else { + document.front.command.value="pick_target" + } + document.front.submit() +} + |; + my %lt=&Apache::lonlocal::texthash( + 'note' => 'Notification E-mail', + ); + my $output = <<"ENDONE"; +$html + + LON-CAPA $lt{'note'} + + +$bodytag +$breadcrumbs +
+ENDONE + $output .= '
'. + ''; + $output .= &Apache::lonhtmlcommon::start_pick_box(); + $output .= ''. + ''. + '
'. + 'Send a new e-mail message to selected users from this domain
'. + 'Display e-mail sent by Domain Coordinators in this domain'. + '
'; + $output .= &Apache::lonhtmlcommon::end_pick_box(); + $output .= qq( +
+ +); + $r->print($output); + return; +} + +sub print_display_option_form { + my ($r,$cdom,$tablecolor,$bodytag,$html,$ltext) = @_; + &Apache::lonhtmlcommon::add_breadcrumb + ({text=>"Display options"}); + my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs + (undef,'Broadcast e-mail display options','Broadcast_system_email'); + my $table_width = ''; + my $col_width = '200'; + my $formname = 'display_options'; + my $cmd = 'display'; + my $submit_text = 'Display e-mail'; + my @roles = ('dc'); + my $now = time; + my %lt=&Apache::lonlocal::texthash( + 'note' => 'Notification E-mail', + ); + my $startdateform = &Apache::lonhtmlcommon::date_setter($formname, + 'startdate', + $now); + my $enddateform = &Apache::lonhtmlcommon::date_setter($formname, + 'enddate', + $now); + my $jscript; + my %totals = (); + my %personnel = (); + my $output = <<"ENDONE"; +$html + + LON-CAPA $lt{'note'} + + +$bodytag +$breadcrumbs +
+
+ENDONE + $output .= &Apache::lonhtmlcommon::start_pick_box($table_width); + $output .= &Apache::lonhtmlcommon::row_title($col_width,$tablecolor,&mt('Date range')); + $output .= ''; + $output .= '
Earliest to display: '. + $startdateform.'
Latest to display: '.$enddateform. + '
'; + $output .= &Apache::lonhtmlcommon::row_closure(); + $output .= &Apache::lonhtmlcommon::row_title($col_width,$tablecolor,&mt('Choose sender(s)')); +# FIXME - need to complete work on domain_roles_get +# &Apache::lonnet::domain_roles_get($cdom,\@roles,\%personnel,%totals); + $output .= ''; + if ($totals{'dc'} > 0) { + foreach my $user (sort(keys(%{$personnel{'dc'}}))) { + my ($uname,$udom) = split(/:/,$user); + my %userinfo = &Apache::lonnet::get('environment',['lastname','firstname'],$udom,$uname); + $output .= ' '.$userinfo{firstname}.' '.$userinfo{lastname}.'  ('.$user.')'; + } + } + $output .= ''; + $output .= &Apache::lonhtmlcommon::row_closure(); + $output .= &Apache::lonhtmlcommon::submit_row($col_width,$tablecolor,&mt('Submit'),$cmd,$submit_text); + $output .= &Apache::lonhtmlcommon::end_pick_box(); + $output .= qq( + +
+ +); + $r->print($output); + return; +} + +sub print_display { + my ($r,$cdom,$tablecolor,$bodytag,$html,$ltext) = @_; + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>'/adm/notify?command=pick_display', + text=>"Display options"}, + {text=>"E-mail display"}); + my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs + (undef,'Display Broadcast e-mail','Broadcast_system_email'); + my $table_width = ''; + my $col_width = '200'; + my $rowColor1 = "#ffffff"; + my $rowColor2 = "#eeeeee"; + my $rowColor; + my $msgcount = 0; + my $formname = 'display_sent'; + my $start = &Apache::lonhtmlcommon::get_date_from_form('startdate'); + my $end = &Apache::lonhtmlcommon::get_date_from_form('enddate'); + my @senders = &Apache::loncommon::get_env_multiple('form.sender'); + my $senderlist = join('&',@senders); + my %sentmail = &Apache::lonnet::dcmaildump($cdom,$start,$end,$senderlist); + my %dcmail = (); + my %Sortby = (); + my $jscript = <<"ENDSCRIPT"; +function changeSort(caller) { + document.$formname.sortby.value = caller; + document.$formname.submit(); +} +ENDSCRIPT + my $output = <<"ENDONE"; +$html + + LON-CAPA $$ltext{'note'} + + +$bodytag +$breadcrumbs +
+
+ENDONE + + foreach my $server (keys(%sentmail)) { + foreach my $msgid (keys(%{$sentmail{$server}})) { + my %content = &unpackagemail($sentmail{$server}{$msgid}); + if (defined($dcmail{$msgid})) { + foreach my $user (keys(%{$content{'recipients'}})) { + $dcmail{$msgid}{recipients}{$user} = $content{recipients}{$user}; + } + } else { + $msgcount ++; + %{$dcmail{$msgid}} = (); + foreach my $item (keys(%content)) { + if ($item eq 'recipients') { + foreach my $user (keys(%{$content{recipients}})) { + $dcmail{$msgid}{recipients}{$user} = $content{recipients}{$user}; + } + } else { + $dcmail{$msgid}{$item} = $content{$item}; + } + } + } + } + } + $output .= &Apache::lonhtmlcommon::start_pick_box(); + if ($msgcount > 0) { + my $rowNum = 0; + $output .= ' + + + + + + + '; + if (($env{'form.sortby'} eq 'date') || ($env{'form.sortby'} eq '') || (!defined($env{'form.sortby'})) || (($env{'form.sortby'} eq 'sender') && (@senders <= 1))) { + foreach my $msgid (sort(keys(%dcmail))) { + if ($rowNum %2 == 1) { + $rowColor = $rowColor1; + } else { + $rowColor = $rowColor2; + } + my $recipients = ''; + my ($date,$subj,$sname,$sdom,$cdom) = split(/:/,$msgid,5); + $date = &Apache::lonlocal::locallocaltime($date); + foreach my $user (sort(keys(%{$dcmail{$msgid}{recipients}}))) { + $recipients .= $dcmail{$msgid}{recipients}{$user}.', '; + } + $recipients =~ s/,\s$//; + $output .= ''."\n"; + $rowNum ++; + } + } else { + foreach my $msgid (sort(keys(%dcmail))) { + my ($date,$subj,$sname,$sdom,$cdom) = split(/:/,$msgid,5); + if ($env{'form.sortby'} eq 'subject') { + push @{$Sortby{$dcmail{$msgid}{subject}}},$msgid; + } elsif ($env{'form.sortby'} eq 'message') { + push @{$Sortby{$dcmail{$msgid}{message}}},$msgid; + } elsif ($env{'form.sortby'} eq 'recipients') { + my $recipients =''; + foreach my $user (sort(keys(%{$dcmail{$msgid}{recipients}}))) { + $recipients .= $dcmail{$msgid}{recipients}{$user}.', '; + } + $recipients =~ s/,\s$//; + push @{$Sortby{$recipients}},$msgid; + } elsif ($env{'form.sortby'} eq 'sender') { + if (@senders > 1) { + push @{$Sortby{$sname.':'.$sdom}},$msgid; + } + } + } + foreach my $key (sort(keys(%Sortby))) { + foreach my $msgid (@{$Sortby{$key}}) { + if ($rowNum %2 == 1) { + $rowColor = $rowColor1; + } else { + $rowColor = $rowColor2; + } + my $recipients = ''; + if ($env{'form.sortby'} eq 'recipients') { + $recipients = $key; + } else { + foreach my $user (sort(keys(%{$dcmail{$msgid}{recipients}}))) { + $recipients .= $dcmail{$msgid}{recipients}{$user}.', '; + } + $recipients =~ s/,\s$//; + } + my ($date,$subj,$sname,$sdom,$cdom) = split(/:/,$msgid,5); + $date = &Apache::lonlocal::locallocaltime($date); + $output .= ''."\n"; + $rowNum ++; + } + } + } + $output .= '
DateSubjectSenderMessageRecipients
'.$date.''.$dcmail{$msgid}{subject}.''.$sname.':'.$sdom.''.$dcmail{$msgid}{message}.''.$recipients.'
'.$date.''.$dcmail{$msgid}{subject}.''.$sname.':'.$sdom.''.$dcmail{$msgid}{message}.''.$recipients.'
'; + } else { + $output .= ' 
  No mail sent matching supplied criteria  

 '; + } + $output .= &Apache::lonhtmlcommon::end_pick_box(); + $output .= &echo_form_input(); + unless (defined($env{'form.sortby'})) { + $output .= qq(\n); + } + $output .= qq( + + +); + $r->print($output); + return; +} + sub print_selection_form { - my ($r,$cdom) = @_; + my ($r,$cdom,$tablecolor,$bodytag,$html,$ltext) = @_; my %coursecodes = (); my %codes = (); my @codetitles = (); @@ -77,211 +363,97 @@ sub print_selection_form { my $totcodes = 0; my $format_reply; my $jscript = ''; + my $formname = 'rolefilter'; + my $table_width = '100%'; + my $col_width = '200'; + my %lt=&Apache::lonlocal::texthash( + 'note' => 'Notification E-mail', + 'buil' => 'Building valid e-mail address from username, if missing from preferences:', + 'kerb' => 'Kerberos: enter default for each realm used in the domain, with comma separation of entries', + 'infs' => 'Internal, Filesystem and Local authentication: enter single default.', + 'comp' => 'Compose Message' + ); my $loaditems = qq| function initialize_codes() { return; } |; + &Apache::lonhtmlcommon::add_breadcrumb + ({text=>"Select Audience"}); + $totcodes = &Apache::lonsupportreq::retrieve_instcodes(\%coursecodes,$cdom,$totcodes); if ($totcodes > 0) { $format_reply = &Apache::lonnet::auto_instcode_format($caller,$cdom,\%coursecodes,\%codes,\@codetitles,\%cat_titles,\%cat_order); if ($format_reply eq 'ok') { my $numtypes = @codetitles; &Apache::lonsupportreq::build_code_selections(\%codes,\@codetitles,\%cat_titles,\%cat_order,\%idlist,\%idnums,\%idlist_titles); - &Apache::lonsupportreq::javascript_code_selections($numtypes,\%cat_titles,\$jscript,\%idlist,\%idnums,\%idlist_titles,\@codetitles); + &Apache::lonsupportreq::javascript_code_selections($formname,$numtypes,\%cat_titles,\$jscript,\%idlist,\%idnums,\%idlist_titles,\@codetitles); $loaditems = ''; } } - my $function = &Apache::loncommon::get_users_function(); - my $tablecolor = &Apache::loncommon::designparm($function.'.tabbg'); - my $bodytag = &Apache::loncommon::bodytag('Broadcast e-mail to users'); - my $html=&Apache::lonxml::xmlbegin(); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs - (undef,'Broadcast e-mail to users','Broadcast_system_email'); - $r->print(< - LON-CAPA Notification E-mail + LON-CAPA $lt{'note'} +$cb_jscript $bodytag $breadcrumbs
-
- - - - -
- - - - -
- - - - -
- - - - - - - - - - - - - -
- - - - -
Roles: -
-
- - - - -
-
-
- - - - -
Courses: -
-
- - - -
-ENDTWO - if ($totcodes > 0) { - my $numtitles = @codetitles; - if ($numtitles == 0) { - $r->print('No institutional course code categories found.
Can not select courses to receive e-mail.'); - } else { - $r->print(''); - for (my $i=1; $i<$numtitles; $i++) { - $r->print('' - ); - } - $r->print('
'.$codetitles[0].'
'."\n". - '
'.$codetitles[$i].'
'."\n". - ''."\n". - '
'); - } - } - $r->print(< -
-
- - - - -
Submit: -
-
-
- -   -

-
-
-
-
+ $output .= &Apache::lonhtmlcommon::start_pick_box($table_width); + my @roles = ('cc','in','ta','ep','ad','st','cr'); + my %longtypes = (); + my %authtypes = (); + &form_elements(\%longtypes,\%authtypes); + my $descrip = $lt{'buil'}.' +
    +
  • '.$lt{'kerb'}.'
    (e.g., MSU.EDU=msu.edu, MSUE.EDU=msue.msu.edu).
  • +
  • '.$lt{'infs'}.'
  • +
'."\n"; + my $submit_text = $lt{'comp'}; + my $cmd = 'compose'; + $output .= &Apache::lonhtmlcommon::role_select_row(\@roles,$col_width,$tablecolor,'Roles'); + $output .= &Apache::lonhtmlcommon::course_select_row($col_width,$tablecolor,'Courses',$formname,$totcodes,\@codetitles,\%idlist,\%idlist_titles); + $output .= &Apache::lonhtmlcommon::status_select_row(\%longtypes,$col_width,$tablecolor,&mt('Access status')); + $output .= &Apache::lonhtmlcommon::email_default_row(\%authtypes,$col_width,$tablecolor,&mt('Username -> Email conversion'),$descrip); + $output .= &Apache::lonhtmlcommon::submit_row($col_width,$tablecolor,&mt('Submit'),$cmd,$submit_text); + $output .= &Apache::lonhtmlcommon::end_pick_box(); + $output .= qq(
- -END +); + $r->print($output); return; } sub print_composition_form { - my ($r,$cdom) = @_; - my $function = &Apache::loncommon::get_users_function(); - my $tablecolor = &Apache::loncommon::designparm($function.'.tabbg'); - my $bodytag = &Apache::loncommon::bodytag('Broadcast e-mail to users'); - my $html=&Apache::lonxml::xmlbegin(); + my ($r,$cdom,$tablecolor,$bodytag,$html,$ltext) = @_; &Apache::lonhtmlcommon::add_breadcrumb - ({href=>'/adm/notify?command=compose', - text=>"Compose Message"}); - my $jscript = <<"END"; -function checkAll(field) { - if (field.length > 0) { - for (i = 0; i < field.length; i++) { - field[i].checked = true ; - } - } else { - field.checked = true - } -} - -function uncheckAll(field) { - if (field.length > 0) { - for (i = 0; i < field.length; i++) { - field[i].checked = false ; - } } else { - field.checked = false ; - } -} -END + ({href=>'/adm/notify?command=pick_target', + text=>"Select Audience"}, + {text=>"Compose Message"}); + my $jscript = &Apache::loncommon::check_uncheck_jscript(); my $breadcrumbs = (&Apache::lonhtmlcommon::breadcrumbs (undef,'Broadcast e-mail to users','Broadcast_system_email')); + my %lt=&Apache::lonlocal::texthash( + 'note' => 'Notification E-mail', + 'nore' => 'No recipients identified', + 'emad' => 'e-mail address', + ); $r->print(< - LON-CAPA Notification E-mail + LON-CAPA $lt{'note'} @@ -289,155 +461,164 @@ $jscript $bodytag $breadcrumbs
ENDONE - my $instcode = ''; - my @cats = ('Semester','Year','Department','Number'); - foreach my $category (@cats) { - if (defined($env{'form.'.$category})) { - unless ($env{'form.'.$category} eq '-1') { - $instcode .= $env{'form.'.$category}; + my $coursefilter = $env{'form.coursepick'}; + my %courses = (); + if ($coursefilter eq 'all') { + %courses = &Apache::lonnet::courseiddump($cdom,'.','.','.','.','.'); + } elsif ($coursefilter eq 'category') { + my $instcode = ''; + my @cats = ('Semester','Year','Department','Number'); + foreach my $category (@cats) { + if (defined($env{'form.'.$category})) { + unless ($env{'form.'.$category} eq '-1') { + $instcode .= $env{'form.'.$category}; + } } } + if ($instcode eq '') { + $instcode = '.'; + } + %courses = &Apache::lonnet::courseiddump($cdom,'.','.',$instcode,'.','.'); + } elsif ($coursefilter eq 'specific') { + if ($env{'form.coursetotal'} > 1) { + my @course_ids = split(/&&/,$env{'form.courselist'}); + foreach (@course_ids) { + $courses{$_} = ''; + } + } else { + $courses{$env{'form.courselist'}} = ''; + } } - if ($instcode eq '') { - $instcode = '.'; - } - my %courses = &Apache::lonnet::courseiddump($cdom,'.','.',$instcode,'.','.'); + + my @types = &Apache::loncommon::get_env_multiple('form.types'); my @roles = &Apache::loncommon::get_env_multiple('form.roles'); + + my %longtypes = (); + my %authtypes = (); + my %email_defaults = (); + my $table_width = '100%'; + my $col_width = '200'; + + &form_elements(\%longtypes,\%authtypes); + foreach my $auth (keys(%authtypes)) { + if (exists($env{'form.'.$auth})) { + my $default = $env{'form.'.$auth}; + $default =~ s/^,+//; + $default =~ s/,+$//; + if ($auth =~ /^krb/) { + %{$email_defaults{$auth}} = (); + if ($default =~ /,/) { + my @items = split(/,/,$default); + foreach my $item (@items) { + my ($realm,$value) = split(/=/,$item); + $email_defaults{$auth}{$realm} = $value; + } + } else { + my ($realm,$value) = split(/=/,$default); + $email_defaults{$auth}{$realm} = $value; + } + } else { + $email_defaults{$auth} = $default; + } + } + } + + my $sender = &get_user_info($env{'user.name'},%email_defaults); + my %recipients = (); - foreach my $course_id (keys %courses) { - &get_active_users($course_id,\@roles,\%recipients); + my %users = (); + my %access = (); + my $totalrecip = 0; + my @unmatched = (); + foreach my $role (@roles) { + %{$users{$role}} = (); + } + foreach my $type (@types) { + $access{$type} = $type; + } + foreach my $course_id (keys(%courses)) { + my ($cdom,$cnum) = split(/_/,$course_id); + &Apache::loncommon::get_course_users($cdom,$cnum,\%access,\@roles,\%users); + } + foreach my $role (keys(%users)) { + foreach my $user (keys(%{$users{$role}})) { + unless (defined($recipients{$user})) { + $recipients{$user} = &get_user_info($user,%email_defaults); + if ($recipients{$user} eq '') { + push @unmatched, $user; + } else { + $totalrecip ++; + } + } + } } - if (%recipients) { - $r->print('
- - - -
- - - - -
- - - - -
- - - - - - - - - - - - - -
- - - - -
Subject: -
-
- - - - -
-
-
- - - - - -
Message:
-
- - - - -
- -
-
- - - - -
Recipients: -
-
- - - - - - - - -
- -   
- '); - foreach my $username (sort keys %recipients) { + my $output = ''."\n"; + + if ($totalrecip > 0) { + $output .= &Apache::lonhtmlcommon::start_pick_box($table_width); + $output .= &Apache::lonhtmlcommon::row_title($col_width,$tablecolor,&mt('Subject')); + $output .= ' '; + $output .= &Apache::lonhtmlcommon::row_closure(); + $output .= &Apache::lonhtmlcommon::row_title($col_width,$tablecolor,&mt('Message')); + $output .= ' '; + $output .= &Apache::lonhtmlcommon::row_closure(); + $output .= &Apache::lonhtmlcommon::row_title($col_width,$tablecolor,&mt('Recipients')); + $output .= ' - -
+    +
'; + if (keys(%recipients) > 0) { + $output .= ''; + } + foreach my $username (sort(keys(%recipients))) { if ($recipients{$username} =~ /\@/) { my $value=&Apache::lonnet::escape($username).':'.&Apache::lonnet::escape($recipients{$username}); - $r->print(''); - $numrecep ++; + $output .= ''; } } - $r->print(' -
 username:domain  '.$lt{'emad'}.'
'.$username.''.$recipients{$username}.'
'.$username.'  '.$recipients{$username}.'
-
-
- - - - -
Submit: -
-
-
- -   -

-
-
-
-
-'); + $output .= '
'; + $output .= &Apache::lonhtmlcommon::row_closure(); + $output .= &Apache::lonhtmlcommon::row_title($col_width,$tablecolor,&mt('Sender e-mail address')); + $output .= ''; + $output .= &Apache::lonhtmlcommon::row_closure(); + $output .= &Apache::lonhtmlcommon::submit_row($col_width,$tablecolor,&mt('Submit'),'process',&mt('Send Message')); + $output .= &Apache::lonhtmlcommon::end_pick_box(); } else { - $r->print('No recipients identified'); + $output .= $lt{'nore'}; } - $r->print(''); + $output .= &echo_form_input('command'); + $output .= ''; + $r->print($output); return; } sub print_request_receipt { - my ($r,$dom) =@_; - my @recipients = &Apache::loncommon::get_env_multiple('recipients'); + my ($r,$dom,$tablecolor,$bodytag,$html,$ltext) =@_; + my @recipients = &Apache::loncommon::get_env_multiple('form.recipient'); my $subject = $env{'form.subject'}; my $message = $env{'form.message'}; - my $function = &Apache::loncommon::get_users_function(); - my $tablecolor = &Apache::loncommon::designparm($function.'.tabbg'); - my $bodytag = &Apache::loncommon::bodytag('Broadcast e-mail to users'); - my $html=&Apache::lonxml::xmlbegin(); - my $jscript; + my $from = $env{'form.sender'}; + my $jscript = <'/adm/notify?command=pick_target', + text=>"Select audience"}); + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>'javascript:showCompose()', + text=>"Compose Message"}); + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>'/adm/notify?command=process', + text=>"Outcome"}); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs - (undef,'Broadcast e-mail to users','Broadcast_system_email'); - $r->print(< LON-CAPA Notification E-mail @@ -447,51 +628,231 @@ $jscript $bodytag $breadcrumbs +
+
ENDONE - $r->print($subject.'

'); - $r->print($message.'

'); - foreach my $person (@recipients) { - my ($username,$email) = split/:/,$person; - $r->print('user: '.&Apache::lonnet::unescape($username).' email: '.&Apache::lonnet::unescape($email).'
'); + $output .= &Apache::lonhtmlcommon::start_pick_box(); + my @deliveries = (); + &broadcast_email(\@recipients,$subject,$from,$message,\@deliveries); + if (@deliveries > 0) { + $output .= ' + + + + + + + + + + + + + + +
StatusSubjectMessageRecipients
Sent'.$subject.''.$message.''; + foreach my $person (@deliveries) { + my ($username,$email) = split(/:/,$person); + $output .= &Apache::lonnet::unescape($email).' ('.&Apache::lonnet::unescape($username).')
'."\n"; + } + $output .= '
+ + '; + &store_mail($subject,$message,$dom,\@deliveries); + } else { + $output .= 'No mail sent - no recipients identified'; } + $output .= &Apache::lonhtmlcommon::end_pick_box(); + $output .= '
Send another message?'."\n"; + $output .= &echo_form_input(); + $output .= ' +
+ +'; + $r->print($output); return; } -sub get_active_users { - my ($course_id,$roles,$recipients) = @_; - if (@{$roles} > 0) { - my ($cdom,$cnum) = split/_/,$course_id; - my @coursepersonnel = &Apache::lonnet::getkeys('nohist_userroles',$cdom,$cnum); - foreach my $person (@coursepersonnel) { - my ($role,$user) = ($person =~ /^([^:]*):(.+)$/); - if (($role) && (grep/^$role$/,@{$roles})) { - unless (exists($$recipients{$user})) { - my ($uname,$udom) = split/:/,$user; - if ($uname ne '' && $udom ne '') { - if (&LONCAPA::Enrollment::check_user_status($udom,$uname,$cdom,$cnum,$role) eq 'ok') { - my %userinfo = &Apache::lonnet::get('environment',['permanenetemail','notification','critnotification',],$udom,$uname); - my @emailtypes = ('permanentemail','critnotification','notification'); - my $email = ''; - foreach (@emailtypes) { - $email = $userinfo{$_}; - if ($email =~ /\@/) { - last; - } - } - if ($email eq '') { - my $authinfo = &Apache::lonnet::queryauthenticate($uname,$udom); - my ($authtype,$autharg) = split/:/,$authinfo; - if (($authtype =~ /^krb/) && ($autharg =~ /^MSU/)) { - $email = $uname.'@msu.edu'; - } - } - $$recipients{$user} = $email; - } +sub broadcast_email { + my ($recipients,$subject,$from,$message,$deliveries,$ltext)=@_; +# find some way to spread out delivery for large numbers of recipients. + foreach my $user (@{$recipients}) { + my $msg = new Mail::Send; + my ($username,$to) = split(/:/,$user); + $username = &Apache::lonnet::unescape($username); + $to = &Apache::lonnet::unescape($to); + $msg->to($to); + $msg->subject($subject); + $msg->add('From',"$from"); + if (my $fh = $msg->open()) { + print $fh $message; + $fh->close; + push(@{$deliveries},$user); + } + } +} + +sub get_user_info { + my ($user,%email_defaults,$ltext) = @_; + my ($uname,$udom) = split(/:/,$user); + my @emailtypes = ('permanentemail','critnotification','notification'); + my %userinfo = &Apache::lonnet::get('environment',\@emailtypes,$udom,$uname); + my $email = ''; + foreach my $type (@emailtypes) { + $email = $userinfo{$type}; + if ($email =~ /\@/) { + last; + } + } + if ($email eq '') { + my $authinfo = &Apache::lonnet::queryauthenticate($uname,$udom); + my ($authtype,$autharg) = split(/:/,$authinfo); + if ($authtype =~ /^krb/) { + if (defined($email_defaults{$authtype}{$autharg})) { + $email = $uname.'@'.$email_defaults{$authtype}{$autharg}; + } + } else { + if (defined($email_defaults{$authtype})) { + $email = $uname.'@'.$email_defaults{$authtype}; + } + } + } + return $email; +} + +sub form_elements { + my ($longtypes,$authtypes,$ltext) = @_; + %{$longtypes} = ( + active => 'Currently has access', + previous => 'Previously had access', + future => 'Will have future access', + ); + %{$authtypes} = ( + krb4 => 'Kerberos 4', + krb5 => 'Kerberos 5', + int => 'Internal (LON-CAPA)', + unix => 'Filesystem (UNIX)', + local => 'Local/Customized', + ); + return; +} + +sub store_mail { + my ($subject,$message,$domain,$recipients,$attachmenturl,$ltext) = @_; + my %status = (); + my %servers = (); + my $msgid=&packagemail($subject,$message,$domain, + $recipients,\%servers,$attachmenturl); +# Store in dc email db files on appropriate servers. + foreach my $server (keys(%servers)) { +# FIXME This needs to be via a subroutine in lonnet + $status{$server} = &Apache::lonnet::critical( + 'dcmailput:'.$domain.':'.&Apache::lonnet::escape($msgid).'='. + &Apache::lonnet::escape($servers{$server}),$server); + } +} + +sub packagemail { + my ($subject,$message,$dom,$recipients,$servers,$attachmenturl,$ltext) = @_; + my %record = (); + my $partsubj=$subject; + $partsubj=&Apache::lonnet::escape($partsubj); + $message =&HTML::Entities::encode($message,'<>&"'); + $subject =&HTML::Entities::encode($subject,'<>&"'); + #remove machine specification + $attachmenturl =~ s|^http://[^/]+/|/|; + $attachmenturl =&HTML::Entities::encode($attachmenturl,'<>&"'); + my $now=time; + my $msgid= &Apache::lonnet::escape($now).':'.$partsubj.':'. + &Apache::lonnet::escape($env{'user.name'}).':'. + &Apache::lonnet::escape($env{'user.domain'}).':'. + &Apache::lonnet::escape($dom).':'.$$; + my $result=''.$env{'user.name'}.''. + ''.$env{'user.domain'}.''. + ''. + ''.$ENV{'SERVER_NAME'}.''. + ''.$ENV{'HTTP_HOST'}.''. + ''.$ENV{'REMOTE_ADDR'}.''. + ''.$msgid.''. + ''.$dom.''. + ''.$subject.''. + ''.$message.''."\n"; + if (defined($attachmenturl)) { + $result.= ''.$attachmenturl.''; + } + foreach my $recip (@{$recipients}) { + my ($username,$email) = split(/:/,$recip); + $username = &Apache::lonnet::unescape($username); + $email = &Apache::lonnet::unescape($email); + my ($uname,$udom) = split(/:/,$username); + my $uhom=&Apache::lonnet::homeserver($uname,$udom); + if ($uhom ne 'no_host') { + $username = &HTML::Entities::encode($username,'<>&"'); + $email = &HTML::Entities::encode($email,'<>&"'); + $record{$uhom} .= ''. + $email.''; + } + } + foreach my $server (keys(%record)) { + $$servers{$server} = $result.$record{$server}; + } + return $msgid; +} + +sub unpackagemail { + my ($message,$notoken,$ltext)=@_; + my $parser=HTML::TokeParser->new(\$message); + my $token; + my %content=(); + %{$content{recipients}} = (); + while ($token=$parser->get_token()) { + if ($token->[0] eq 'S') { + my $entry=$token->[1]; + my $value=$parser->get_text('/'.$entry); + my ($username,$email); + if ($entry eq 'recipient') { + $username = $token->[2]{'username'}; + $username = &HTML::Entities::decode($username,'<>&"'); + $content{recipients}{$username} = + &HTML::Entities::decode($value,'<>&"'); + } elsif ($entry eq 'subject' || $entry eq 'message') { + $content{$entry}=&HTML::Entities::decode($value,'<>&"'); + } else { + $content{$entry}=$value; + } + } + } + if ($content{'attachmenturl'}) { + my ($fname)=($content{'attachmenturl'}=~m|/([^/]+)$|); + if ($notoken) { + $content{'message'}.='

'.&mt('Attachment').': '.$fname.''; } else { + &Apache::lonnet::allowuploaded('/adm/notify', + $content{'attachmenturl'}); + $content{'message'}.='

'.&mt('Attachment'). + ': '. + $fname.''; + } + } + return %content; +} + +sub echo_form_input { + my (@excluded) = @_; + my $output = ''; + foreach my $key (keys(%env)) { + if ($key =~ /^form\.(.+)$/) { + if ((!@excluded) || (!grep/^$1$/,@excluded)) { + if (ref($env{$key})) { + foreach my $value (@{$env{$key}}) { + $output .= qq(\n); } + } else { + $output .= qq(\n); } } } } + return $output; } 1;