Maison > développement back-end > tutoriel php > Explication détaillée sur la façon dont thinkphp5 et swoole implémentent le publipostage asynchrone via SMTP

Explication détaillée sur la façon dont thinkphp5 et swoole implémentent le publipostage asynchrone via SMTP

不言
Libérer: 2023-03-30 19:28:02
original
1871 Les gens l'ont consulté

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;
  }
 }
}
Copier après la connexion

sont placés dans le fichier config.php sous le projet. comme suit :

//邮箱设置
 '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',// 发件人邮箱
 ]
Copier après la connexion

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 souple. 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';
  }
 }
Copier après la connexion

2.4 Résultat de l'appel

On peut nous retrouver dans la poubelle can of QQ mailbox Un email vient d'être envoyé

3 Combiné avec swoole pour réaliser un envoi massif asynchrone 3.1 Installation de swoole

Les étapes détaillées pour l'installation de l'extension swoole sont disponibles sur le site officiel, donc je n'entrerai pas dans les détails, swoole Document Portal

Après avoir installé swoole, il est recommandé d'ajouter des invites de code swoole à votre IDE et de configurer le portail de code swoole d'invite IDE

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(&#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();
 }
Copier après la connexion

On Côté serveur, nous utilisons une boucle de 20. Après avoir simulé un envoi massif, vous pouvez effectivement la changer en une autre adresse email.

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 &#39;error!connect to swoole_server failed&#39;;
  } else {
   $client->send(&#39;blue&#39;);//这里只是简单的实现了发送的内容
  }
 }
Copier après la connexion

3.3 Ouvrir le serveur

La CLI doit être utilisée ici méthode, nous entrons dans le répertoire racine du projet.

Exécuter

netstat -apn | grep 8082
Copier après la connexion

Surveillez d'abord si le port 8082 est occupé, si c'est le cas

kill -9 PID(进程号)
Copier après la connexion

Tuer le processus

Ensuite on exécute la commande

php public/index.php index/index/syncSend
Copier après la connexion

La fonction est utiliser le mode cli pour mettre notre port 8082 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
Copier après la connexion

Lorsque nous l'exécutons une fois Du côté client, nous Vous pouvez voir l'écran suivant sur le terminal du serveur :

Cela signifie 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 représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'étude de chacun. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !

Recommandations associées :

Comment générer automatiquement des modules et des répertoires dans Thinkphp5.0

la requête multi-table thinkphp a deux tables La solution parfaite pour répéter les mêmes champs

Utiliser ThinkAjax intégré de ThinkPHP pour implémenter la technologie de transmission asynchrone

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal