この記事では、主に非同期大量メール送信(SMTP方式)を実装するためのthinkphp5+swooleの詳細な説明を紹介します。興味のある方は参考にしてください
この記事では、非同期大量メール配信を実装するためのthinkphp5+swooleの実装を紹介します。 (SMTP 方式)、みんなで共有します。詳細は次のとおりです:
Alibaba Cloud centos7
thinkphp5.0.11
swoole2.0.8
2. tp は電子メール送信を実現します
プロジェクトの下に次のファイル ディレクトリを作成します:
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
このステップでは、いくつかの点に注意する必要があります: 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('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(); }
サーバー側では、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回連続で実行します。ターミナルメソッド
実行結果は以下の通りです:
写真の送信順序から、非同期送信を実装したことが容易に判断できます。
先ほど送信したメールもメールボックスに受信されました。
以上がthinkphp5 と swoole を使用して SMTP を使用した非同期大量メール送信を実装する例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。