1. 程式人生 > >Laravel5.5 郵件驅動使用 SMTP 驅動實現郵件發送

Laravel5.5 郵件驅動使用 SMTP 驅動實現郵件發送

notify 名稱 config padding turn reat function 模型 發現

laravel5.5 郵件驅動

Laravel 支持多種郵件驅動,包括 smtpMailgunMaildrillAmazon SESmailsendmailMailgun Maildrill 都是第三方郵件服務。mail 驅動使用 PHP 提供的 mail 函數。sendmail 驅動通過 Sendmail/Postfix(Linux)提供的命令發送郵件,smtp 驅動使用支持 ESMTP 的 SMTP 服務器發送郵件。mail 不安全,sendmail 需要安裝配置 Sendmail/Postfix,並且信用不高,很容易被當成垃圾郵件,第三方服務的信用是最高的,商業軟件推薦使用。

我們以 QQ 郵箱為例,我們將開啟 QQ 的 SMTP 功能,並配置項目的 SMTP 郵件發送功能。其他郵箱的配置基本大致相同。

開啟 QQ 郵箱的 SMTP 支持

首先我們需要在 QQ 郵箱的賬號設置裏開啟 POP3SMTP 服務。具體請查看 如何打開POP3/SMTP/IMAP功能? 。

只需要開啟以下:

技術分享圖片

復制方框裏的『授權碼』,授權碼將作為我們的密碼使用:

技術分享圖片

郵箱發送配置

Laravel 中郵箱發送的配置存放於 config/mail.php 中。不過 mail.php 中我們所需的配置,都可以通過 .env 來配置。作為最佳實踐,我們優先選擇通過環境變量來配置:

.env

MAIL_DRIVER=smtp
MAIL_HOST
=smtp.qq.com MAIL_PORT=465 MAIL_USERNAME=xxxxxxxxxxxxxx@qq.com MAIL_PASSWORD=xxxxxxxxx MAIL_ENCRYPTION=SSL MAIL_FROM_ADDRESS=xxxxxxxxxxxxxx@qq.com MAIL_FROM_NAME=子欽加油個人博客

註釋:

  1. MAIL_DRIVER=smtp —— 使用支持 ESMTP 的 SMTP 服務器發送郵件;

  2. MAIL_HOST=smtp.qq.com —— QQ 郵箱的 SMTP 服務器地址,必須為此值;

  3. MAIL_PORT=465 —— QQ 郵箱的 SMTP 服務器端口,必須為此值;

  4. [email protected] —— 請將此值換為你的 QQ + @qq.com;

  5. MAIL_PASSWORD=xxxxxxxxx —— 密碼是我們第一步拿到的授權碼;

  6. MAIL_ENCRYPTION=SSL —— 加密類型,選項 null 表示不使用任何加密,其他選項還有 TLS,這裏我們使用 SSL 即可。

  7. [email protected] —— 此值必須同 MAIL_USERNAME 一致;

  8. MAIL_FROM_NAME=小張個人博客 —— 用來作為郵件的發送者名稱。


生成通知類

Laravel 中一條通知就是一個類(通常存在 app/Notifications 文件夾裏)。看不到的話不要擔心,運行一下以下命令即可創建:

php artisan make:notification TopicReplied

添加郵件通知頻道

首先我們需要修改 via() 方法,並新增 mail 通知頻道:

app/Notifications/TopicReplied.php

public function via($notifiable)
    {
        // 開啟通知的頻道
        return [‘database‘, ‘mail‘];
    }

因為開啟了 mail 頻道,我們還需要新增 toMail 方法:

app/Notifications/TopicReplied.php

public function toMail($notifiable)
{
$url = $this->reply->topic->link([‘#reply‘ . $this->reply->id]);

return (new MailMessage)
        ->line(‘你的話題有新回復!‘)
        ->action(‘查看回復‘, $url);
}

觸發通知

我們希望當用戶回復主題後,通知到主題作者。故觸發通知的時機是:『回復發布成功後』,在模型監控器裏,我們可以在 created 方法裏實現此部分代碼,修改 created() 方法為以下:

app/Observers/ReplyObserver.php

 public function created(Reply $reply)
    {
        $topic = $reply->topic;
        $topic->increment(‘reply_count‘, 1);

        // 通知作者話題有新的回復
        $topic->user->notify(new TopicReplied($reply));
    }

測試郵件通知

提交成功後,刷新郵箱,一般幾分鐘內就能收到話題回復的郵件:

技術分享圖片

Laravel5.5 使用 SMTP 驅動已經成功發送郵件,其實還有很多地方許要優化,大家應該會發現我們提交回復時,服務器響應會變得非常緩慢,這是『郵件通知』功能請求了 QQ SMTP 服務器進行郵件發送所產生的延遲。對於處理此類延遲,最好的方式是使用隊列系統。

Laravel5.5 郵件驅動使用 SMTP 驅動實現郵件發送