| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 | <?phpnamespace 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;    }}
 |