thinkphp5和swoole非同步郵件群發實作方法
本文主要跟大家分享thinkphp5和swoole非同步郵件群發實作方法,希望能幫助大家。
1、環境說明
Alipocentos7
thinkphp5.0.11
Aliamcentos7
thinkphp5.0.11swoole2.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設定項,我們放在專案底下的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協定發送的demo,所以在封裝的層面上沒有做到很全面,不是很靈活。圖中其他兩個文件(PhpMailer.php和Smtp.php)是Phpmailer郵件發送類別的核心文件,為了簡化調用,抽取了出來,詳細的用法和參數設置,可以參考gayhub的使用說明phpmailer
2.2 注意點
在此步驟中,我們需要注意幾點:1是你設定的郵件發送的帳號是否已經開啟SMTP並且找對對應的安全協定和連接埠號碼。 2.目前伺服器是否支援SMTP服務,這邊很多時候會受一些socket函數的影響,遇到問題的時候,我們應該把SMTPDebug參數設定為1,然後根據debug資訊去細心調試。 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實作非同步群發
安裝完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的loop來模擬了群發,實際上換成不同的email位址就可。 /** * 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
先監測一下8082埠是否被佔用,如果佔用則
kill -9 PID(进程号)
殺死進程
###然後我們執行###php public/index.php index/index/syncSend
接着我们可以用CLI或者浏览器访问的方式来访问我们的客户端
php public/index.php index/index/index
当我们执行一次的时候客户端的时候,我们可以在服务端的终端看到屏幕上面出现如下的画面:
说明我们已经正常群发了。
下面,我们就来测试异步,因为163服务器会对IP进行检测,如果在某个时间发送也别频繁的话,会出现发送失败的情况,所以我们测试的时候,采用连续执行4次客户端的方式
下面是执行的结果:
从图中发送的顺序来看,我们可以很容易的判断,我们已经实现了异步的发送。
邮箱里面也接收到了刚刚发送的邮件。
4、后记~
swoole是一种想要熟悉和熟练使用的扩展,但是限于网络编程知识的不足,所以还是要多多测试和学习,demo中有不足的地方,还请指出。
以上是thinkphp5和swoole非同步郵件群發實作方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

CakePHP 是 PHP 的開源框架。它旨在使應用程式的開發、部署和維護變得更加容易。 CakePHP 基於類似 MVC 的架構,功能強大且易於掌握。模型、視圖和控制器 gu

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

CakePHP 是一個開源MVC 框架。它使應用程式的開發、部署和維護變得更加容易。 CakePHP 有許多函式庫可以減少大多數常見任務的過載。

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元
