前言:
收到網(wǎng)站發(fā)送的郵件,在我們的生活中經(jīng)常遇到,那么,我們在網(wǎng)站開發(fā)當(dāng)中,如何向用戶發(fā)送郵件呢
下面我就來介紹下如何在yii2框架中發(fā)送郵件
目錄:
- mailer組件的配置
- 封裝發(fā)送郵件的方法
- mailer里的坑
- 我們使用mailer插件來發(fā)送郵件
這是這個插件的github地址https://github.com/PHPMailer/PHPMailer
但是yii2中內(nèi)置了mailer組件,我們只需要將它配置下就可以了
//我們在config中的main.php中進行配置,
如果覺得前后臺都要用到的話,我們可以在common里來配置
//這里要注意的是組件必須在鍵名為components的數(shù)組中配置
'mailer' => [
'class' => \yii\swiftmailer\Mailer::className(),
]
//這樣我們就配置好了一個最基本的配置
但是這樣配置,并不能發(fā)送一封郵件.我們知道在yii2中組件類中的public屬性我們都是可以自行配制的.我們來看看這個mailer類中,有哪里需要我們配置的數(shù)據(jù)

當(dāng)我們進入mailer類中,我們可以看到開發(fā)者為我們準(zhǔn)備了這樣的注釋
我們注意到,開發(fā)者讓我們配置一個屬性名為transport的屬性.讓后我們往下面找,并沒有發(fā)現(xiàn)這個共有的屬性,但是我們找到了一個魔術(shù)方法

這個魔術(shù)方法,從命名中可以看出是一個寫入方法,方法有一個形參,數(shù)據(jù)類型為數(shù)組或者Swift_Transport對象
我們看了注釋,也看了方法,我們現(xiàn)在就可以開始配置了
- 第一個參數(shù)class 我們跟著注釋寫,Swift_SmtpTransport
- 第二個參數(shù)填寫郵件的服務(wù)器
我們以qq郵箱為例:
我們進入郵箱
image.png點擊設(shè)置
找到這個設(shè)置選項
image.png
看看他的說明
image.png
這里找到我們需要的配置信息
我們要發(fā)送郵件,那么發(fā)送郵件的服務(wù)器就是smtp.qq.com
- 第三個參數(shù) 和第四個參數(shù),在自己的郵箱里去設(shè)置,一般郵箱會發(fā)一個專門的密碼來用于外部使用
- 第四個參數(shù)就是用于傳遞數(shù)據(jù)的端口號,注意加密和不加密的端口是不同的
- 第五個參數(shù)就是加密的方式
這些在郵箱的幫助文檔中都有很詳細(xì)的說明
下面是我的配置,不同的郵箱配置是不一樣的
'mailer' => [
'class' => \yii\swiftmailer\Mailer::className(),
'transport' => [
'class' => 'Swift_SmtpTransport',
'host' => 'smtp.qq.com',
'username' => '********@qq.com',
'password' => '%%%%%%%%%',
'port' => '465',
'encryption' => 'ssl',
]
- 當(dāng)我們配置完成后,我們就要開始使用了
通常我們會將發(fā)送郵件的操作封裝到一個方法里,方便我們在不同的地方使用
/**
* 向用戶發(fā)送郵件的方法
* @param $toMember
* 用戶的郵件地址
* @param $subject
* 郵件主題
* @param $body
* 郵件內(nèi)容
* @return bool
* 發(fā)送結(jié)果
*/
private function sendEmail($toMember, $subject, $body)
{
//1構(gòu)造對象
$emailObj = Yii::$app->mailer->compose();
//設(shè)置發(fā)件人的郵件地址
return $emailObj->setFrom(Yii::$app->params['adminEmail'])
->setTo($toMember)//設(shè)置收件人的地址
->setSubject($subject)//設(shè)置郵件主題
->setHtmlBody($body)//設(shè)置郵件的內(nèi)容的html
->send();//發(fā)送方法
}
構(gòu)造mailer對象的寫法是固定寫法,感情興趣的朋友可以看看底層源碼是如何寫的.是在mailer的基類中繼承了一個MailerInterface接口
setHtmlBody注意了,里面需要寫html代碼,如果不想寫html的話,還有一個setTextBody方法可以不用寫html代碼
當(dāng)我們按照上面的代碼寫好之后,send方法會返回一個bool值,代表是否發(fā)送成功
- 細(xì)心的朋友應(yīng)該發(fā)現(xiàn)了,send之后命名返回的true,卻沒有收到發(fā)送的郵件.這個就是一個坑了.我們在配置中還有一個需要配置的地方.
那就是
'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.
意思是,是否將郵件以文件的形式保存,而不是發(fā)送給實際的接收者.
是個用來調(diào)試用的開關(guān).但是我們發(fā)現(xiàn)

它默認(rèn)是關(guān)閉的.也就是沒有開啟本地調(diào)試.
這里我的解決方法就是在組件中,再次配置一次.
'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組件的配置就是這樣.這樣配置好了之后就可以正常的發(fā)送郵件了.
如果有不正確的地方歡迎大家指正,共同學(xué)習(xí).謝謝
以上.


