diff --git a/lib/moodlelib.php b/lib/moodlelib.php index ec54c3a3ca7..26425261c7d 100644 --- a/lib/moodlelib.php +++ b/lib/moodlelib.php @@ -5884,7 +5884,16 @@ function email_to_user($user, $from, $subject, $messagetext, $messagehtml = '', } else { require_once($CFG->libdir.'/filelib.php'); $mimetype = mimeinfo('type', $attachname); - $mail->addAttachment($CFG->dataroot .'/'. $attachment, $attachname, 'base64', $mimetype); + + $attachmentpath = $attachment; + + // If the attachment is a full path to a file in the tempdir, use it as is, + // otherwise assume it is a relative path from the dataroot (for backwards compatibility reasons). + if (strpos($attachmentpath, $CFG->tempdir) !== 0) { + $attachmentpath = $CFG->dataroot . '/' . $attachmentpath; + } + + $mail->addAttachment($attachmentpath, $attachname, 'base64', $mimetype); } } diff --git a/lib/tests/messagelib_test.php b/lib/tests/messagelib_test.php index 6f4bd2797eb..20b602fbe9a 100644 --- a/lib/tests/messagelib_test.php +++ b/lib/tests/messagelib_test.php @@ -231,6 +231,11 @@ class core_messagelib_testcase extends advanced_testcase { $email = reset($emails); $this->assertTrue(strpos($email->body, 'Content-Disposition: attachment;') !== false); $this->assertTrue(strpos($email->body, 'emailtest.txt') !== false); + + // Check if the stored file still exists after remove the temporary attachment. + $storedfileexists = $fs->file_exists($filerecord['contextid'], $filerecord['component'], $filerecord['filearea'], + $filerecord['itemid'], $filerecord['filepath'], $filerecord['filename']); + $this->assertTrue($storedfileexists); } /** diff --git a/message/output/email/message_output_email.php b/message/output/email/message_output_email.php index cfe9fd460cf..722aea1db4c 100644 --- a/message/output/email/message_output_email.php +++ b/message/output/email/message_output_email.php @@ -77,8 +77,7 @@ class message_output_email extends message_output { } else { // Copy attachment file to a temporary directory and get the file path. $attachment = $eventdata->attachment->copy_content_to_temp(); - // Function email_to_user() adds $CFG->dataroot to file path, so removing it here. - $attachment = str_replace($CFG->dataroot, '', $attachment); + // Get attachment file name. $attachname = clean_filename($eventdata->attachname); } @@ -88,7 +87,9 @@ class message_output_email extends message_output { $eventdata->fullmessagehtml, $attachment, $attachname); // Remove an attachment file if any. - @unlink($attachment); + if (!empty($attachment) && file_exists($attachment)) { + unlink($attachment); + } return $result; }