thinkphp5 と swoole を使用して SMTP を使用した非同期大量メール送信を実装する例

黄舟
リリース: 2023-03-16 16:20:01
オリジナル
3049 人が閲覧しました

この記事では、主に非同期大量メール送信(SMTP方式)を実装するためのthinkphp5+swooleの詳細な説明を紹介します。興味のある方は参考にしてください

この記事では、非同期大量メール配信を実装するためのthinkphp5+swooleの実装を紹介します。 (SMTP 方式)、みんなで共有します。詳細は次のとおりです:

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 ドキュメント ポータル 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();
 }
ログイン後にコピー

サーバー側では、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 でご指摘ください。

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

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート