Laravel5.5 郵件驅動使用 SMTP 驅動實現郵件發送
laravel5.5 郵件驅動
Laravel 支持多種郵件驅動,包括 smtp、Mailgun、Maildrill、Amazon SES、mail 和 sendmail。Mailgun 、 Maildrill 都是第三方郵件服務。mail 驅動使用 PHP 提供的 mail 函數。sendmail 驅動通過 Sendmail/Postfix(Linux)提供的命令發送郵件,smtp 驅動使用支持 ESMTP 的 SMTP 服務器發送郵件。mail 不安全,sendmail 需要安裝配置 Sendmail/Postfix,並且信用不高,很容易被當成垃圾郵件,第三方服務的信用是最高的,商業軟件推薦使用。
我們以 QQ 郵箱為例,我們將開啟 QQ 的 SMTP 功能,並配置項目的 SMTP 郵件發送功能。其他郵箱的配置基本大致相同。
開啟 QQ 郵箱的 SMTP 支持
首先我們需要在 QQ 郵箱的賬號設置裏開啟 POP3 和 SMTP 服務。具體請查看 如何打開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=子欽加油個人博客
註釋:
-
MAIL_DRIVER=smtp —— 使用支持 ESMTP 的 SMTP 服務器發送郵件;
-
MAIL_HOST=smtp.qq.com —— QQ 郵箱的 SMTP 服務器地址,必須為此值;
-
MAIL_PORT=465 —— QQ 郵箱的 SMTP 服務器端口,必須為此值;
-
[email protected] —— 請將此值換為你的 QQ + @qq.com;
-
MAIL_PASSWORD=xxxxxxxxx —— 密碼是我們第一步拿到的授權碼;
-
MAIL_ENCRYPTION=SSL —— 加密類型,選項 null 表示不使用任何加密,其他選項還有 TLS,這裏我們使用 SSL 即可。
-
[email protected] —— 此值必須同 MAIL_USERNAME 一致;
-
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 驅動實現郵件發送