天天看點

使用yii2發送郵件

前言:

收到網站發送的郵件,在我們的生活中經常遇到,那麼,我們在網站開發當中,如何向使用者發送郵件呢

下面我就來介紹下如何在yii2架構中發送郵件

目錄:

  1. mailer元件的配置
  2. 封裝發送郵件的方法
  3. mailer裡的坑
  1. 我們使用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',
            ]
           
  1. 當我們配置完成後,我們就要開始使用了

通常我們會将發送郵件的操作封裝到一個方法裡,友善我們在不同的地方使用

/**
     * 向使用者發送郵件的方法
     * @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值,代表是否發送成功

  1. 細心的朋友應該發現了,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元件的配置就是這樣.這樣配置好了之後就可以正常的發送郵件了.

如果有不正确的地方歡迎大家指正,共同學習.謝謝

以上.

繼續閱讀