前言:
收到網站發送的郵件,在我們的生活中經常遇到,那麼,我們在網站開發當中,如何向使用者發送郵件呢
下面我就來介紹下如何在yii2架構中發送郵件
目錄:
- mailer元件的配置
- 封裝發送郵件的方法
- mailer裡的坑
- 我們使用mailer插件來發送郵件
這是這個插件的github位址 https://github.com/PHPMailer/PHPMailer
但是yii2中内置了mailer元件,我們隻需要将它配置下就可以了
//我們在config中的main.php中進行配置,
如果覺得前背景都要用到的話,我們可以在common裡來配置
//這裡要注意的是元件必須在鍵名為components的數組中配置
'mailer' => [
'class' => \yii\swiftmailer\Mailer::className(),
]
//這樣我們就配置好了一個最基本的配置
但是這樣配置,并不能發送一封郵件.我們知道在yii2中元件類中的public屬性我們都是可以自行配制的.我們來看看這個mailer類中,有哪裡需要我們配置的資料
mailer中的注釋
當我們進入mailer類中,我們可以看到開發者為我們準備了這樣的注釋
我們注意到,開發者讓我們配置一個屬性名為transport的屬性.讓後我們往下面找,并沒有發現這個共有的屬性,但是我們找到了一個魔術方法
transport魔術方法
這個魔術方法,從命名中可以看出是一個寫入方法,方法有一個形參,資料類型為數組或者Swift_Transport對象
我們看了注釋,也看了方法,我們現在就可以開始配置了
- 第一個參數class 我們跟着注釋寫,Swift_SmtpTransport
- 第二個參數填寫郵件的伺服器
我們以qq郵箱為例:
我們進入郵箱
image.png
點選設定
找到這個設定選項
看看他的說明
這裡找到我們需要的配置資訊
我們要發送郵件,那麼發送郵件的伺服器就是smtp.qq.com
- 第三個參數 和第四個參數,在自己的郵箱裡去設定,一般郵箱會發一個專門的密碼來用于外部使用
- 第四個參數就是用于傳遞資料的端口号,注意加密和不加密的端口是不同的
- 第五個參數就是加密的方式
這些在郵箱的幫助文檔中都有很詳細的說明
下面是我的配置,不同的郵箱配置是不一樣的
'mailer' => [
'class' => \yii\swiftmailer\Mailer::className(),
'transport' => [
'class' => 'Swift_SmtpTransport',
'host' => 'smtp.qq.com',
'username' => '********@qq.com',
'password' => '%%%%%%%%%',
'port' => '465',
'encryption' => 'ssl',
]
- 當我們配置完成後,我們就要開始使用了
通常我們會将發送郵件的操作封裝到一個方法裡,友善我們在不同的地方使用
/**
* 向使用者發送郵件的方法
* @param $toMember
* 使用者的郵件位址
* @param $subject
* 郵件主題
* @param $body
* 郵件内容
* @return bool
* 發送結果
*/
private function sendEmail($toMember, $subject, $body)
{
//1構造對象
$emailObj = Yii::$app->mailer->compose();
//設定發件人的郵件位址
return $emailObj->setFrom(Yii::$app->params['adminEmail'])
->setTo($toMember)//設定收件人的位址
->setSubject($subject)//設定郵件主題
->setHtmlBody($body)//設定郵件的内容的html
->send();//發送方法
}
構造mailer對象的寫法是固定寫法,感情興趣的朋友可以看看底層源碼是如何寫的.是在mailer的基類中繼承了一個MailerInterface接口
setHtmlBody注意了,裡面需要寫html代碼,如果不想寫html的話,還有一個setTextBody方法可以不用寫html代碼
當我們按照上面的代碼寫好之後,send方法會傳回一個bool值,代表是否發送成功
-
細心的朋友應該發現了,send之後命名傳回的true,卻沒有收到發送的郵件.這個就是一個坑了.我們在配置中還有一個需要配置的地方.
那就是
'useFileTransport' => false
這是一個在mailer基類中的一個屬性
官方給的注釋是whether to save email messages as files under [[fileTransportPath]] instead of sending them
* to the actual recipients. This is usually used during development for debugging purpose.
意思是,是否将郵件以檔案的形式儲存,而不是發送給實際的接收者.
是個用來調試用的開關.但是我們發現
它預設是關閉的.也就是沒有開啟本地調試.
這裡我的解決方法就是在元件中,再次配置一次.
'mailer' => [
'class' => \yii\swiftmailer\Mailer::className(),
'transport' => [
'class' => 'Swift_SmtpTransport',
'host' => 'smtp.qq.com',
'username' => '*********@qq.com',
'password' => '%%%%%%%%',
'port' => '465',
'encryption' => 'ssl',
],
'useFileTransport' => false
],
也就是這樣,一個完整的mailer元件的配置就是這樣.這樣配置好了之後就可以正常的發送郵件了.
如果有不正确的地方歡迎大家指正,共同學習.謝謝
以上.