异步发送邮件完整示例

异步发送邮件完整示例

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

本章使用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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ❤️学习linux 两年多沉淀下来的linux 命令大全⭐建议收藏⭐[通俗易懂]

    ❤️学习linux 两年多沉淀下来的linux 命令大全⭐建议收藏⭐[通俗易懂]文章目录linux系统命令总结大全关于作者**作者介绍**0.IP地址相关命令0.1ifconfig命令—显示网络设备信息02.ip命令—显示与操作路由03.dhclient命令—动态获取或释放IP地址04.nmtui—界面修改网卡地址信息05.nmcli命令—设置ip地址1.文件目录命令1.1ls命令–显示目录下的内容1.2cd命令—切换目录命令1.3cp命令—复制文件或目录1.4mkdir—创建目录1.5rmdir

    2022年5月1日
    24
  • pip更新方法

    pip更新方法pip更新方法如下:方法一:pycharm中的Terminal中更新,使用如下命令:python-mpipinstall–upgradepip方法二:删除原pip文件,重新安装例如pip文件在如下文件夹中C:\Python\Python373\Lib\site-packages我们能够知道pip20.1.1所在路径,找到它,然后删掉pip-20.1.1.dist-info文件夹。设置如下图,已不见pip的踪影。提示,packagi…

    2022年6月11日
    173
  • 我的世界怎么显示坐标_我的世界永久显示坐标

    我的世界怎么显示坐标_我的世界永久显示坐标在我的世界游戏中,坐标这个问题如果玩的很6的话能够帮助我们瞬间移动,去到任何想去的地方,这时有不少玩家不禁想问了,我的世界坐标怎么看,坐标指令又是什么呢?坐标(coordinates)在数字上反映了您在主世界中的位置。坐标基于一个由三条交于一点(即原点)的坐标轴而形成的网格。玩家会出生在距离原点数百方块的位置上。x轴反映了玩家距离原点在东()西(-)方向上的距离,如经度。z轴反映了玩家距离原点在…

    2022年4月19日
    1.4K
  • matlab中coef是什么,LinearRegression()中的coef_U值代表什么?

    matlab中coef是什么,LinearRegression()中的coef_U值代表什么?我是机器学习的初学者。这只是一个简单的问题,LinearRegression()中的coef帴代表什么?我知道它代表的是系数,但我不明白这些值,高的和正的系数意味着更强的关系吗?在而且,如果coef_u值是指数型的,这是否意味着我的线性回归是错误的?在array([-3.12840684e+02,-1.01279891e+13,-1.42682874e+13,-1.42682874e+13,…

    2025年7月12日
    0
  • OpenStack HA集群3-Pacemake Corosync

    OpenStack HA集群3-Pacemake Corosync

    2022年3月12日
    61
  • python csv文件数据写入和读取(适用于超大数据量)

    python csv文件数据写入和读取(适用于超大数据量)文章目录pythoncsv文件数据写入和读取(适用于超大数据量)pythoncsv文件数据写入和读取(适用于超大数据量)一般情况下由于我们使用的数据量比较小,因此可以将数据一次性整体读入或者写入,而且可以一次性对数据进行加工和处理。但是当数据量比较大,比如有5G的数据量,这个时候想要一次性对所有数据进行操作就比较困难了。所以需要逐条将数据进行处理。importcsv#在最开始创…

    2022年7月20日
    49

发表回复

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

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