轉發:http://www.javashuo.com/article/p-oranifew-s.htmlphp
laravel自帶SMTP郵件配置和遇到的坑
laravel自帶SwiftMailer庫,集成了多種郵件API,能夠很方便的實現郵件的發送。在本教程中使用到的是SMTP(Simple Message Transfer Protocol)簡單郵件傳輸協議,一般理解爲郵件發送服務器。laravel
以QQ郵箱爲例
使用QQ郵箱的話,須要開啓POP3和SMTP服務(QQ郵箱登陸=》選擇設置=》帳戶=》下拉找到圖2)。
使用企業郵箱不用開啓SMTP,由於企業郵箱自帶,若是配置有問題去查一下是否關閉安全登陸(企業郵箱)
開啓方式以下:
數組
當開啓成功會生成密鑰,這個東西會在配置中用: 安全
MAIL_DRIVER=smtp MAIL_HOST=smtp.qq.com MAIL_PORT=465 MAIL_USERNAME=********@qq.com MAIL_PASSWORD=qq郵箱此處填寫上圖產生的受權碼 MAIL_FROM_NAME=郵箱的名稱 MAIL_ENCRYPTION=ssl
這文件是laravel自帶的文件,若是沒有需求,內容可不動服務器
return [ 'driver' => env('MAIL_DRIVER', 'smtp'), 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), 'port' => env('MAIL_PORT', 587), 'from' => [ 'address' => env("MAIL_USERNAME", ""), 'name' => env("MAIL_FROM_NAME") ], 'encryption' => env('MAIL_ENCRYPTION'), 'username' => env('MAIL_USERNAME'), 'password' => env('MAIL_PASSWORD'), 'sendmail' => '/usr/sbin/sendmail -bs', 'pretend' => env('MAIL_PRETEND', false), ];
driver:用於配置默認的郵件發送驅動,Laravel支持多種郵件驅動方式,包括smtp、Mailgun、Maildrill、Amazon SES、mail和sendmail,Mailgun和Amazon SES都是收費的Maildrill目前不支持中國區用戶,這三個都是第三方郵件服務。mail驅動使用PHP提供的mail函數發送,sendmail驅動經過Sendmail/Postfix(Linux)提供的命令發送郵件,smtp驅動經過支持ESMTP的SMTP發送郵件。就目前情況來看,使用smtp是最明智的選擇,mail不安全,sendmail須要安裝配置Sendmail/Postfix,其餘要麼付費要麼不能用。
host:郵箱所在主機,使用163郵箱,對應值是smtp.163.com,使用QQ郵箱,對應值是smtp.qq.com。使用騰訊企業郵箱,對應值是smtp.exmail.qq.com
port:用於配置郵箱發送服務端口號,通常默認值是25,但若是設置SMTP使用SSL加密,該值爲465。
from:配置項包含address和name,前者表示你本身的郵箱,後者表示你郵件用戶名(這裏郵箱,是用來發郵件的郵箱)。
encryption:表示加密類型,能夠設置爲null表示不使用任何加密,也能夠設置爲tls或ssl。
username: 表示郵箱帳號,好比123456789@qq.com
password 表示上述郵箱登陸對應登陸密碼。注意QQ郵箱的話應該開啓POP3|SMTP服務時給的受權碼。
sendmail: 是在設置driver爲sendmail時使用,用於指定sendmail命令路徑。
pretend: 用於配置是否將郵件發送記錄到日誌中,默認爲false則發送郵件不記錄日誌,若是爲true的話只記錄日誌不發送郵件,這一配置在本地開發中調試時頗有用
閉包
php artisan make::controller MailController
Route::any('mail/send','MailController@send');
<?php namespace App\Http\Controllers; use App\Http\Requests; class MailController extends Controller { // }
編輯上面控制器,加入如下的邏輯處理:app
use Mail; class MailController{ public function send() { $name = '我發的第一份郵件'; // Mail::send()的返回值爲空,因此能夠其餘方法進行判斷 Mail::send('emails.test',['name'=>$name],function($message){ $to = '123456789@qq.com'; $message ->to($to)->subject('郵件測試'); }); // 返回的一個錯誤數組,利用此能夠判斷是否發送成功 dd(Mail::failures()); } }
Mail::send();須要傳三個參數,第一個爲引用的模板,第二個爲給模板傳遞的變量(郵箱發送的文本內容),第三個爲一個閉包,參數綁定Mail類的一個實例。函數
{{$name}} hello world。
好,如今在服務器上進行測試了,在地址欄輸入http://localhost/mail/send(本身的訪問地址),發送成功。測試
Mail::raw('你好,我是PHP程序!', function ($message) { $to = '123456789@qq.com'; $message ->to($to)->subject('純文本信息郵件測試'); });
發生圖片:加密
{{$name}},這是一封測試郵件 <br> <img src="{{$message->embedData($image,'test.jpg')}}">
public function send(){ $image = Storage::get('images/obama.jpg'); //本地文件 //$image = 'http://www.baidu.com/sousuo/pic/sdaadar24545ssqq22.jpg';//網上圖片 Mail::send('emails.test',['image'=>$image],function($message){ $to = '123456789@qq.com'; $message->to($to)->subject('圖片測試'); }); if(count(Mail::failures()) < 1){ echo '發送郵件成功,請查收!'; }else{ echo '發送郵件失敗,請重試!'; } }
public function sendFile(){ $name = '我發的第一份郵件'; Mail::send('emails.test',['name'=>$name],function($message){ $to = '123456789@qq.com'; $message->to($to)->subject('郵件測試'); $attachment = storage_path('xls/files/test.xls'); // 在郵件中上傳附件 $message->attach($attachment,['as'=>'中文文檔.xls']); }); }
$message的attach方法上傳附件,該方法第一個參數是附件地址,第二個參數爲一些額外參數,這裏咱們經過as指定附件在郵件中的顯示名稱。
測試若是顯示文件名亂碼的話,就這樣寫
$message->attach($attachment,['as'=>"=?UTF-8?B?".base64_encode('中文文檔')."?=.xls"]);
好了,如今咱們的郵件發生功能已經基本知足全部客戶的需求了,歡迎小夥伴的留言和光顧,但願幫助每個踩坑的小夥伴,若是有哪裏不對的還但願各位小夥伴多多指出,若是對你請推薦給身邊的小夥伴,此博客會時常更新,感謝參考過的每個博客,謝謝這些前輩爲咱們填好的坑