@@ -28,46 +28,48 @@ use WeBWorK::Utils qw/processEmailMessage createEmailSenderTransportSMTP/;
2828# Send instructor email messages to students.
2929# FIXME: This job currently allows multiple jobs to run at once. Should it be limited?
3030sub run ($job , $mail_data ) {
31- my $ce = eval { WeBWorK::CourseEnvironment -> new({ courseName => $mail_data -> {courseName } }) };
32- return $job -> fail(" Could not construct course environment for $mail_data ->{courseName}. " ) unless $ce ;
31+ my $courseID = $job -> info -> {notes }{ courseID };
32+ return $job -> fail(' The course id was not passed when this job was enqueued. ' ) unless $courseID ;
3333
34- my $db = WeBWorK::DB -> new($ce -> { dbLayout }) ;
35- return $job -> fail(" Could not obtain database connection for $mail_data ->{courseName}. " ) unless $db ;
34+ my $ce = eval { WeBWorK::CourseEnvironment -> new({ courseName => $courseID }) } ;
35+ return $job -> fail(' Could not construct course environment. ' ) unless $ce ;
3636
3737 $job -> {language_handle } = WeBWorK::Localize::getLoc($ce -> {language } || ' en' );
3838
39- my $result_message = eval { $job -> mail_message_to_recipients($ce , $db , $mail_data ) };
40- if ($@ ) {
41- $result_message .= " An error occurred while trying to send email.\n " . " The error message is:\n\n $@ \n\n " ;
42- $job -> app-> log -> error(" An error occurred while trying to send email: $@ \n " );
43- }
39+ my $db = WeBWorK::DB-> new($ce -> {dbLayout });
40+ return $job -> fail($job -> maketext(' Could not obtain database connection.' )) unless $db ;
4441
45- eval { $job -> email_notification ($ce , $mail_data , $result_message ) };
42+ my @result_messages = eval { $job -> mail_message_to_recipients ($ce , $db , $mail_data ) };
4643 if ($@ ) {
47- $job -> app-> log -> error(" An error occurred while trying to send the email notification: $@ \n " );
48- return $job -> fail(" FAILURE: Unable to send email notifation to instructor." );
44+ push (@result_messages ,
45+ $job -> maketext(' An error occurred while trying to send email.' ),
46+ $job -> maketext(' The error message is: [_1]' , ref ($@ ) ? $@ -> message : $@ ),
47+ );
48+ $job -> app-> log -> error($_ ) for @result_messages ;
49+ return $job -> fail(\@result_messages );
4950 }
5051
51- return $job -> finish(" SUCCESS: Email messages sent." );
52+ $job -> app-> log -> error($_ ) for @result_messages ;
53+ return $job -> finish(\@result_messages );
5254}
5355
5456sub mail_message_to_recipients ($job , $ce , $db , $mail_data ) {
55- my $result_message = ' ' ;
57+ my @result_messages ;
5658 my $failed_messages = 0;
57- my $ error_messages = ' ' ;
59+ my @ error_messages ;
5860
5961 my @recipients = @{ $mail_data -> {recipients } };
6062
6163 for my $recipient (@recipients ) {
62- $ error_messages = ' ' ;
64+ @ error_messages = () ;
6365
6466 my $user_record = $db -> getUser($recipient );
6567 unless ($user_record ) {
66- $ error_messages .= " Record for user $recipient not found\n " ;
68+ push ( @ error_messages, $job -> maketext( ' Record for user [_1] not found. ' , $recipient )) ;
6769 next ;
6870 }
6971 unless ($user_record -> email_address =~ / \S / ) {
70- $ error_messages .= " User $recipient does not have an email address -- skipping \n " ;
72+ push ( @ error_messages, $job -> maketext( ' User [_1] does not have an email address. ' , $recipient )) ;
7173 next ;
7274 }
7375
@@ -86,52 +88,44 @@ sub mail_message_to_recipients ($job, $ce, $db, $mail_data) {
8688 transport => createEmailSenderTransportSMTP($ce ),
8789 $ce -> {mail }{set_return_path } ? (from => $ce -> {mail }{set_return_path }) : ()
8890 });
89- debug ' email sent successfully to ' . $user_record -> email_address;
91+ debug ' Email successfully sent to ' . $user_record -> email_address;
9092 };
9193 if ($@ ) {
92- debug " Error sending email: $@ " ;
93- $error_messages .= " Error sending email: $@ " ;
94+ my $exception_message = ref ($@ ) ? $@ -> message : $@ ;
95+ debug ' Error sending email to ' . $user_record -> email_address . " : $exception_message " ;
96+ push (
97+ @error_messages ,
98+ $job -> maketext(
99+ ' Error sending email to [_1]: [_2]' , $user_record -> email_address, $exception_message
100+ )
101+ );
94102 next ;
95103 }
96104
97- $result_message .=
98- $job -> maketext(' Message sent to [_1] at [_2].' , $recipient , $user_record -> email_address) . " \n "
99- unless $error_messages ;
105+ push (@result_messages , $job -> maketext(' Message sent to [_1] at [_2].' , $recipient , $user_record -> email_address))
106+ unless @error_messages ;
100107 } continue {
101108 # Update failed messages before continuing loop.
102- if ($ error_messages ) {
109+ if (@ error_messages ) {
103110 $failed_messages ++;
104- $result_message .= $ error_messages ;
111+ push ( @result_messages , @ error_messages) ;
105112 }
106113 }
107114
108115 my $number_of_recipients = @recipients - $failed_messages ;
109- return $job -> maketext(
110- ' A message with the subject line "[_1]" has been sent to [quant,_2,recipient] in the class [_3]. '
111- . ' There were [_4] message(s) that could not be sent.' ,
112- $mail_data -> {subject }, $number_of_recipients , $mail_data -> {courseName },
116+ return (
117+ $job -> maketext(
118+ ' A message with the subject line "[_1]" has been sent to [quant,_2,recipient].' ,
119+ $mail_data -> {subject }, $number_of_recipients
120+ ),
113121 $failed_messages
114- )
115- . " \n\n "
116- . $result_message ;
117- }
118-
119- sub email_notification ($job , $ce , $mail_data , $result_message ) {
120- my $email =
121- Email::Stuffer-> to($mail_data -> {defaultFrom })-> from($mail_data -> {defaultFrom })-> subject(' WeBWorK email sent' )
122- -> text_body($result_message )-> header(' X-Remote-Host' => $mail_data -> {remote_host });
123-
124- eval {
125- $email -> send_or_die({
126- transport => createEmailSenderTransportSMTP($ce ),
127- $ce -> {mail }{set_return_path } ? (from => $ce -> {mail }{set_return_path }) : ()
128- });
129- };
130- $job -> app-> log -> error(" Error sending email: $@ " ) if $@ ;
131-
132- $job -> app-> log -> info(" WeBWorK::Tasks::SendInstructorEmail: Instructor message sent from $mail_data ->{defaultFrom}" );
133-
134- return ;
122+ ? ($job -> maketext(
123+ ' There [plural,_1,was,were] [quant,_1,message] that could not be sent.' ,
124+ $failed_messages
125+ ))
126+ : (),
127+ @result_messages
128+ );
135129}
136130
137131sub maketext ($job , @args ) {
0 commit comments