Heim  >  Artikel  >  Backend-Entwicklung  >  Beispiel für die Verwendung von thinkphp5 und swoole zur Implementierung von asynchronem Massenmailing über SMTP

Beispiel für die Verwendung von thinkphp5 und swoole zur Implementierung von asynchronem Massenmailing über SMTP

黄舟
黄舟Original
2017-10-14 09:11:173031Durchsuche

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;
  }
 }
}

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',// 发件人邮箱
 ]

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 PHPMailer-E-Mail-Versandklasse. 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';
  }
 }

2.4 Anrufergebnis

Wir finden die Nachricht, die wir gerade gesendet haben, im 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 Seite Website, daher werde ich hier 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-Code zu konfigurieren

3.2 Implementieren Sie den asynchronen Massenversand

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();
 }

Auf dem Server Auf der anderen Seite 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;);//这里只是简单的实现了发送的内容
  }
 }

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

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


kill -9 PID(进程号)

Beenden Sie den Prozess

Dann führen wir


php public/index.php index/index/syncSend

Die Funktion dieses Befehls besteht darin, den CLI-Modus zu verwenden Aktivieren Sie uns. Port 8082 befindet sich im Überwachungsstatus. Und lassen Sie dieses Terminal aktiv, damit wir die gesendeten Ergebnisse sehen können.

Dann können wir den CLI- oder Browserzugriff verwenden, um auf unseren Client zuzugreifen


php public/index.php index/index/index

Wenn wir den Client einmal ausführen, können wir den folgenden Bildschirm sehen Das Serverterminal:

, was anzeigt, 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 detaillierte Inhalt vonBeispiel für die Verwendung von thinkphp5 und swoole zur Implementierung von asynchronem Massenmailing über SMTP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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