• tp5.1 使用 phpmailer 发送电子邮件


    tp5.1 使用 phpmailer 发送电子邮件

    简介

    phpMailer 是一个非常强大的php发送邮件类,可以设定发送邮件地址、回复地址、邮件主题、html网页,上传附件,并且使用起来非常方便。

    github:https://github.com/PHPMailer/PHPMailer/

    phpMailer 的特点:

    • 在邮件中包含多个 TO、CC、BCC 和 REPLY-TO。
    • 平台应用广泛,支持的 SMTP 服务器包括 Sendmail、qmail、Postfix、Gmail、Imail、Exchange 等等。
    • 支持嵌入图像,附件,HTML 邮件。
    • 可靠的强大的调试功能。
    • 支持 SMTP 认证。
    • 自定义邮件头。
    • 支持 8bit、base64、binary 和 quoted-printable 编码。

    安装

    使用 composer 安装:

    composer require phpmailer/phpmailer
    

    邮件服务配置

    发送之前需要拥有自己的邮件服务器,测试的时候其实用自己申请的免费邮箱最方便了,不需要自己再搭建服务器了,可能要配置邮箱的SMTP服务,大部分公共邮箱(163、qq等)为了安全默认是关闭的。

    网易邮箱配置如下图:

    img

    QQ 邮箱相关配置如下图:

    邮箱 POP3服务器(端口995) SMTP服务器(端口465或587)
    qq.com pop.qq.com smtp.qq.com

    这里以163邮箱配置作为示例

    设置邮箱客户端授权码

    找到设置

    image-20201230153656571

    开启服务

    image-20201230153831839

    开启服务器之后会有显示,注意授权码只显示一次,开启过程中注意保存

    image-20201230154401620

    对PHPMailer类库使用进行封装

    在extends下 创建mailMail.php

    image-20201230160914874

    文件内容如下

    <?php
    namespace mail;
    
    //引入邮件类,tp5.1只要有命名空间会自动加载
    use PHPMailerPHPMailerPHPMailer;
    
    class Mail
    {
        //服务器配置,一般是默认配置
        private $CharSet ="UTF-8";                     //设定邮件编码
        private $SMTPDebug = 0;                        // 调试模式输出
        private $isSMTP = true;                        // 使用SMTP
        private $Host = 'smtp.163.com';                // SMTP服务器
        private $SMTPAuth = true;                      // 允许 SMTP 认证
        private $Username = '邮箱用户名';                // SMTP 用户名  即邮箱的用户名
        private $Password = '密码或者授权码';             // SMTP 密码  部分邮箱是授权码(例如163邮箱)
        private $SMTPSecure = 'ssl';                    // 允许 TLS 或者ssl协议
        private $Port = 465;                            // 服务器端口 25 或者465 具体要看邮箱服务器支持
        //修改成自己的邮箱
        private $From = 'xxx@163.com';           		//发件人邮箱
        private $FromName = 'makalo';                   //发件人的用户昵称
    
    
        //邮件对象
        private $mail;
    
        //一般只有用户名和密码还有端口会变动,所以这三个参数可以创建对象动态指定,也可以直接写死
        public function __construct($Username = '', $Password = '', $Port = ''){
            if(!empty($Username)){
                $this->Username = $Username;
            }
            if(!empty($Password)){
                $this->Password = $Password;
            }
            if(!empty($Port)){
                $this->Port = $Port;
            }
    
            //为true表示启用异常
            $mail =  new PHPMailer(true);
            //服务器配置
            $mail->CharSet = $this->CharSet;                     //设定邮件编码
            $mail->SMTPDebug = $this->SMTPDebug;                 // 调试模式输出
            if($this->isSMTP === true){
                $mail->isSMTP();                                 // 使用SMTP
            }
            $mail->Host = $this->Host;                           // SMTP服务器
            $mail->SMTPAuth = $this->SMTPAuth;                   // 允许 SMTP 认证
            $mail->Username = $this->Username;                   // SMTP 用户名  即邮箱的用户名
            $mail->Password = $this->Password;                   // SMTP 密码  部分邮箱是授权码(例如163邮箱)
            $mail->SMTPSecure = $this->SMTPSecure;               // 允许 TLS 或者ssl协议
            $mail->Port = $this->Port;                           // 服务器端口 25 或者465 具体要看邮箱服务器支持
            $mail->setFrom($this->From, $this->FromName);        //发件人
    
            $this->mail = $mail;
        }
    
        /**
         * 发送邮件
         * @param array $sendAddress 收件人地址数组, 如果为单值数组则只写入收件地址,如果为键值数组则还写入收件人名称
         * @param array $Attachment 附件数组,如果为单值数组则为添加附件,如果为键值数组则添加附件并且重命名
         * @param bool $isHtml 是否以html文档格式发送
         * @param string $Subject 邮件主题
         * @param string $Body 邮件内容,如果以html格式可以写入html
         * @param string $AltBody 如果为单值数组则只写入收件地址,如果为键值数组则还写入收件人名称
         * @param array $CC 抄送地址数组, 如果为单值数组则只写入收件地址,如果为键值数组则还写入收件人名称
         * @param array $BCC 密送地址数组,如果为单值数组则只写入收件地址,如果为键值数组则还写入收件人名称
         * @return bool 是否发送成功
         */
        public function sendEMail($sendAddress = [],$Subject  = '', $Body = '', $AltBody = '', $Attachment = [] ,$isHtml = true,$CC = [], $BCC = []){
            try {
                //必填参数校验
                if(empty($sendAddress) || empty($Subject) || empty($Body)){
                    return false;
                }
                //收件人
                foreach ($sendAddress as $key => $value) {
                    if (is_int($key)) {
                        // 处理单值
                        $this->mail->addAddress($value);
                    } else {
                        // 处理键值
                        $this->mail->addAddress($value, $key);
                    }
                }
                //附件
                if(!empty($Attachment)){
                    foreach ($Attachment as $key => $value) {
                        if (is_int($key)) {
                            // 处理单值
                            $this->mail->addAttachment($value);
                        } else {
                            // 处理键值
                            $this->mail->addAttachment($value, $key);
                        }
                    }
                }
                //抄送
                if(!empty($CC)){
                    //抄送不为空
                    foreach ($CC as $key => $value) {
                        if (is_int($key)) {
                            // 处理单值
                            $this->mail->addCC($value);
                        } else {
                            // 处理键值
                            $this->mail->addCC($value, $key);
                        }
                    }
                }
                //密送
                if(!empty($BCC)){
                    //密送不为空
                    foreach ($BCC as $key => $value) {
                        if (is_int($key)) {
                            // 处理单值
                            $this->mail->addBCC($value);
                        } else {
                            // 处理键值
                            $this->mail->addBCC($value, $key);
                        }
                    }
                }
    
                //回复的时候回复给哪个邮箱 建议和发件人一致
                $this->mail->addReplyTo($this->From, $this->FromName);
    
                //Content
                // 是否以HTML文档格式发送  发送后客户端可直接显示对应HTML内容
                $this->mail->isHTML($isHtml);
                //邮件主题
                $this->mail->Subject = $Subject;
                //邮件内容
                $this->mail->Body    = $Body;
                //如果邮件客户端不支持HTML则显示此内容
                $this->mail->AltBody = $AltBody;
    
                //发送
                $this->mail->send();
                return true;
            } catch (Exception $e) {
                echo '邮件发送失败: ', $this->mail->ErrorInfo;
                return false;
            }
        }
    }
    

    测试

    不带附件

    //不带附件
    Route::any('test24', function (){
        $mail = new Mail('makaloxx@163.com', 'EKYBQxxxANDPISHR');
        $res = $mail->sendEMail(['makaloxxx@foxmail.com'], '测试邮件主题'. time(), '<h1>这里是邮件内容</h1>' . date('Y-m-d H:i:s'),'如果邮件客户端不支持HTML则显示此内容');
        dump($res);
    });
    

    结果

    image-20201230161139236

    带附件

    //带附件
    Route::any('test25', function (){
        $mail = new Mail('makaloxxx@163.com', 'EKYBxxxPISHR');
    
        $Attachment = [
            //直接添加附件
            Env::get("root_path") . "test.png",
            //添加附件并重命名
            'change_name.png' => Env::get("root_path") . "test.png"
        ];
    
        $res = $mail->sendEMail(
            ['makalochen@foxmail.com'], '测试邮件主题'. time(),
            '<h1>这里是邮件内容</h1>' . date('Y-m-d H:i:s'),
            '如果邮件客户端不支持HTML则显示此内容',
            $Attachment
        );
        dump($res);
    });
    

    效果

    image-20201230162105468

    参考:https://www.runoob.com/w3cnote/php-phpmailer.html

  • 相关阅读:
    查询数据库版本
    Appscan的安装破解以及使用
    jmeter接口性能测试【CSV文件读取+接口关联+设置集合点】
    常用命令记录
    jmeter接口自动化-通过csv文件读取用例并执行测试
    js函数
    js数据类型及方法
    初识js(第一篇)
    一个人记笔记多没意思啊,拿出来分享一下咯
    博客园设置访问数量统计-小试牛刀
  • 原文地址:https://www.cnblogs.com/makalochen/p/14212133.html
Copyright © 2020-2023  润新知