Home  >  Article  >  Backend Development  >  Detailed explanation on how thinkphp5 and swoole implement asynchronous mass mailing through SMTP

Detailed explanation on how thinkphp5 and swoole implement asynchronous mass mailing through SMTP

不言
不言Original
2018-06-08 14:59:251840browse

This article mainly introduces the detailed explanation of thinkphp5 swoole to implement asynchronous mail sending (SMTP method). It has certain reference value. Interested friends can refer to it.

This article introduces the thinkphp5 swoole to implement asynchronous mail. Mass sending (SMTP method), share with everyone, the details are as follows:

1. Environment description

  • Alibaba Cloud centos7

  • thinkphp5.0.11

  • swoole2.0.8

##2. tp realizes email sending

Create the following file directory under the project:


Among them, 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 implement the demo sent by the SMTP protocol, so it is not very comprehensive at the packaging level and is not very flexible. 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 opened 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 the message we just sent in the trash of QQ mailbox An email

3. Combining swoole to achieve asynchronous mass sending 3.1 Installing swoole

The detailed steps for swoole extension installation are available on the official website, so I won’t go into details. The swoole document is transmitted Gate


After installing swoole, it is recommended to add swoole code prompts to your IDE, and configure the portal for IDE prompts swoole code

3.2 Implement asynchronous mass sending

We first implement the asynchronous server:

 /**
  * 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('task', 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. 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, We go into the root directory of the project.


Execute

netstat -apn | grep 8082

First monitor whether port 8082 is occupied, if so

kill -9 PID(进程号)

Kill the process

Then we execute

php public/index.php index/index/syncSend

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

Then we can use CLI or browser access to access our client

php public/index.php index/index/index

When we execute it once, the client At this time, we can see the following screen on the server terminal:

It means that we have sent the group normally.


Next, we will test asynchronous, because the 163 server will detect the IP. If the sending is not frequent at a certain time, the sending will fail, so when we test, Use the method of executing the client 4 times in succession


The following is the result of the execution:


Judging from the sending sequence in the figure, we can easily judge that we have implemented asynchronous sending.


The email just sent was also received in the mailbox.

4. Postscript~

swoole is an extension that you want to be familiar with and use proficiently, but it is limited to network programming knowledge. Inadequate, so you still need to test and learn more. If there are deficiencies in the demo, please point out the QAQ

The above is the entire content of this article. I hope it will be helpful to everyone's study. For more related content, please pay attention to the PHP Chinese website!

Related recommendations:

How to automatically generate modules and directories in Thinkphp5.0

thinkphp multi-table query Two tables have The perfect solution for repeating the same fields

Using the built-in ThinkAjax of ThinkPHP to implement asynchronous transmission technology

The above is the detailed content of Detailed explanation on how thinkphp5 and swoole implement asynchronous mass mailing through SMTP. 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