搜尋
首頁後端開發php教程關於thinkphp5和swoole透過SMTP方式實現非同步郵件群發的詳解

關於thinkphp5和swoole透過SMTP方式實現非同步郵件群發的詳解

Jun 08, 2018 pm 02:59 PM
thinkphp5thinkphp5.0傳送郵件郵件郵件群發

這篇文章主要介紹了詳解thinkphp5 swoole實作非同步郵件群發(SMTP方式),具有一定的參考價值,有興趣的夥伴們可以參考一下

本文介紹了thinkphp5 swoole實作異步郵件群發(SMTP方式),分享給大家,具體如下:

1、環境說明

  • 阿里雲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設定項,我們放在專案底下的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實作非同步群發3.1安裝swoole

swoole擴充功能安裝的詳細步驟官網上面都有,不再贅述,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的loop來模擬了群發,實際換成不同的email地址就可。


下面我們實作客戶端

 /**
  * 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是一種想要熟悉和熟練使用的擴展,但是限於網路程式設計知識的不足,所以還是要多多測驗和學習,demo中有不足的地方,還請指出QAQ###

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!

相關推薦:

Thinkphp5.0自動產生模組以及目錄的方法

thinkphp多表查詢兩個表有重複相同欄位的完美解決方法

利用ThinkPHP內建的ThinkAjax實作非同步傳輸技術的實作方法

以上是關於thinkphp5和swoole透過SMTP方式實現非同步郵件群發的詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
可以在PHP會話中存儲哪些數據?可以在PHP會話中存儲哪些數據?May 02, 2025 am 12:17 AM

phpsessionscanStorestrings,數字,數組和原始物。

您如何開始PHP會話?您如何開始PHP會話?May 02, 2025 am 12:16 AM

tostartaphpsession,usesesses_start()attheScript'Sbeginning.1)placeitbeforeanyOutputtosetThesessionCookie.2)useSessionsforuserDatalikeloginstatusorshoppingcarts.3)regenerateSessiveIdStopreventFentfixationAttacks.s.4)考慮使用AttActAcks.s.s.4)

什麼是會話再生,如何提高安全性?什麼是會話再生,如何提高安全性?May 02, 2025 am 12:15 AM

會話再生是指在用戶進行敏感操作時生成新會話ID並使舊ID失效,以防會話固定攻擊。實現步驟包括:1.檢測敏感操作,2.生成新會話ID,3.銷毀舊會話ID,4.更新用戶端會話信息。

使用PHP會話時有哪些性能考慮?使用PHP會話時有哪些性能考慮?May 02, 2025 am 12:11 AM

PHP会话对应用性能有显著影响。优化方法包括:1.使用数据库存储会话数据,提升响应速度;2.减少会话数据使用,只存储必要信息;3.采用非阻塞会话处理器,提高并发能力;4.调整会话过期时间,平衡用户体验和服务器负担;5.使用持久会话,减少数据读写次数。

PHP會話與Cookie有何不同?PHP會話與Cookie有何不同?May 02, 2025 am 12:03 AM

PHPsessionsareserver-side,whilecookiesareclient-side.1)Sessionsstoredataontheserver,aremoresecure,andhandlelargerdata.2)Cookiesstoredataontheclient,arelesssecure,andlimitedinsize.Usesessionsforsensitivedataandcookiesfornon-sensitive,client-sidedata.

PHP如何識別用戶的會話?PHP如何識別用戶的會話?May 01, 2025 am 12:23 AM

phpIdentifiesauser'ssessionSessionSessionCookiesAndSessionId.1)whiwsession_start()被稱為,phpgeneratesainiquesesesessionIdStoredInacookInAcookInAcienamedInAcienamedphpsessIdontheuser'sbrowser'sbrowser.2)thisIdallowSphptpptpptpptpptpptpptpptoretoreteretrieetrieetrieetrieetrieetrieetreetrieetrieetrieetrieetremthafromtheserver。

確保PHP會議的一些最佳實踐是什麼?確保PHP會議的一些最佳實踐是什麼?May 01, 2025 am 12:22 AM

PHP會話的安全可以通過以下措施實現:1.使用session_regenerate_id()在用戶登錄或重要操作時重新生成會話ID。 2.通過HTTPS協議加密傳輸會話ID。 3.使用session_save_path()指定安全目錄存儲會話數據,並正確設置權限。

PHP會話文件默認存儲在哪裡?PHP會話文件默認存儲在哪裡?May 01, 2025 am 12:15 AM

phpsessionFilesArestoredIntheDirectorySpecifiedBysession.save_path,通常是/tmponunix-likesystemsorc:\ windows \ windows \ temponwindows.tocustomizethis:tocustomizEthis:1)useession_save_save_save_path_path()

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。