Exemple d'utilisation de thinkphp5 et swoole pour implémenter un publipostage asynchrone à l'aide de SMTP

黄舟
Libérer: 2023-03-16 16:20:01
original
3044 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. 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',// 发件人邮箱
 ]
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 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';
  }
 }
Copier après la connexion

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(&#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

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

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

Surveillez d'abord si le port 8082 est occupé. S'il est occupé,


.

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

Tuer le processus

Ensuite, nous exécutons


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

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

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!

Étiquettes associées:
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