この記事では主にthinkphp5とswooleでの非同期一斉メールの実装方法を紹介しますので、お役に立てれば幸いです。
Alibaba Cloud centos7
thinkphp5.0.11
swoole2.0.8
プロジェクトの下に次のファイル ディレクトリを作成します。
その中にはSendMがありますail.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;
}
}
}
//邮箱设置 '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. 送信されたメールによってはゴミ箱に入れられる場合がありますので、よくご確認ください。
を呼び出して、次のファイルディレクトリ構造を確立します:
Index.phpでメールを送信するメソッドを呼び出します。具体的なコードは次のとおりですpublic function sendMail()
{
if(SendMail::postmail('937069176@qq.com','test','123'))
{ echo 'send success';
}else{
echo 'send fail';
}
}
QQ メールボックスを使用できます ゴミ箱で送信したメールを見つけます 3. swoole と組み合わせて非同期大量送信を実現します
3.1 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(); }
/** * 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');//这里只是简单的实现了发送的内容 } }
netstat -apn | grep 8082
kill -9 PID(进程号)
その後、
php public/index.php index/index/syncSend
を実行します。このコマンドの目的は、cli モードを使用して 8082 ポートを待機状態にすることです。州。そして、送信された結果を表示できるように、このターミナルをアクティブなままにしておきます。
接着我们可以用CLI或者浏览器访问的方式来访问我们的客户端
php public/index.php index/index/index
当我们执行一次的时候客户端的时候,我们可以在服务端的终端看到屏幕上面出现如下的画面:
说明我们已经正常群发了。
下面,我们就来测试异步,因为163服务器会对IP进行检测,如果在某个时间发送也别频繁的话,会出现发送失败的情况,所以我们测试的时候,采用连续执行4次客户端的方式
下面是执行的结果:
从图中发送的顺序来看,我们可以很容易的判断,我们已经实现了异步的发送。
邮箱里面也接收到了刚刚发送的邮件。
swoole是一种想要熟悉和熟练使用的扩展,但是限于网络编程知识的不足,所以还是要多多测试和学习,demo中有不足的地方,还请指出。
以上がthinkphp5とswooleを使った非同期大量メール配信の実装方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。