ホームページ >バックエンド開発 >PHPチュートリアル >thinkphp5 と swoole が SMTP を介して非同期大量メール送信を実装する方法についての詳細な説明
この記事では、非同期メール送信 (SMTP 方式) を実装するための thinkphp5 swoole について詳しく説明します。興味のある方は参考にしてください。非同期メール(SMTP 方式)、全員で共有、詳細は次のとおりです。
1. 環境の説明
プロジェクトの下に次のファイル ディレクトリを作成します。
このうち、実際に呼び出すファイルは 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 コード用にポータルを構成することをお勧めします。
最初に非同期サーバーを実装します:
/** * 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(); }
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 'error!connect to swoole_server failed'; } else { $client->send('blue');//这里只是简单的实现了发送的内容 } }
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 サイトの他の関連記事を参照してください。