Maison >développement back-end >tutoriel php >Exemple d'utilisation de thinkphp5 et swoole pour implémenter un publipostage asynchrone à l'aide de SMTP
Cet article présente principalement l'implémentation détaillée de thinkphp5+swoole pour implémenter le mailing de masse asynchrone (méthode SMTP), qui a une certaine valeur de référence. Les amis intéressés peuvent s'y référer
Cet article présente l'implémentation de thinkphp5+. swoole Envoi de masse asynchrone (méthode SMTP), partagez avec tout le monde, les détails sont les suivants :
1 Description de l'environnement
Alibaba Cloud centos7.
thinkphp5.0.11
swoole2.0.8
2. envoyer
Créez le répertoire de fichiers suivant sous le projet :
Parmi eux, SendMail.php est le fichier auquel nous appelons réellement envoyer des e-mails. Voici le code principal : Les éléments de configuration dans
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; } } }
sont placés dans le fichier config.php sous le projet. Le contenu de configuration spécifique est le suivant :
//邮箱设置 '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 Ici nous implémentons uniquement la démo envoyée par le protocole SMTP, elle n'est donc pas très complète au niveau packaging et n'est pas très flexible. Les deux autres fichiers de l'image (PhpMailer.php et Smtp.php) sont les fichiers de base de la classe d'envoi d'e-mails Phpmailer. Afin de simplifier l'appel, ils sont extraits. Pour une utilisation détaillée et les paramètres, vous pouvez vous référer à l'utilisation de gayhub. instructions phpmailer
2.2 Notes
Dans cette étape, nous devons prêter attention à quelques points : 1. Si le compte que vous avez défini pour envoyer l'e-mail a ouvert SMTP et recherchez le protocole de sécurité et le numéro de port correspondants. 2. Si le serveur actuel prend en charge le service SMTP, qui est souvent affecté par certaines fonctions du socket, lorsque nous rencontrons des problèmes, nous devons définir le paramètre SMTPDebug sur 1, puis déboguer soigneusement en fonction des informations de débogage. 3. Certains e-mails sortants seront mis à la corbeille, veuillez les vérifier attentivement.
2.3 Appelez
pour établir la structure de répertoires de fichiers suivante :
Appelez la méthode d'envoi d'e-mails dans Index.php, le code spécifique est le suivant
public function sendMail(){ if(SendMail::postmail('937069176@qq.com','test','123')){ echo 'send success'; }else{ echo 'send fail'; } }
2.4 Résultat de l'appel
Nous pouvons retrouver le message que nous venons d'envoyer dans le corbeille de la boîte aux lettres QQ Un email
3. Combiné avec swoole pour réaliser un envoi de masse asynchrone 3.1 Installation de swoole
Les étapes détaillées pour l'installation de l'extension swoole sont disponibles sur le site officiel site Web, je n'entrerai donc pas dans les détails. Le portail de documents swoole
Après avoir installé swoole, il est recommandé d'ajouter l'invite de code swoole à votre IDE et de configurer le portail pour que l'IDE invite le code swoole
3.2 Implémenter l'envoi de masse asynchrone
Nous implémentons d'abord le serveur asynchrone :
/** * 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(); }
Côté serveur, nous avons utilisé une boucle 20 pour simuler un envoi de masse. Il suffit de la remplacer par une autre adresse e-mail.
Ensuite, nous implémentons le 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 'error!connect to swoole_server failed'; } else { $client->send('blue');//这里只是简单的实现了发送的内容 } }
3.3 Ouvrez le serveur
La méthode CLI doit être utilisée ici, nous allons au répertoire racine du projet.
Exécuter
netstat -apn | grep 8082
Surveillez d'abord si le port 8082 est occupé. S'il est occupé,
.
kill -9 PID(进程号)
Tuer le processus
Ensuite, nous exécutons
php public/index.php index/index/syncSend
La fonction de cette commande est d'utiliser le mode cli pour permettez-nous que le port 8082 soit en état d'écoute. Et gardez ce terminal actif pour que nous puissions visualiser les résultats envoyés.
Ensuite, nous pouvons utiliser l'accès CLI ou navigateur pour accéder à notre client
php public/index.php index/index/index
Lorsque nous exécutons le client une fois, nous pouvons voir l'écran suivant sur le terminal du serveur :
, indiquant que nous avons envoyé le groupe normalement.
Ensuite, nous testerons asynchrone, car le serveur 163 détectera l'IP si l'envoi n'est pas fréquent à un certain moment, l'envoi échouera, donc lorsque nous testerons, utilisez la méthode de. exécuter le client 4 fois de suite
Voici le résultat de l'exécution :
À en juger par la séquence d'envoi sur la figure, nous pouvons facilement juger que nous avons implémenté l'envoi asynchrone.
L'email qui vient d'être envoyé a également été reçu dans la boîte aux lettres.
4. Postscript~
swoole est une extension que vous souhaitez connaître et utiliser avec compétence, mais elle est limitée. aux connaissances en programmation réseau. Insuffisant, vous devez donc toujours tester et en savoir plus. S'il y a des lacunes dans la démo, veuillez le signaler QAQ
.Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!