thinkphp5 と swoole が SMTP を介して非同期大量メール送信を実装する方法についての詳細な説明

不言
リリース: 2023-03-30 19:28:02
オリジナル
1788 人が閲覧しました

この記事では、非同期メール送信 (SMTP 方式) を実装するための thinkphp5 swoole について詳しく説明します。興味のある方は参考にしてください。非同期メール(SMTP 方式)、全員で共有、詳細は次のとおりです。

1. 環境の説明

    Alibaba Cloud centos7
  • thinkphp5.0.11
  • swoole2.0.8
#2 tp は電子メールを実現します。送信

プロジェクトの下に次のファイル ディレクトリを作成します。


このうち、実際に呼び出すファイルは SendMail.php です。メールを送る。メインコードは次のとおりです。

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;
  }
 }
}
ログイン後にコピー

の構成設定項目は、プロジェクトの下の config.php ファイルに配置されます。具体的な設定内容は次のとおりです。 :

//邮箱设置
 '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 ここでは、SMTP プロトコルによって送信されたデモのみを実装しているため、パッケージ化レベルではあまり包括的かつ柔軟ではありません。画像内の他の 2 つのファイル (PhpMailer.php と Smtp.php) は、呼び出しを簡素化するために、Phpmailer メール送信クラスのコア ファイルです。詳細な使用方法とパラメーター設定については、gayhub の使用方法を参照してください。手順 phpmailer

2.2 注意事項

このステップでは、いくつかの点に注意する必要があります。 1. 電子メールの送信に設定したアカウントが SMTP を開いているかどうか対応するセキュリティ プロトコルとポート番号を見つけます。 2. 現在のサーバーが SMTP サービスをサポートしているかどうか。問題が発生した場合は、SMTPDebug パラメータを 1 に設定し、デバッグ情報に基づいて慎重にデバッグする必要があります。 3. 送信されたメールの一部はゴミ箱に移動されますので、よくご確認ください。

2.3

を呼び出して、次のファイル ディレクトリ構造を確立します。

Index.php で電子メールを送信するメソッドを呼び出します。具体的なコードは次のとおりです

public function sendMail(){
  if(SendMail::postmail('937069176@qq.com','test','123')){
   echo 'send success';
  }else{
   echo 'send fail';
  }
 }
ログイン後にコピー

2.4 通話結果

送信したばかりのメッセージが見つかります。 QQ メールボックスのゴミ箱 メール

3. swoole を組み合わせて非同期大量送信を実現する 3.1 swoole のインストール

swoole 拡張機能のインストールの詳細な手順は、公式 Web サイトで参照できます。ので、詳細については説明しません。 swoole ドキュメントが送信されます。 Gate


swoole をインストールした後、IDE に swoole コード プロンプトを追加し、IDE プロンプト swoole コード用にポータルを構成することをお勧めします。

3.2 非同期大量送信の実装

最初に非同期サーバーを実装します:

 /**
  * 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();
 }
ログイン後にコピー

Onサーバー側では、大量送信をシミュレートするために 20 のループを使用しました。それを別の電子メール アドレスに変更するだけです。


次に、クライアントを実装します

 /**
  * 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 サーバーを開きます

ここでは CLI メソッドを使用する必要があります, プロジェクトのルートディレクトリに移動します。


実行

netstat -apn | grep 8082
ログイン後にコピー

最初にポート 8082 が占有されているかどうかを監視し、占有されている場合は

kill -9 PID(进程号)
ログイン後にコピー

プロセスを強制終了します

次に、

php public/index.php index/index/syncSend
ログイン後にコピー

を実行します。このコマンドの機能は、cli モードを使用することです。 8082 ポートをリスニング状態にします。そして、送信された結果を表示できるように、このターミナルをアクティブなままにしておきます。

これで、CLI またはブラウザ アクセスを使用してクライアントにアクセスできます

php public/index.php index/index/index
ログイン後にコピー

一度実行すると、クライアントはこの時点で、サーバー端末に以下の画面が表示されます。

これは、グループが正常に送信されたことを意味します。


次に、非同期のテストをします。163サーバーがIPを検出してしまうため、一定時間に頻繁に送信しないと送信に失敗してしまうため、テストする場合は の方法を使用します。クライアントを 4 回連続して実行します。


実行結果は次のとおりです。


図の送信シーケンスから判断すると、非同期送信が実装されていることが容易に判断できます。


送信したメールもメールボックスに受信されました。

#4. 追記~

#swoole は、使いこなして使いこなしたい拡張機能ですが、ネットワーク プログラミングの知識が不十分なため、テストしてさらに学習する必要があります。デモに不備がある場合は、QAQ を指摘してください。

以上がこの記事の全内容です。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。

関連する推奨事項:

Thinkphp5.0 でモジュールとディレクトリを自動的に生成する方法

thinkphp マルチテーブル クエリ 2テーブルには、同じフィールドを繰り返すための完璧なソリューションが含まれています。

ThinkPHP の組み込み ThinkAjax を使用して、非同期送信テクノロジを実装します。

以上がthinkphp5 と swoole が SMTP を介して非同期大量メール送信を実装する方法についての詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!