Lumen / Laravel 使用网易邮箱 SMTP 发送邮件
Laravel 是目前最流行的PHP框架,而Lumen 是 Laravel 的精簡版,主要用于接口開發。
Laravel 郵件發送服務基于 Symfony 組件 Swift Mailer。
本文記錄了在 Lumen / Laravel 5 環境中,使用網易郵箱 SMTP 發送郵件的主要步驟,希望對大家有一些參考價值。
獲取網易郵箱的服務器和授權碼:
登錄網易郵箱:?http://mail.163.com/
獲取服務器地址:
點擊【設置】 > 【POP3/SMTP/IMAP】選項: 可以查看到,服務器地址:
-  POP3 服務器: pop.163.com
-  SMTP 服務器: smtp.163.com
-  IMAP 服務器: imap.163.com
獲取客戶端授權密碼:
授權碼 授權碼是用于登錄第三方郵件客戶端的專用密碼。適用于登錄以下服務: POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務。
點擊【設置】 > 【客戶端授權密碼】 點擊【開啟】, 設置一個授權碼, 比如本例中將授權碼設置為: mailPASSWORD
配置 env 文件:
Laravel/Lumen的系統配置一般都配置項目根目錄的 “.env” 文件中。 打開配置文件“.env”文件,新增以下配置:
MAIL_DRIVER=smtp MAIL_HOST=smtp.163.comMAIL_PORT=25MAIL_USERNAME=cnwytnet@163.comMAIL_PASSWORD=wang123netMAIL_ENCRYPTION=nullMAIL_FROM_ADDRESS=cnwytnet@163.comMAIL_FROM_NAME=cnwytnet添加發郵件模塊
Laravel 框架已經包含了郵件模塊,不需要安裝。
由于 Lumen 是簡化版的 Laravel, 需要添加 illuminate/mail 模塊:
執行 “composer require” 命令, 安裝illuminate/mail模塊。
$ composer require illuminate/mail
或者,修改composer.json 文件中 require 部分,再執行 composer up 安裝,文件 composer.json 的 require 部分配置如下:
"require": {"php": ">=5.6.4","laravel/lumen-framework": "5.4.*","illuminate/mail":"5.4.*","guzzlehttp/guzzle": "~6.0"}需要增加 mail.php 配置文件:
確保 Laravel、 Luemn 項目中存在 app/config/mail.php 配置文件。
Laravel 框架已經包含了此配置文件,不需新增。Lumen 項目可能不存在,需要從 Laravel 代碼中復制一份, 或者直接copy一下配置代碼:
<?phpreturn [// Mail Driver‘driver’ => env(‘MAIL_DRIVER’, ‘smtp’),//SMTP Host Address'host' => env('MAIL_HOST', 'smtp.mailgun.org'),// SMTP Host Port'port' => env('MAIL_PORT', 587),// Global "From" Address'from' => ['address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),'name' => env('MAIL_FROM_NAME', 'Example'),],// E-Mail Encryption Protocol'encryption' => env('MAIL_ENCRYPTION', 'tls'),// SMTP Server Username'username' => env('MAIL_USERNAME'),'password' => env('MAIL_PASSWORD'),// Sendmail System Path'sendmail' => '/usr/sbin/sendmail -bs',// Markdown Mail Settings'markdown' => ['theme' => 'default','paths' => [resource_path('views/vendor/mail'),],],];創建發郵件腳本
可以使用 php artisan 命令創建腳本文件:
$ php artisan make:command SendEmailCommand
該命令會在自動創建一個類名為 “SendEmailCommand” 的腳本文件。 其路徑是: app/Console/Command/SendMailCommand.php
打開文件,引入?Mail?門面 (facade), 使用?Mail::raw()?方法發送郵件:
其代碼內容如下:
// 發送 純文本郵件Mail::raw($content, function ($message) use ($toMail, $subject) {$message->subject($subject);$message->to($toMail);});注冊腳本
手動將腳本文件加入到 app/Console/Kernel.php 中:
protected $commands = [Commands\SendEmailCommand::class, //測試發郵件腳本];在 Laravel 5.5以上版本中,已默認注冊了所有 Commands 目錄下的腳步文件了,不需要再手動添加在 Kernel.php 中了:
/*** Register the commands.** @return void*/protected function commands(){// 加載所有 Commands 下腳本$this->load(__DIR__.'/Commands');require base_path('routes/console.php');}執行發郵件操作
使用 php artisan 命令可以查看目前可用的腳本列表, 可以看到我們新加的腳本命令 “test:send-mail”:
$ php artisantesttest:send-mail SendMail:測試郵件發送執行發送郵件腳本:
$ php artisan test:send-mail
不出意外的話,郵件發送成功。
查看發件人的發件箱,或者查看收件人的收件箱,確認一下吧。
模板郵件
上邊我們發送的是純文本的郵件,但是我們常用的都是帶有模板的郵件。
在 app/resources/views 目錄下, 創建一個 emails 目錄,創建一個 test.blade.php 郵件模板文件:
使用 Mail::send() 方法發送:
// 郵件模板文件$view = 'emails.test';// 模板展示數據// $data = ['content' => $content,];$data = ['content' => $content,'logo' => 'https://gitee.com/phpspace/php-demo/raw/master/laravel-demo/public/static/images/qrcode_344.jpg',];// 添加附件$attach = "/Users/wangtest/code/php-demo/laravel-demo/public/robots.txt";return Mail::send($view, $data, function ($message) use ($toMail, $subject, $attach) {$message->subject($subject);$message->to($toMail);$message->attach($attach);});?
常見的報錯
這里收集了一些常見的錯誤,可能不同的 Laravel 版本,提示信息略有不同。
報錯1: 沒有正常設置配置文件,報530錯誤 (Lavavel5.5):
In AbstractSmtpTransport.php line 419:Expected response code 250 but got code "530", with message "530 5.7.1 Authentication required"報錯2: 授權碼認證失敗:
授權碼錯誤 (Lavavel5.5):
In AuthHandler.php line 181:Failed to authenticate on SMTP server with username "cnwytnet@163.com" using 2 possible authenticators不填授權碼 MAIL_PASSWORD 或者 MAIL_PASSWORD 錯誤 (Lavavel5.4):
[Swift_TransportException]Failed to authenticate on SMTP server with username “cnwytnet@163.com” using 2 possible authenticators注意 MAIL_PASSWORD 不是郵箱的密碼,而是授權碼。
報錯3: 郵件地址 MAIL_FROM_ADDRESS 必須和 MAIL_USERNAME不一致:
[Swift_TransportException]Expected response code 250 but got code “553”, with message “553 Mail from must equal authorized user”調試郵件:
可以在配置文件中,將郵件驅動改成 MAIL_DRIVER=log, 就可以在本地日志中看到郵件內容了,這在測試的時候會很有用。
打開配置文件?.env,修改郵件驅動為 MAIL_DRIVER=log, 執行郵件發送腳本,將會把郵件發送內容保存到 storage/logs/laravel.log 中。
比如,發送純文本郵件時,實例內容如下:
[2018-06-13 02:52:17] local.DEBUG: Message-ID: <c75569f9a301cbb32b6ef7b0b6c78d09@swift.generated>Date: Wed, 13 Jun 2018 02:52:17 +0000Subject: =?utf-8?Q?=5BTEST=5D=E6=B5=8B=E8=AF=95?==?utf-8?Q?=E9=82=AE=E4=BB=B6=E6=A0=87=E9=A2=98?= SendMail - 2018-06-1302:52:17From: cnwytnet <cnwytnet@163.com>To: wangtom365@qq.comMIME-Version: 1.0Content-Type: text/plain; charset=utf-8Content-Transfer-Encoding: quoted-printableHi, 這是一封來自Laravel的測試郵件.具體代碼可以在碼云查看:?https://gitee.com/phpspace/php-demo
拓展內容
POP3:
POP3, 全名為 “Post Office Protocol - Version 3”,即“郵局協議版本3”。是TCP/IP協議族中的一員,由RFC1939 定義。 它規定怎樣將個人計算機連接到Internet的郵件服務器和下載電子郵件的電子協議。
SMTP
SMTP 全稱是 “Simple Mail Transfer Protocol”,即簡單郵件傳輸協議。它是一組用于從源地址到目的地址傳輸郵件的規范,通過它來控制郵件的中轉方式。SMTP 協議屬于 TCP/IP 協議簇,它幫助每臺計算機在發送或中轉信件時找到下一個目的地。SMTP 服務器就是遵循 SMTP 協議的發送郵件服務器。
IMAP
IMAP 全稱是 “Internet Mail Access Protocol”,即交互式郵件存取協議,它是跟POP3類似郵件訪問標準協議之一。不同的是,開啟了IMAP后,您在電子郵件客戶端收取的郵件仍然保留在服務器上,同時在客戶端上的操作都會反饋到服務器上,如:刪除郵件,標記已讀等,服務器上的郵件也會做相應的動作。所以無論從瀏覽器登錄郵箱或者客戶端軟件登錄郵箱,看到的郵件以及狀態都是一致的。
Swift Mailer
Swift Mailer, 是由 symfony 開發的一個郵件發送類庫。其網址是: swiftmailer.symfony.com。
總結
以上是生活随笔為你收集整理的Lumen / Laravel 使用网易邮箱 SMTP 发送邮件的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 深度学习正则化
- 下一篇: Supervisor使用详解
