Heim >Backend-Entwicklung >PHP-Tutorial >Beispiel für die Verwendung von thinkphp5 und swoole zur Implementierung von asynchronem Massenmailing über SMTP
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('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(); }
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 'error!connect to swoole_server failed'; } else { $client->send('blue');//这里只是简单的实现了发送的内容 } }
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!