redis的簡單使用 非同步傳送郵件

2021-08-14 03:09:58 字數 3046 閱讀 3162

你是否也困在redis,知其然不知其所以然~~ 專案中,到底怎麼用?? 乙個簡單的例項,使用訊息佇列實現下yii非同步傳送郵件

首先得配置redis服務,之前寫過相關的文章,可以參考下這裡 

yii的redis操作庫:

使用composer安裝redis的依賴庫

php composer.phar require

--prefer-dist yiisoft/yii2-redis

web.php的相關配置:

return [

//....

'components' => [

'redis' => [

'class' => 'yii\redis\connection',

'hostname' => 'localhost',

'port' => 6379,

'database' => 0,],]

];

到此,yii中就可以使用redis進行操作了

那麼如何實現非同步訊息佇列傳送郵件呢??

傳統的操作方法是這樣的:

使用者輸入郵件資訊

伺服器獲取使用者輸入的資料,提交到第三方的郵件伺服器

第三方郵件伺服器傳送郵件,返回處理結果

非同步的處理郵件傳送:

使用者輸入郵件相關資訊

將註冊資訊儲存在記憶體佇列,通知使用者傳送成功

伺服器端監聽記憶體佇列,將記憶體佇列中的郵件資料依次傳送 使用者感知不到

兩者的區別在哪?

非同步相對於同步來說,頁面非阻塞,減少了使用者等待的時間體驗相對來說比較好

原理:使用者輸入郵件資訊,伺服器接收到輸入的郵件資訊,呼叫mail的過程,實則是對mail類屬性賦值的過程,這個時候,我們可以抓取使用者的資訊,儲存到佇列,然後在佇列中,依次讀取郵件資訊,進行傳送

//例項化mail元件

$mailer->setfrom('發件人位址');

$mailer->setto('收件人位址');

$mailer->setsubject('傳送標題');

//if ($mailer->send() && $this->reg($data, 'regbymail'))

這個時候 會去例項化mail類 進行郵件傳送,這個時候 我們可以抓取郵件資訊 儲存到佇列中

<?php

namespace

mail\mailerqueue;

useyii;

class

message

extends \yii\swiftmailer\message

// 0 - 15 select 0 select 1

// db => 1

//mail郵件儲存的資料庫 是否存在

if (empty($mailer) || !$redis->select($mailer->db))

//抓取郵件資訊

$message = ;

$message['from'] =array_keys($this->from);

$message['to'] = array_keys($this->getto());

$message['cc'] = array_keys($this->getcc());

$message['bcc'] = array_keys($this->getbcc());

$message['reply_to'] = array_keys($this->getreplyto());

$message['charset'] = array_keys($this->getcharset());

$message['subject'] = array_keys($this->getsubject());

//獲取郵件資訊及子資訊

$parts = $this->getswiftmessage()->getchildren();

if (!is_array($parts) || !sizeof($parts))

foreach ($parts as $part)

if (!$message['charset']) }}

//序列化抓取的內容 存放到佇列中

return $redis->rpush($mailer->key, json_encode($message));}}

接下來就是讀取redis佇列,進行傳送的過程

<?php

namespace

mail\mailerqueue;

useyii;

class

mailerqueue

extends \yii\swiftmailer\mailer

//如果佇列中 存在資料

if ($redis->select($this->db) && $messages = $redis->lrange($this->key, 0, -1))

if ($messageobj->send())}}

return

true;

}//設定訊息頭部

public

function

setmessage

($messageobj, $message)

if (!empty($message['from']) && !empty($message['to']))

if (!empty($message['bcc']))

if (!empty($message['reply_to']))

if (!empty($message['charset']))

if (!empty($message['subject']))

if (!empty($message['html_body']))

if (!empty($message['text_body']))

return $messageobj;

}return

false;

}}

到此 我們就實現了redis佇列非同步傳送郵件

redis的簡單使用 非同步傳送郵件

你是否也困在redis,知其然不知其所以然 專案中,到底怎麼用?乙個簡單的例項,使用訊息佇列實現下yii非同步傳送郵件 首先得配置redis服務,之前寫過相關的文章,可以參考下這裡 yii的redis操作庫 使用composer安裝redis的依賴庫 php composer.phar requir...

使用 MimeKit 和 MailKit 傳送郵件

mimekit 給.net 社群帶來了一流的 mime 解析器,它能處理複雜的各種mime,效能好。而且開箱即用支援 s mime 和 pgp。mimekit 和 mailkit 支援最新的國際化的電子郵件標準,是.net 中為乙個支援完整支援這些標準電子郵件庫,最近正式發布了1.0版本。如果你想做...

使用swoole非同步傳送郵件

傳送郵件的操作一般是比較耗時的,所以我們一般採用非同步或者佇列來執行。php使用redis的publish subscribe也是一種不錯的選擇,這在以前的一篇博文中寫過。php語言本身是不支援非同步操作的,不過我們可以通過swoole擴充套件實現非同步功能,這個非同步功能基於tcp協議,相應速度還...