Ausführliche Erklärung, wie thinkphp5 und swoole asynchrones Massenmailing über SMTP implementieren

不言
Freigeben: 2023-03-30 19:28:02
Original
1839 Leute haben es durchsucht

In diesem Artikel wird hauptsächlich die detaillierte Implementierung von thinkphp5+swoole zur Implementierung des asynchronen Massenmailings (SMTP-Methode) vorgestellt, die einen gewissen Referenzwert hat.

Dieser Artikel stellt die Implementierung von thinkphp5+ vor swoole Asynchrones Massenmailing (SMTP-Methode), mit allen teilen, die Details sind wie folgt:

1. Umgebungsbeschreibung

  • Alibaba Cloud Centos7

  • thinkphp5.0.11

  • swoole2.0.8

2. tp erkennt E-Mail Senden

Erstellen Sie das folgende Dateiverzeichnis unter dem Projekt:

Unter diesen ist SendMail.php die Datei, die wir tatsächlich aufrufen E-Mails senden. Das Folgende ist der Hauptcode: Die Konfigurationskonfigurationselemente 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;
  }
 }
}
Nach dem Login kopieren

werden in der Datei config.php unter dem Projekt abgelegt. Der spezifische Konfigurationsinhalt lautet wie folgt :

//邮箱设置
 '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',// 发件人邮箱
 ]
Nach dem Login kopieren

2.1 Hier implementieren wir nur die vom SMTP-Protokoll gesendete Demo, daher ist sie auf Verpackungsebene nicht sehr umfassend und nicht sehr flexibel. Die anderen beiden Dateien im Bild (PhpMailer.php und Smtp.php) sind die Kerndateien der E-Mail-Versandklasse von PHPMailer. Zur Vereinfachung des Aufrufs können Sie sich auf die Verwendung von gayhub beziehen Anleitung phpmailer

2.2 Hinweise

In diesem Schritt müssen wir auf einige Punkte achten: 1. Ob das Konto, das Sie zum Senden der E-Mail festgelegt haben, SMTP geöffnet hat und finden Sie das entsprechende Sicherheitsprotokoll und die Portnummer. 2. Ob der aktuelle Server den SMTP-Dienst unterstützt, der häufig von einigen Socket-Funktionen betroffen ist. Wenn Probleme auftreten, sollten wir den SMTPDebug-Parameter auf 1 setzen und dann sorgfältig anhand der Debug-Informationen debuggen. 3. Einige ausgehende E-Mails werden in den Papierkorb verschoben. Bitte überprüfen Sie diese sorgfältig.

2.3 Rufen Sie

auf, um die folgende Dateiverzeichnisstruktur einzurichten:

Rufen Sie die Methode zum Senden von E-Mails in Index.php auf. Der spezifische Code lautet wie folgt

public function sendMail(){
  if(SendMail::postmail('937069176@qq.com','test','123')){
   echo 'send success';
  }else{
   echo 'send fail';
  }
 }
Nach dem Login kopieren

2.4 Anrufergebnis

Wir können finden, was wir gerade gesendet haben Papierkorb des QQ-Postfachs Eine E-Mail

3. Kombiniert mit Swoole, um asynchronen Massenversand zu erreichen 3.1 Installation von Swoole

Die detaillierten Schritte für die Installation der Swoole-Erweiterung finden Sie auf der offiziellen Website Website, daher werde ich nicht auf Details eingehen.

Nach der Installation von Swoole wird empfohlen, Swoole-Code-Eingabeaufforderungen zu Ihrer IDE hinzuzufügen und das Portal für IDE-Eingabeaufforderungen Swoole zu konfigurieren Code

3.2 zur Implementierung des asynchronen Massenversands

Wir implementieren zuerst den asynchronen 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();
 }
Nach dem Login kopieren

Auf der Serverseite haben wir eine 20er-Schleife verwendet, um den Massenversand zu simulieren. Ändern Sie ihn einfach in eine andere E-Mail-Adresse.

Als nächstes implementieren wir den 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;);//这里只是简单的实现了发送的内容
  }
 }
Nach dem Login kopieren

3.3 Öffnen Sie den Server

Hier muss die CLI-Methode verwendet werden . Wir gehen in das Stammverzeichnis des Projekts.

Ausführen

netstat -apn | grep 8082
Nach dem Login kopieren

Überwachen Sie zunächst, ob Port 8082 belegt ist, wenn ja

kill -9 PID(进程号)
Nach dem Login kopieren

Prozess beenden

Dann führen wir

php public/index.php index/index/syncSend
Nach dem Login kopieren

Die Funktion dieses Befehls besteht darin, den CLI-Modus zu verwenden Versetzen Sie unseren 8082-Port in den Abhörstatus. Und lassen Sie dieses Terminal aktiv, damit wir die gesendeten Ergebnisse sehen können.

Dann können wir über CLI oder Browserzugriff auf unseren Client zugreifen

php public/index.php index/index/index
Nach dem Login kopieren

Wenn wir es einmal ausführen. Zu diesem Zeitpunkt können wir das sehen Folgender Bildschirm auf dem Serverterminal:

Dies bedeutet, dass wir die Gruppe normal gesendet haben.

Als nächstes testen wir asynchron, da der 163-Server die IP erkennt. Wenn das Senden zu einem bestimmten Zeitpunkt nicht häufig erfolgt, schlägt das Senden fehl. Verwenden Sie daher beim Testen die Methode von Ausführen des Clients 4 Mal hintereinander

Das Folgende ist das Ergebnis der Ausführung:


Anhand der Sendesequenz in der Abbildung können wir leicht beurteilen, dass wir das asynchrone Senden implementiert haben.

Die gerade gesendete E-Mail ist auch im Postfach angekommen.

4. Postscript~

swoole ist eine Erweiterung, mit der Sie vertraut sein und die Sie kompetent verwenden möchten, die jedoch begrenzt ist Unzureichende Kenntnisse in der Netzwerkprogrammierung, daher müssen Sie noch mehr testen und lernen. Wenn es Mängel in der Demo gibt, weisen Sie bitte darauf hin, QAQ

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er für das Studium aller hilfreich ist. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.

Verwandte Empfehlungen:

So generieren Sie automatisch Module und Verzeichnisse in Thinkphp5.0

thinkphp hat eine Multi-Table-Abfrage zwei Tabellen Die perfekte Lösung zum Wiederholen derselben Felder

Verwendung von ThinkPHPs integriertem ThinkAjax zur Implementierung der asynchronen Übertragungstechnologie

Das obige ist der detaillierte Inhalt vonAusführliche Erklärung, wie thinkphp5 und swoole asynchrones Massenmailing über SMTP implementieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage