Home  >  Article  >  Backend Development  >  Implementation method of asynchronous mass mailing using thinkphp5 and swoole

Implementation method of asynchronous mass mailing using thinkphp5 and swoole

小云云
小云云Original
2018-03-14 13:03:422930browse

This article mainly shares with you the implementation method of asynchronous mass mailing in thinkphp5 and swoole. I hope it can help you.


1. Environment description

Alibaba cloud centos7
thinkphp5.0.11
swoole2.0.8

2. tp implementation Email sending

Create the following file directory under the project:

where SendMail.php is the file we actually call to send emails. The following is the main code: The config configuration items in

namespace app\library\utils\mail;use app\library\utils\mail\PhpMailer;use app\library\utils\mail\Smtp;use think\Log;

error_reporting(E_STRICT);
date_default_timezone_set('Asia/Shanghai');class SendMail{    static function postmail($to,$subject = '',$body = ''){
        $mail = new PhpMailer();
        $mail->CharSet    = config('mail.CharSet');
        $mail->IsSMTP();
        $mail->SMTPDebug  = config('mail.SMTPDebug');
        $mail->SMTPAuth   = config('mail.SMTPAuth');
        $mail->SMTPSecure = config('mail.SMTPSecure');
        $mail->Host       = config('mail.Host');
        $mail->Port       = config('mail.Port');
        $mail->Username   = config('mail.Username');
        $mail->Password   = config('mail.Password');
        $mail->SetFrom(config('mail.From'), config('mail.Name'));
        $mail->Subject    = $subject;
        $mail->MsgHTML($body);
        $address = $to;
        $mail->AddAddress($address, '');        if(!$mail->Send()) {
            Log::write('send to '.$to.'error info:'.$mail->ErrorInfo);            return false;
        } else {            return true;
        }
    }
}

are placed in the config.php file under the project. The specific configuration content is as follows:

 //邮箱设置
    'mail'=>[        'CharSet'=>'UTF-8',        'SMTPDebug'=>0,// 启用SMTP调试功能 0关闭
        'SMTPAuth'=>true,// 启用 SMTP 验证功能
        'SMTPSecure'=>'ssl',// 安全协议
        'Host'=>'smtp.163.com',// SMTP 服务器
        'Port'=>465,// SMTP服务器的端口号
        'Username'=>'**********',// SMTP服务器用户名
        'Password'=>'**********',// SMTP服务器密码
        'From'=>'*********@163.com',// 发件人邮箱
        'Name'=>'blue',// 发件人邮箱
    ]

2.1

here We only implemented the demo sent by the SMTP protocol, so it was not very comprehensive and not very flexible at the packaging level. The other two files in the picture (PhpMailer.php and Smtp.php) are the core files of Phpmailer email sending class. In order to simplify the call, they are extracted. For detailed usage and parameter settings, you can refer to gayhub's usage instructions phpmailer

2.2 Notes

In this step, we need to pay attention to a few points: 1. Whether the account you set to send the email has enabled SMTP and find the corresponding security protocol and port number. 2. Whether the current server supports SMTP service, which is often affected by some socket functions. When encountering problems, we should set the SMTPDebug parameter to 1, and then debug carefully based on the debug information. 3. Some emails sent will be put into the trash, please check them carefully.

2.3 Call

to establish the following file directory structure:

Call the method of sending emails in Index.php, the specific code is as follows

public function sendMail()
{        
if(SendMail::postmail('937069176@qq.com','test','123'))
{            echo 'send success';
        }else{            
        echo 'send fail';
}
}

2.4 Call result

We can find an email we just sent in the trash can of QQ mailbox

3. Combine with swoole to achieve asynchronous mass sending

3.1 Install swoole

The detailed steps for swoole extension installation are available on the official website, so I won’t go into details. The swoole document portal
is installed After swoole, it is recommended to add swoole code prompts to your IDE, and configure the portal for the IDE to prompt swoole codes

3.2 Implement asynchronous mass sending

Let’s implement the asynchronous server first:

    /**
     * description:服务端
     */
    public function syncSend(){
        $serv = new \swoole_server('0.0.0.0',8082);

        $serv->set(array('task_worker_num' => 4));

        $serv->on('receive', function($serv, $fd, $from_id, $data) {
            $task_id = $serv->task($data);            echo "开始投递异步任务 id=$task_id\n";
        });

        $serv->on(&#39;task&#39;, function ($serv, $task_id, $from_id, $data) {            echo "接收异步任务[id=$task_id]".PHP_EOL;            for ($i = 0 ; $i<20;$i++){                if(SendMail::postmail(&#39;937069176@qq.com&#39;,&#39;test&#39;,$data)){                    echo &#39;send&#39;.$i.&#39; success&#39;."\n";
                }else{                    echo &#39;send&#39;.$i.&#39; fail&#39;."\n";
                }
        }
        $serv->finish(&#39;&#39;);
        });

        $serv->on(&#39;finish&#39;, function ($serv, $task_id, $data) {            echo "异步任务[id=$task_id]完成".PHP_EOL;
        });

        $serv->start();
    }

On the server side, we used a loop of 20 to simulate mass sending. In fact, just change it to a different email address.
Next we implement the client

    /**
     * description:客户端
     */
    public function index()
    {
        $client = new \swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_SYNC);
        $ret = $client->connect("127.0.0.1", 8082);        if(empty($ret)){            echo &#39;error!connect to swoole_server failed&#39;;
        } else {
            $client->send(&#39;blue&#39;);//这里只是简单的实现了发送的内容
        }
    }

3.3 Open the server

The CLI method must be used here, and we enter the root directory of the project.
Execution

netstat -apn | grep 8082

First monitor whether port 8082 is occupied. If it is occupied,

kill -9 PID(进程号)

Kill the process

Then we execute

php public/index.php index/index/syncSend

This The function of this command is to use cli mode to put our 8082 port in the listening state. And keep this terminal active so that we can view the sent results.

接着我们可以用CLI或者浏览器访问的方式来访问我们的客户端

php public/index.php index/index/index

当我们执行一次的时候客户端的时候,我们可以在服务端的终端看到屏幕上面出现如下的画面:

说明我们已经正常群发了。
下面,我们就来测试异步,因为163服务器会对IP进行检测,如果在某个时间发送也别频繁的话,会出现发送失败的情况,所以我们测试的时候,采用连续执行4次客户端的方式
下面是执行的结果:


从图中发送的顺序来看,我们可以很容易的判断,我们已经实现了异步的发送。
邮箱里面也接收到了刚刚发送的邮件。

4、后记~

swoole是一种想要熟悉和熟练使用的扩展,但是限于网络编程知识的不足,所以还是要多多测试和学习,demo中有不足的地方,还请指出。

The above is the detailed content of Implementation method of asynchronous mass mailing using thinkphp5 and swoole. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn