From 290bfc4f7544b0f99b717fb9d8d445bfcba73e87 Mon Sep 17 00:00:00 2001 From: Karson <karsonzhang@163.com> Date: Fri, 6 Mar 2020 14:32:41 +0800 Subject: [PATCH] 新增邮件抄送、附件方法 更新PHPMailer到6.0版本 --- application/common/library/Email.php | 149 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------------------------------- composer.json | 2 +- 2 files changed, 98 insertions(+), 53 deletions(-) diff --git a/application/common/library/Email.php b/application/common/library/Email.php index bb236fe..81b53b3 100644 --- a/application/common/library/Email.php +++ b/application/common/library/Email.php @@ -27,7 +27,7 @@ class Email */ public $options = [ 'charset' => 'utf-8', //编码格式 - 'debug' => 0, //调式模式 + 'debug' => false, //调式模式 ]; /** @@ -55,14 +55,17 @@ class Email $this->options = array_merge($this->options, $config); } $this->options = array_merge($this->options, $options); - vendor('phpmailer.phpmailer.PHPMailerAutoload'); $securArr = [1 => 'tls', 2 => 'ssl']; - $this->mail = new \PHPMailer(true); + $this->mail = new \PHPMailer\PHPMailer\PHPMailer(true); $this->mail->CharSet = $this->options['charset']; - $this->mail->SMTPDebug = $this->options['debug']; - $this->mail->isSMTP(); - $this->mail->SMTPAuth = true; + if ($this->options['mail_type'] == 1) { + $this->mail->SMTPDebug = $this->options['debug']; + $this->mail->isSMTP(); + $this->mail->SMTPAuth = true; + } else { + $this->mail->isMail(); + } $this->mail->Host = $this->options['mail_smtp_host']; $this->mail->Username = $this->options['mail_from']; $this->mail->Password = $this->options['mail_smtp_pass']; @@ -75,55 +78,118 @@ class Email /** * 设置邮件主题 - * @param string $subject + * @param string $subject 邮件主题 * @return $this */ public function subject($subject) { - $this->options['subject'] = $subject; + $this->mail->Subject = $subject; return $this; } /** * 设置发件人 - * @param string $email - * @param string $name + * @param string $email 发件人邮箱 + * @param string $name 发件人名称 * @return $this */ public function from($email, $name = '') { - $this->options['from'] = $email; - $this->options['from_name'] = $name; + $this->mail->setFrom($email, $name); return $this; } /** * 设置收件人 - * @param string $email - * @param string $name + * @param mixed $email 收件人,多个收件人以,进行分隔 + * @param string $name 收件人名称 * @return $this */ public function to($email, $name = '') { - $this->options['to'] = $email; - $this->options['to_name'] = $name; + $emailArr = $this->buildAddress($email); + foreach ($emailArr as $address => $name) { + $this->mail->addAddress($address, $name); + } + + return $this; + } + + /** + * 设置抄送 + * @param mixed $email 收件人,多个收件人以,进行分隔 + * @param string $name 收件人名称 + * @return Email + */ + public function cc($email, $name = '') + { + $emailArr = $this->buildAddress($email); + foreach ($emailArr as $address => $name) { + $this->mail->addCC($address, $name); + } + return $this; + } + + /** + * 设置密送 + * @param mixed $email 收件人,多个收件人以,进行分隔 + * @param string $name 收件人名称 + * @return Email + */ + public function bcc($email, $name = '') + { + $emailArr = $this->buildAddress($email); + foreach ($emailArr as $address => $name) { + $this->mail->addBCC($address, $name); + } return $this; } /** * 设置邮件正文 - * @param string $body - * @param boolean $ishtml + * @param string $body 邮件下方 + * @param boolean $ishtml 是否HTML格式 * @return $this */ public function message($body, $ishtml = true) { - $this->options['body'] = $body; - $this->options['ishtml'] = $ishtml; + if ($ishtml) { + $this->mail->msgHTML($body); + } else { + $this->mail->Body = $body; + } return $this; } /** + * 添加附件 + * @param string $path 附件路径 + * @param string $name 附件名称 + * @return Email + */ + public function attachment($path, $name = '') + { + $this->mail->addAttachment($path, $name); + return $this; + } + + /** + * 构建Email地址 + * @param mixed $emails Email数据 + * @return array + */ + protected function buildAddress($emails) + { + $emails = is_array($emails) ? $emails : explode(',', str_replace(";", ",", $emails)); + $result = []; + foreach ($emails as $key => $value) { + $email = is_numeric($key) ? $value : $key; + $result[$email] = is_numeric($key) ? "" : $value; + } + return $result; + } + + /** * 获取最后产生的错误 * @return string */ @@ -148,38 +214,17 @@ class Email public function send() { $result = false; - switch ($this->options['mail_type']) { - case 1: - //使用phpmailer发送 - $this->mail->setFrom($this->options['from'], $this->options['from_name']); - $this->mail->addAddress($this->options['to'], $this->options['to_name']); - $this->mail->Subject = $this->options['subject']; - if ($this->options['ishtml']) { - $this->mail->msgHTML($this->options['body']); - } else { - $this->mail->Body = $this->options['body']; - } - try { - $result = $this->mail->send(); - } catch (\phpmailerException $e) { - $this->setError($e->getMessage()); - } - - $this->setError($result ? '' : $this->mail->ErrorInfo); - break; - case 2: - //使用mail方法发送邮件 - $headers = 'MIME-Version: 1.0' . "\r\n"; - $headers .= "Content-type: text/html; charset=" . $this->options['charset'] . "\r\n"; - $headers .= "To: {$this->options['to_name']} <{$this->options['to']}>\r\n"; //收件人 - $headers .= "From: {$this->options['from_name']} <{$this->options['from']}>\r\n"; //发件人 - $result = mail($this->options['to'], $this->options['subject'], $this->options['body'], $headers); - $this->setError($result ? '' : error_get_last()['message']); - break; - default: - //邮件功能已关闭 - $this->setError(__('Mail already closed')); - break; + if (in_array($this->options['mail_type'], [1, 2])) { + try { + $result = $this->mail->send(); + } catch (\PHPMailer\PHPMailer\Exception $e) { + $this->setError($e->getMessage()); + } + + $this->setError($result ? '' : $this->mail->ErrorInfo); + } else { + //邮件功能已关闭 + $this->setError(__('Mail already closed')); } return $result; } diff --git a/composer.json b/composer.json index 39a4fab..e36b911 100755 --- a/composer.json +++ b/composer.json @@ -21,7 +21,7 @@ "endroid/qr-code": "^1.9", "topthink/think-captcha": "^1.0", "mtdowling/cron-expression": "^1.2", - "phpmailer/phpmailer": "^5.2", + "phpmailer/phpmailer": "~6.0.6", "karsonzhang/fastadmin-addons": "~1.1.9", "overtrue/pinyin": "~3.0", "phpoffice/phpspreadsheet": "^1.2" -- libgit2 0.24.0