异步发送邮件完整示例

异步发送邮件完整示例

大家好,又见面了,我是全栈君。

本章使用task异步进程进行邮件发送,来阐述一下以上章节提到的各个知识点。

邮件类

下载swiftmailer

composer require "swiftmailer/swiftmailer:^6.0"

Mailer.php 与 vender目录 同级

require_once __DIR__ . '/vendor/autoload.php';

class Mailer
{
    public $transport;
    public $mailer;
    /**
     * 发送邮件类 参数 $data 需要三个必填项 包括 邮件主题`$data['subject']`、接收邮件的人`$data['to']`和邮件内容 `$data['content']`
     * @param Array $data
     * @return bool $result 发送成功 or 失败
     */
    public function send($data)
    {
        $this->transport = (new Swift_SmtpTransport('smtp.qq.com', 25))
            ->setEncryption('tls')
            ->setUsername('bailangzhan@qq.com')
            ->setPassword('xxxxxx');
        $this->mailer = new Swift_Mailer($this->transport);

        $message = (new Swift_Message($data['subject']))
            ->setFrom(array('bailangzhan@qq.com' => '白狼栈'))
            ->setTo(array($data['to']))
            ->setBody($data['content']);
            
        $result = $this->mailer->send($message);

        // 释放
        $this->destroy();
        return $result;
    }
    public function destroy()
    {
        $this->transport = null;
        $this->mailer = null;
    }
}

Server

后端启动:php server.php
这里单独拆分了一个TaskRun类,并且在onWorkerStart之后进行载入,主要是为了之后的“平滑重启“

class TaskServer
{
    private $_serv;
    private $_run;

    public function __construct()
    {
        $this->_serv = new Swoole\Server("127.0.0.1", 9501);
        $this->_serv->set([
            'worker_num' => 2,
            'daemonize' => false,    //是否开启守护进程
            'log_file' => __DIR__ . '/server.log',    //守护进程调试日志
            'task_worker_num' => 2,
            'max_request' => 5000,    //防止内存泄漏
            'task_max_request' => 5000,    //防止内存泄漏
            'package_eof' => "\r\n", //设置EOF
            'open_eof_split' => true, // 自动分包
        ]);
        $this->_serv->on('Connect', [$this, 'onConnect']);
        $this->_serv->on('Receive', [$this, 'onReceive']);
        $this->_serv->on('WorkerStart', [$this, 'onWorkerStart']);
        $this->_serv->on('Task', [$this, 'onTask']);
        $this->_serv->on('Finish', [$this, 'onFinish']);
        $this->_serv->on('Close', [$this, 'onClose']);
    }
    public function onConnect($serv, $fd, $fromId)
    {
    }
    public function onWorkerStart($serv, $workerId)
    {
        require_once __DIR__ . "/TaskRun.php";
        $this->_run = new TaskRun;
    }
    public function onReceive($serv, $fd, $fromId, $data)
    {
        $data = $this->unpack($data);
        $this->_run->receive($serv, $fd, $fromId, $data);
        // 投递一个任务到task进程中
        if (!empty($data['event'])) {
            $serv->task(array_merge($data , ['fd' => $fd]));
        }
    }
    public function onTask($serv, $taskId, $fromId, $data)
    {
        $this->_run->task($serv, $taskId, $fromId, $data);
    }
    public function onFinish($serv, $taskId, $data)
    {
        $this->_run->finish($serv, $taskId, $data);
    }
    public function onClose($serv, $fd, $fromId)
    {
    }
    /**
    * 对数据包单独处理,数据包经过`json_decode`处理之后,只能是数组
    * @param $data
    * @return bool|mixed
    */
    public function unpack($data)
    {
        $data = str_replace("\r\n", '', $data);
        if (!$data) {
            return false;
        }
        $data = json_decode($data, true);
        if (!$data || !is_array($data)) {
            return false;
        }
        return $data;
    }
    public function start()
    {
        $this->_serv->start();
    }
}
$reload = new TaskServer;
$reload->start();

TaskRun 业务类

当此处修改了代码后,可以进行平滑重启,因为他是在Server端的onWorkerStart之后加载的文件。

