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

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

简介

phpMailer 是一个非常强大的 ph p发送邮件类,可以设定发送邮件地址、回复地址、邮件主题、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等)为了安全默认是关闭的。

网易邮箱配置如下图:

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

QQ 邮箱相关配置如下图:

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

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

设置邮箱客户端授权码

找到设置

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

开启服务

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

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

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

对PHPMailer类库使用进行封装

在extends下 创建\mail\Mail.php

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

文件内容如下

<?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 ($CC 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);
});

结果

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

带附件

//带附件
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);
});

效果

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

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

上一篇:PHP邮件发送:PHPMailer


下一篇:VulnHub-Raven: 2 靶场渗透测试