Home  >  Article  >  Backend Development  >  Example of using thinkphp5 and swoole to implement asynchronous mass mailing using SMTP

Example of using thinkphp5 and swoole to implement asynchronous mass mailing using SMTP

黄舟
黄舟Original
2017-10-14 09:11:172989browse

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

This article introduces the implementation of thinkphp5+swoole. Asynchronous mass mailing (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 email we just sent in the trash of QQ mailbox Email

3. Combined with swoole to achieve asynchronous mass sending 3.1 Installation of 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


After installing swoole, it is recommended to add the swoole code prompt to your IDE and configure the portal for the IDE to prompt the 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 20 loop to simulate mass sending, and actually changed it to a different email Just the 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 enter the project the root directory.


Execution


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 the 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 the client once, we You can see the following screen on the server terminal:

, indicating 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. Insufficient, so you still need to test and learn more. If there are any deficiencies in the demo, please point out the QAQ

The above is the detailed content of Example of using thinkphp5 and swoole to implement asynchronous mass mailing using 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