require_once ('./Mailer.php');
class TaskRun
{
    public function receive($serv, $fd, $fromId, $data)
    {
    }
    public function task($serv, $taskId, $fromId, $data)
    {
        try {
            switch ($data['event']) {
                case 'send-mail':
                    $mailer = new Mailer;
                    $result = $mailer->send($data);
                    break;
                default:
                    break;
            }
            return $result;
        } catch (\Exception $e) {
            throw new \Exception('task exception :' . $e->getMessage());
        }
    }
    public function finish($serv, $taskId, $data)
    {
        return true;
    }
}

Client

client加了eof,为了防止粘包,通过网址访问该程序

$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_SYNC);

$client->connect('127.0.0.1', 9501) || exit("connect failed. Error: {$client->errCode}\n");

$data = [
    'event' => 'send-mail',
    'to' => '5566***@qq.com',
    'subject' => 'just a test',
    'content' => 'This just a test.',
];

$client->send(togetherDataByEof($data));    //发送数据给服务端

$client->close();   //关闭连接

/**
 * 数据末尾拼接EOF标记
 * @param Array $data 要处理的数据
 * @return String json_encode($data) . EOF
 */
function togetherDataByEof($data)
{
    if (!is_array($data)) {
        return false;
    }
    return json_encode($data) . "\r\n";
}

异步发送邮件完整示例

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111876.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 机器学习算法——线性回归(超级详细且通俗)

    机器学习算法——线性回归(超级详细且通俗)通俗理解线性回归回归分析什么是回归分析呢?这是一个来自统计学的概念。回归分析是指一种预测性的建模技术,主要是研究自变量和因变量的关系。通常使用线/曲线来拟合数据点,然后研究如何使曲线到数据点的距离差异最小。例如,存在以下数据然后我们拟合一条曲线f(x):回归分析的目标就是要拟合一条曲线,让图中红色线段加起来的和最小。线性回归(简介)线性回归是回归分析的一种。假设目标值(因变量)与特征值(自变量)之间线性相关(即满足一个多元一次方程,如:f(x)=w1x1+…+wnxn+b.)。然后构

    2022年8月21日
    5
  • C# Modbus 通讯

    C# Modbus 通讯SpSetup类与Globalspace类publicpartialclassSpSetup:Form{#region定义变量///<summary>///发送报文///</summary>publicbyte[]sendData=ne…

    2022年7月12日
    14
  • 电脑虚拟ip地址怎么弄_虚拟服务器内部端口和外部端口

    电脑虚拟ip地址怎么弄_虚拟服务器内部端口和外部端口写在前面最近,有位小伙伴为了实现Nginx的高可用,在自己的服务器上搭建了一套Nginx集群,Nginx节点的服务器总共有3台。那么问题来了:如何对外只使用一个IP地址,通过某种策略来访问三个服务器节点上的Nginx?答案就是:可以使用虚拟IP来实现!那么,如何在服务器上添加虚拟IP?今天,我们就一起实操在服务器上添加虚拟IP。实战内容这里我们创建两个虚拟机环境,IP地址分别为192.168.20…

    2022年10月12日
    0
  • 旋转编码器工作原理图_编码器工作原理图解

    旋转编码器工作原理图_编码器工作原理图解一、旋转编码器的原理和特点:旋转编码器是集光机电技术于一体的速度位移传感器。当旋转编码器轴带动光栅盘旋转时,经发光元件发出的光被光栅盘狭缝切割成断续光线,并被接收元件接收产生初始信号。该信号经后继电路处理后,输出脉冲或代码信号。其特点是体积小,重量轻,品种多,功能全,频响高,分辨能力高,力矩小,耗能低,性能稳定,可靠使用寿命长等特点。1、增量式编码器增量…

    2022年10月1日
    0
  • Socketpair 简介「建议收藏」

    Socketpair 简介「建议收藏」socketpair-aslightgeneralizationofpipesusedfortwo-waystreamcommunication.以下内容来自:匠意雕码http://my.oschina.net/zengsai/blog/12583

    2022年10月14日
    0
  • Spring中的Aware和Capable

    Spring中的Aware和Capable

    2021年6月18日
    98

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号