群控系统服务端开发模式-应用开发-邮件发送工具类

一、邮件发送工具类开发

        1、添加框架对应的SDK

composer require phpmailer/phpmailer

        2、添加工具集

                在根目录下extend文件夹下创建Email文件夹,在Email文件夹下添加工具集控制并命名为EmailSender.php

<?php
/**
 * 邮件发送工具
 * User: 龙哥·三年风水
 * Date: 2024/12/9
 * Time: 10:20
 */
namespace Email;
use Error\BaseError;
use PHPMailer\PHPMailer\PHPMailer;
use app\model\param\Mail;
class EmailSender
{
    protected static $host = '';// 发送人的SMTP服务器地址
    protected static $charSet = 'utf8';// 编码格式为utf8,不设置编码的话,中文会出现乱码
    protected static $account = '';// 发件人账号
    protected static $username = '杭州安巽';// 发件人名称
    protected static $password = '';// 发送方的邮箱密码,注意这里填写的是“客户端授权密码”而不是邮箱的登录密码!
    protected static $stmpSecure = '';// 使用ssl协议方式
    protected static $port = 0;// ssl协议方式端口号是465
    protected static $phpMailer = null;// 邮件发送客户端
    // 初始化数据
    public function __construct(){
        $res = Mail::dataFind(['id' => 2],'username,smtp_address,smtp_port,smtp_password,smtp_protocol,status',true);
        if(empty($res))throw new BaseError("未开启微软邮件发送通道",50000,200);
        if($res['status'] == 0)throw new BaseError("微软邮件发送通道已被禁用",50000,200);
        self::$host = $res['smtp_address'];
        self::$port = $res['smtp_port'];
        self::$password = $res['smtp_password'];
        self::$stmpSecure = $res['smtp_protocol'];
        self::$account = $res['username'];
        self::$phpMailer = new PHPMailer(true);
    }

    /**
     * 单条发送邮件
     * User: 龙哥·三年风水
     * Date: 2024/12/9
     * Time: 10:25
     * @ param $recipient
     * @ param $emailSubject
     * @ param $emailContent
     * @ param string $emailAttachment
     * @ return bool
     * @ throws \PHPMailer\PHPMailer\Exception
     */

    public static function send($recipient, $emailSubject, $emailContent, $emailAttachment = ''){
        if(empty($recipient) || empty($emailSubject) || empty($emailContent))throw new BaseError('邮件参数必须传',50000,200);
        if(is_array($recipient) && count($recipient) >= 0)throw new BaseError('接收人只能是字符串方式',50000,200);
        self::$phpMailer->isSMTP();// 使用SMTP服务
        self::$phpMailer->CharSet = self::$charSet;// 编码格式为utf8,不设置编码的话,中文会出现乱码
        self::$phpMailer->Host = self::$host;// 发送人的SMTP服务器地址
        self::$phpMailer->SMTPAuth = true;// 是否使用身份验证
        self::$phpMailer->Username = self::$account;// SMTP账号
        self::$phpMailer->Password = self::$password;// SMTP密码
        self::$phpMailer->SMTPSecure = self::$stmpSecure;// 使用ssl协议方式
        self::$phpMailer->Port = self::$port;// ssl协议方式端口号是465
        self::$phpMailer->setFrom(self::$account,self::$username);// 设置发件人信息,如邮件格式说明中的发件人,这里会显示为
        self::$phpMailer->addAddress($recipient,$emailSubject);// 设置收件人信息,如邮件格式说明中的收件人
        if(!empty($emailAttachment))self::$phpMailer->addAttachment($emailAttachment);// 添加附件
        self::$phpMailer->isHTML(true);
        self::$phpMailer->Subject = $emailSubject;
        self::$phpMailer->Body = $emailContent;
        if(self::$phpMailer->send() == false)throw new BaseError("邮件发送失败:".self::$phpMailer->ErrorInfo,50000,200);
        return true;
    }

    /**
     * 批量发送邮件
     * User: 龙哥·三年风水
     * Date: 2024/12/9
     * Time: 10:29
     * @ param $recipient
     * @ param $emailSubject
     * @ param $emailContent
     * @ param string $emailAttachment
     */

    public static function batchSend($recipients, $emailSubject, $emailContent, $emailAttachment = ''){
        if(empty($recipients) || empty($emailSubject) || empty($emailContent))throw new BaseError('邮件参数必须传',50000,200);
        if(!is_array($recipients) && count($recipients) == 0)throw new BaseError('邮件必须是数组格式',50000,200);
        self::$phpMailer->isSMTP();// 使用SMTP服务
        self::$phpMailer->CharSet = self::$charSet;// 编码格式为utf8,不设置编码的话,中文会出现乱码
        self::$phpMailer->Host = self::$host;// 发送人的SMTP服务器地址
        self::$phpMailer->SMTPAuth = true;// 是否使用身份验证
        self::$phpMailer->Username = self::$account;// SMTP账号
        self::$phpMailer->Password = self::$password;// SMTP密码
        self::$phpMailer->SMTPSecure = self::$stmpSecure;// 使用ssl协议方式
        self::$phpMailer->Port = self::$port;// ssl协议方式端口号是465
        self::$phpMailer->setFrom(self::$account,self::$username);// 设置发件人信息,如邮件格式说明中的发件人,这里会显示为
        if(!empty($emailAttachment))self::$phpMailer->addAttachment($emailAttachment);// 添加附件
        self::$phpMailer->isHTML(true);
        self::$phpMailer->Subject = $emailSubject;
        self::$phpMailer->Body = $emailContent;
        foreach ($recipients as $recipient){
            self::$phpMailer->addAddress($recipient,$emailSubject);// 设置收件人信息,如邮件格式说明中的收件人
            if(self::$phpMailer->send() == false)throw new BaseError("邮件发送失败:".self::$phpMailer->ErrorInfo,50000,200);
        }
        return true;
    }
}

二、测试

        1、单条发送

<?php
namespace app\controller;
use Email\EmailSender;
use Encipher\Encrypt;
use Mail\MailSenderFactory;
use Sms\SmsSenderFactory;

class Index extends Emptys
{
    public function index()
    {
        $emailSender = new EmailSender();
        $emailSender::send('1509454760@qq.com','运维发送','IP更改');
        return succ('操作成功');
    }
}

        2、批量发送

<?php
namespace app\controller;
use Email\EmailSender;
use Encipher\Encrypt;
use Mail\MailSenderFactory;
use Sms\SmsSenderFactory;

class Index extends Emptys
{
    public function index()
    {
        $emailSender = new EmailSender();
        $emailSender::batchSend(['1509454760@qq.com','2420095288@qq.com'],'运维发送','数据模式切换');
        return succ('操作成功');
    }
}

三、总结

        通过这5天的开发做出对比后,才发现,其实邮件发送功能只需要采用工具类形式开发就行。无需建立工厂开发模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/934177.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何在vue中使用ECharts

一. 打开ECharts官网,点击快速入门 下面是ECharts官网的链接 https://echarts.apache.org/ 二.在vue中使用 1.首先先引入Echarts js文件 如下图&#xff0c;下面的第一张图片是官网的实现&#xff0c;第二章图片是我根据官网的实现 2.给ECharts 创建一个DOM容器 3. 使用ec…

Java版-图论-拓扑排序与有向无环图

拓扑排序 拓扑排序说明 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列…

Nginx安装和配置详解

1.Nginx的安装 1.1运行以下脚本安装 yum install yum-utils -y rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm# 查看所有可安装nginx版本 yum --showduplicates list available nginx yum install nginx-1.24.0 -y …

Pytest测试框架

Pytest测试框架 测试用例发现规则 默认从当前或者指定文件夹下递归查找文件名以test_开头或者_test结尾的.py文件以Test 开头且&#xff08;不继承自 unittest.TestCase或者含有init方法的类&#xff09;的类函数名以 test_ 开头的测试用例方法 自定义测试用例发现规则 我们…

【OpenCV】图像阈值

简单阈值法 此方法是直截了当的。如果像素值大于阈值&#xff0c;则会被赋为一个值&#xff08;可能为白色&#xff09;&#xff0c;否则会赋为另一个值&#xff08;可能为黑色&#xff09;。使用的函数是 cv.threshold。第一个参数是源图像&#xff0c;它应该是灰度图像。第二…

idea压缩js,css

这是需要的jar包(文章顶部也可以下载) 地址:https://download.csdn.net/download/yuzheh521/90109966?spm1001.2101.3001.9500 压缩js arguments: -jar E:\swj\jar_packages\css_js_compress\yuicompressor-2.4.8.jar --type js --charset utf-8 $FilePath$ -o $FileNameWith…

css基础记录

基础 选择器 复合选择器 后代选择器 div p {}; 类似如上,找到div中所有的后代,注意是所有的后代 子代选择器 > div > a 只选择div的儿子中有a的 并集选择器 用逗号,分隔 p,div,span,h1 { … } 一般一行写一个 CSS元素显示模式 分为块元素,行内元素 块元素 特点…

【C++】LeetCode:LCR 078. 合并 K 个升序链表

题干&#xff1a; 给定一个链表数组&#xff0c;每个链表都已经按升序排列。 请将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 解法&#xff1a;优先队列 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *ne…

使用PHPUnit使用本地调试代替远程调试,快速提高开发效率

Laravel 是一个在 Linux 环境下表现非常出色的 PHP 框架&#xff0c;但它在 Windows 环境下可能会遇到一些兼容性和配置问题。为了调试或没试的方便可以在 Windows 环境下进行 Laravel PHPUnit进行本地调试和测试。 本地主要针对断点调试效果非常高效。 在 Laravel 中&#x…

【模型对比】ChatGPT vs Kimi vs 文心一言那个更好用?数据详细解析,找出最适合你的AI辅助工具!

在这个人工智能迅猛发展的时代&#xff0c;AI聊天助手已经深入我们的工作与生活。你是否曾在选择使用ChatGPT、Kimi或是百度的文心一言时感到一头雾水&#xff1f;每款AI都有其独特的魅力与优势&#xff0c;那么&#xff0c;究竟哪一款AI聊天助手最适合你呢&#xff1f;本文将带…

Spring Boot 性能提升的核武器,速度提升 500%!

虚拟线程是 Java 21 引入的一个新特性&#xff0c;用于简化并发编程。它与传统的操作系统线程相比&#xff0c;具有显著的优势&#xff1a; 轻量级&#xff1a;虚拟线程由 JVM 管理&#xff0c;而非操作系统&#xff0c;因此它们的内存占用和创建成本远低于传统线程。理论上&am…

Ubuntu下的gpt-sovits学习记录1:安装与测试

GitCode - 全球开发者的开源社区,开源代码托管平台 国内镜像点。 下载压包&#xff1a; 解压到没有中文名的文件夹内。如我 1.创建虚拟环境 conda create -n GPTSoVits python3.9 2.新建工程 3.部分环境 pip install -r requirements.txt 4.模型下载。建议直接下载上边的…

二叉树节点相关算法题|双分支节点个数|所有左叶子之和|每一层节点平均值(C)

双分支节点个数 假设二叉树采用二叉链表存储结构存储&#xff0c;试设计一个算法&#xff0c;计算一棵给定二叉树的所有双分支节点个数 算法思想 计算一棵二叉树中所有双分支节点个数的递归模型 若树为空&#xff0c;结果为0 若当前节点为双分支节点&#xff0c;递归左右孩子…

MySQL:表的内置函数

目录 一. 日期函数 二. 字符串函数 三. 数学函数​编辑 四. 其他函数 此篇博客讲解MySQL中关于表的内置函数。内置函数广泛用于数据库查询语句中。 一. 日期函数 例子一&#xff1a;创建一个样例表&#xff1a; 类似于隐式转换&#xff0c;虽然这样可以但是不建议。 …

Vue框架入门

Author&#xff1a;Dawn_T17?? 目录 什么是框架 一.Vue 的使用方向 二.Vue 框架的使用场景 &#xff08;TIP&#xff09;MVVM思想 三.Vue入门案例 TIP&#xff1a;插值表达式 四.Vue-指令? &#xff08;1&#xff09;v-bind 和 v-model? ? &#xff08;2&#x…

【OpenCV】图像转换

理论 傅立叶变换用于分析各种滤波器的频率特性。对于图像&#xff0c;使用 2D离散傅里叶变换&#xff08;DFT&#xff09; 查找频域。快速算法称为 快速傅立叶变换&#xff08;FFT&#xff09; 用于计算DFT。 Numpy中的傅立叶变换 首先&#xff0c;我们将看到如何使用Numpy查…

Nanolog起步笔记-10-log解压过程(4)寻找meta续2

Nanolog起步笔记-10-log解压过程4寻找meta续2 写在前面重新开始trace 写在前面 前面的工作&#xff0c;已做打下令人有信心的基础。 重新开始trace 之前我们起步就看到了 metadata &#xff0c;显然这前就已加载了。 所以&#xff0c;只需要重走一遍代码&#xff0c;就能得到…

Vue3+Node中使用webrtc推流至mediamtx

前言 项目的 Web 端是 Vue3 框架&#xff0c;后端是 GO 框架。需要实现将客户端的本地摄像头媒体流推送至服务端&#xff0c;而我自己从未有媒体流相关经验&#xff0c;最初 leader 让我尝试通过 RTSP 协议推拉流&#xff0c;我的思路就局限在了 RTSP 方向。 最初使用的服务端…

小程序IOS安全区域优化:safe-area-inset-bottom

ios下边有一个小黑线&#xff0c;位于底部的元素会被黑线阻挡 safe-area-inset-bottom 一 用法及作用&#xff1a; IOS全面屏底部有小黑线&#xff0c;位于底部的元素会被黑线阻挡&#xff0c;可以使用以下样式&#xff1a; .model{padding-bottom: constant(safe-area-ins…

NVR小程序接入平台EasyNVR国标协议接入无告警是什么原因?

在现代视频监控系统中&#xff0c;国标接入已成为一种重要的技术标准&#xff0c;尤其是在GB28181协议的推动下&#xff0c;这一标准被广泛应用于安防设备的统一接入和管理。国标接入不仅提高了设备间的互联互通能力&#xff0c;还为用户提供了更高效、更智能的视频监控解决方案…