Home > Article > Backend Development > Detailed explanation on how thinkphp5 and swoole implement asynchronous mass mailing through SMTP
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: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 followspublic 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 email3. 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 Gate3.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('937069176@qq.com','test',$data)){ echo 'send'.$i.' success'."\n"; }else{ echo 'send'.$i.' fail'."\n"; } } $serv->finish(''); }); $serv->on('finish', 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.
/** * 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 'error!connect to swoole_server failed'; } else { $client->send('blue');//这里只是简单的实现了发送的内容 } }3.3 Open the serverThe CLI method must be used here, We go into the root directory of the project.
netstat -apn | grep 8082First monitor whether port 8082 is occupied, if so
kill -9 PID(进程号)Kill the processThen we execute
php public/index.php index/index/syncSendThe 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/indexWhen 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.
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 QAQThe 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!