See Release Notes
Long Term Support Release
Differences Between: [Versions 310 and 401] [Versions 311 and 401] [Versions 39 and 401] [Versions 400 and 401] [Versions 401 and 402] [Versions 401 and 403]
1 <?php 2 // This file is part of Moodle - http://moodle.org/ 3 // 4 // Moodle is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // Moodle is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 16 17 /** 18 * Customised version of phpmailer for Moodle 19 * 20 * @package core 21 * @author Dan Poltawski <talktodan@gmail.com> 22 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 23 */ 24 25 defined('MOODLE_INTERNAL') || die(); 26 27 // PLEASE NOTE: we use the phpmailer class _unmodified_ 28 // through the joys of OO. Distros are free to use their stock 29 // version of this file. 30 31 /** 32 * Moodle Customised version of the PHPMailer class 33 * 34 * This class extends the stock PHPMailer class 35 * in order to make sensible configuration choices, 36 * and behave in a way which is friendly to moodle. 37 * 38 * @copyright 2009 Dan Poltawski <talktodan@gmail.com> 39 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 40 * @since Moodle 2.0 41 */ 42 class moodle_phpmailer extends \PHPMailer\PHPMailer\PHPMailer { 43 44 /** 45 * Constructor - creates an instance of the PHPMailer class 46 * with Moodle defaults. 47 */ 48 public function __construct(){ 49 global $CFG; 50 $this->Version = 'Moodle '.$CFG->version; // mailer version 51 $this->CharSet = 'UTF-8'; 52 // MDL-52637: Disable the automatic TLS encryption added in v5.2.10 (9da56fc1328a72aa124b35b738966315c41ef5c6). 53 $this->SMTPAutoTLS = false; 54 55 if (!empty($CFG->smtpauthtype)) { 56 $this->AuthType = $CFG->smtpauthtype; 57 58 if ($this->AuthType == 'XOAUTH2') { 59 $this->process_oauth(); 60 } 61 } 62 63 // Some MTAs may do double conversion of LF if CRLF used, CRLF is required line ending in RFC 822bis. 64 if (isset($CFG->mailnewline) and $CFG->mailnewline == 'CRLF') { 65 parent::setLE("\r\n"); 66 } else { 67 parent::setLE("\n"); 68 } 69 } 70 71 /** 72 * Extended AddCustomHeader function in order to stop duplicate 73 * message-ids 74 * http://tracker.moodle.org/browse/MDL-3681 75 */ 76 public function addCustomHeader($custom_header, $value = null) { 77 if ($value === null and preg_match('/message-id:(.*)/i', $custom_header, $matches)) { 78 $this->MessageID = trim($matches[1]); 79 return true; 80 } else if ($value !== null and strcasecmp($custom_header, 'message-id') === 0) { 81 $this->MessageID = trim($value); 82 return true; 83 } else { 84 return parent::addCustomHeader($custom_header, $value); 85 } 86 } 87 88 /** 89 * Use internal moodles own core_text to encode mimeheaders. 90 * Fall back to phpmailers inbuilt functions if not 91 */ 92 public function encodeHeader($str, $position = 'text') { 93 $encoded = core_text::encode_mimeheader($str, $this->CharSet); 94 if ($encoded !== false) { 95 if ($position === 'phrase') { 96 // Escape special symbols in each line in the encoded string, join back together and enclose in quotes. 97 $chunks = preg_split("/\\n/", $encoded); 98 $chunks = array_map(function($chunk) { 99 return addcslashes($chunk, "\0..\37\177\\\""); 100 }, $chunks); 101 return '"' . join(parent::getLE(), $chunks) . '"'; 102 } 103 return str_replace("\n", parent::getLE(), $encoded); 104 } 105 106 return parent::encodeHeader($str, $position); 107 } 108 109 /** 110 * Replaced function to fix tz bug: 111 * http://tracker.moodle.org/browse/MDL-12596 112 */ 113 public static function rfcDate() { 114 $tz = date('Z'); 115 $tzs = ($tz < 0) ? '-' : '+'; 116 $tz = abs($tz); 117 $tz = (($tz - ($tz%3600) )/3600)*100 + ($tz%3600)/60; // fixed tz bug 118 $result = sprintf("%s %s%04d", date('D, j M Y H:i:s'), $tzs, $tz); 119 120 return $result; 121 } 122 123 /** 124 * Sends this mail. 125 * 126 * This function has been overridden to facilitate unit testing. 127 * 128 * @return bool 129 */ 130 public function postSend() { 131 // Now ask phpunit if it wants to catch this message. 132 if (PHPUNIT_TEST) { 133 if (!phpunit_util::is_redirecting_phpmailer()) { 134 debugging('Unit tests must not send real emails! Use $this->redirectEmails()'); 135 return true; 136 } 137 $mail = new stdClass(); 138 $mail->header = $this->MIMEHeader; 139 $mail->body = $this->MIMEBody; 140 $mail->subject = $this->Subject; 141 $mail->from = $this->From; 142 $mail->to = $this->to[0][0]; 143 phpunit_util::phpmailer_sent($mail); 144 return true; 145 } else { 146 return parent::postSend(); 147 } 148 } 149 150 /** 151 * Config the PHPMailer to use OAUTH if necessary. 152 */ 153 private function process_oauth(): void { 154 global $CFG; 155 156 require_once($CFG->libdir . '/phpmailer/moodle_phpmailer_oauth.php'); 157 if (!empty($CFG->smtpoauthservice)) { 158 // Get the issuer. 159 $issuer = \core\oauth2\api::get_issuer($CFG->smtpoauthservice); 160 // Validate the issuer and check if it is enabled or not. 161 if ($issuer && $issuer->get('enabled')) { 162 // Get the OAuth Client. 163 if ($oauthclient = \core\oauth2\api::get_system_oauth_client($issuer)) { 164 $oauth = new moodle_phpmailer_oauth([ 165 'provider' => $oauthclient, 166 'clientId' => $oauthclient->get_clientid(), 167 'clientSecret' => $oauthclient->get_clientsecret(), 168 'refreshToken' => $oauthclient->get_refresh_token(), 169 'userName' => $CFG->smtpuser, 170 ]); 171 // Set the OAuth. 172 $this->setOAuth($oauth); 173 } 174 } 175 } 176 } 177 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body