makalochen

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下 创建\mail\Mail.php

image-20201230160914874

文件内容如下

<?php
namespace mail;

//引入邮件类,tp5.1只要有命名空间会自动加载
use PHPMailer\PHPMailer\PHPMailer;

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

分类:

技术点:

相关文章: