使用yii2發(fā)送郵件

前言:
收到網(wǎng)站發(fā)送的郵件,在我們的生活中經(jīng)常遇到,那么,我們在網(wǎng)站開發(fā)當(dāng)中,如何向用戶發(fā)送郵件呢
下面我就來介紹下如何在yii2框架中發(fā)送郵件


目錄:

  1. mailer組件的配置
  2. 封裝發(fā)送郵件的方法
  3. mailer里的坑

  1. 我們使用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ù)

mailer中的注釋

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

transport魔術(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',
            ]

  1. 當(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ā)送成功


  1. 細(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)

image.png

它默認(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í).謝謝
以上.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評論 19 139
  • 22年12月更新:個人網(wǎng)站關(guān)停,如果仍舊對舊教程有興趣參考 Github 的markdown內(nèi)容[https://...
    tangyefei閱讀 35,412評論 22 257
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,728評論 18 399
  • Django 官方文檔 發(fā)送email 官網(wǎng)地址:[https://docs.djangoproject.com/...
    學(xué)以致用123閱讀 2,405評論 0 2
  • 前言 上一篇已經(jīng)介紹了nagios如何實現(xiàn)對主機及服務(wù)的監(jiān)控,盡可能實現(xiàn)對系統(tǒng)運行狀態(tài)的全面監(jiān)控只是初級目標(biāo),n...
    天之藍(lán)色閱讀 5,061評論 0 0

友情鏈接更多精彩內(nèi)容