| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 | 
							- <?php
 
- namespace app\common\library;
 
- use think\Config;
 
- use Tx\Mailer;
 
- use Tx\Mailer\Exceptions\CodeException;
 
- use Tx\Mailer\Exceptions\SendException;
 
- class Email
 
- {
 
-     /**
 
-      * 单例对象
 
-      */
 
-     protected static $instance;
 
-     /**
 
-      * phpmailer对象
 
-      */
 
-     protected $mail = null;
 
-     /**
 
-      * 错误内容
 
-      */
 
-     protected $error = '';
 
-     /**
 
-      * 默认配置
 
-      */
 
-     public $options = [
 
-         'charset'   => 'utf-8', //编码格式
 
-         'debug'     => false, //调式模式
 
-         'mail_type' => 0, //状态
 
-     ];
 
-     /**
 
-      * 初始化
 
-      * @access public
 
-      * @param array $options 参数
 
-      * @return Email
 
-      */
 
-     public static function instance($options = [])
 
-     {
 
-         if (is_null(self::$instance)) {
 
-             self::$instance = new static($options);
 
-         }
 
-         return self::$instance;
 
-     }
 
-     /**
 
-      * 构造函数
 
-      * @param array $options
 
-      */
 
-     public function __construct($options = [])
 
-     {
 
-         if ($config = Config::get('site')) {
 
-             $this->options = array_merge($this->options, $config);
 
-         }
 
-         $this->options = array_merge($this->options, $options);
 
-         $secureArr = [0 => '', 1 => 'tls', 2 => 'ssl'];
 
-         $secure = $secureArr[$this->options['mail_verify_type']] ?? '';
 
-         $logger = isset($this->options['debug']) && $this->options['debug'] ? new Log : null;
 
-         $this->mail = new Mailer($logger);
 
-         $this->mail->setServer($this->options['mail_smtp_host'], $this->options['mail_smtp_port'], $secure);
 
-         $this->mail->setAuth($this->options['mail_from'], $this->options['mail_smtp_pass']);
 
-         //设置发件人
 
-         $this->from($this->options['mail_from'], $this->options['mail_smtp_user']);
 
-     }
 
-     /**
 
-      * 设置邮件主题
 
-      * @param string $subject 邮件主题
 
-      * @return $this
 
-      */
 
-     public function subject($subject)
 
-     {
 
-         $this->mail->setSubject($subject);
 
-         return $this;
 
-     }
 
-     /**
 
-      * 设置发件人
 
-      * @param string $email 发件人邮箱
 
-      * @param string $name  发件人名称
 
-      * @return $this
 
-      */
 
-     public function from($email, $name = '')
 
-     {
 
-         $this->mail->setFrom($name, $email);
 
-         return $this;
 
-     }
 
-     /**
 
-      * 设置收件人
 
-      * @param mixed $email 收件人,多个收件人以,进行分隔
 
-      * @return $this
 
-      */
 
-     public function to($email)
 
-     {
 
-         $emailArr = $this->buildAddress($email);
 
-         foreach ($emailArr as $address => $name) {
 
-             $this->mail->addTo($name, $address);
 
-         }
 
-         return $this;
 
-     }
 
-     /**
 
-      * 设置抄送
 
-      * @param mixed  $email 收件人,多个收件人以,进行分隔
 
-      * @param string $name  收件人名称
 
-      * @return Email
 
-      */
 
-     public function cc($email, $name = '')
 
-     {
 
-         $emailArr = $this->buildAddress($email);
 
-         if (count($emailArr) == 1 && $name) {
 
-             $emailArr[key($emailArr)] = $name;
 
-         }
 
-         foreach ($emailArr as $address => $name) {
 
-             $this->mail->addCC($name, $address);
 
-         }
 
-         return $this;
 
-     }
 
-     /**
 
-      * 设置密送
 
-      * @param mixed  $email 收件人,多个收件人以,进行分隔
 
-      * @param string $name  收件人名称
 
-      * @return Email
 
-      */
 
-     public function bcc($email, $name = '')
 
-     {
 
-         $emailArr = $this->buildAddress($email);
 
-         if (count($emailArr) == 1 && $name) {
 
-             $emailArr[key($emailArr)] = $name;
 
-         }
 
-         foreach ($emailArr as $address => $name) {
 
-             $this->mail->addBCC($name, $address);
 
-         }
 
-         return $this;
 
-     }
 
-     /**
 
-      * 设置邮件正文
 
-      * @param string  $body   邮件下方
 
-      * @param boolean $ishtml 是否HTML格式
 
-      * @return $this
 
-      */
 
-     public function message($body, $ishtml = true)
 
-     {
 
-         $this->mail->setBody($body);
 
-         return $this;
 
-     }
 
-     /**
 
-      * 添加附件
 
-      * @param string $path 附件路径
 
-      * @param string $name 附件名称
 
-      * @return Email
 
-      */
 
-     public function attachment($path, $name = '')
 
-     {
 
-         $this->mail->addAttachment($name, $path);
 
-         return $this;
 
-     }
 
-     /**
 
-      * 构建Email地址
 
-      * @param mixed $emails Email数据
 
-      * @return array
 
-      */
 
-     protected function buildAddress($emails)
 
-     {
 
-         if (!is_array($emails)) {
 
-             $emails = array_flip(explode(',', str_replace(";", ",", $emails)));
 
-             foreach ($emails as $key => $value) {
 
-                 $emails[$key] = strstr($key, '@', true);
 
-             }
 
-         }
 
-         return $emails;
 
-     }
 
-     /**
 
-      * 获取最后产生的错误
 
-      * @return string
 
-      */
 
-     public function getError()
 
-     {
 
-         return $this->error;
 
-     }
 
-     /**
 
-      * 设置错误
 
-      * @param string $error 信息信息
 
-      */
 
-     protected function setError($error)
 
-     {
 
-         $this->error = $error;
 
-     }
 
-     /**
 
-      * 发送邮件
 
-      * @return boolean
 
-      */
 
-     public function send()
 
-     {
 
-         $result = false;
 
-         if (in_array($this->options['mail_type'], [1, 2])) {
 
-             try {
 
-                 $result = $this->mail->send();
 
-             } catch (SendException $e) {
 
-                 $this->setError($e->getCode() . $e->getMessage());
 
-             } catch (CodeException $e) {
 
-                 preg_match_all("/Expected: (\d+)\, Got: (\d+)( \| (.*))?\$/i", $e->getMessage(), $matches);
 
-                 $code = $matches[2][0] ?? 0;
 
-                 $message = isset($matches[2][0]) && isset($matches[4][0]) ? $matches[4][0] : $e->getMessage();
 
-                 $message = mb_convert_encoding($message, 'UTF-8', 'GBK,GB2312,BIG5');
 
-                 $this->setError($message);
 
-             } catch (\Exception $e) {
 
-                 $this->setError($e->getMessage());
 
-             }
 
-             $this->setError($result ? '' : $this->getError());
 
-         } else {
 
-             //邮件功能已关闭
 
-             $this->setError(__('Mail already closed'));
 
-         }
 
-         return $result;
 
-     }
 
- }
 
 
  |