在 Laravel 5.1 中使用SMTP驅動實現郵件發送(含附件和圖片)詳細教程

一、 配置 文件

Laravel集成了SwiftMailer庫進行郵件發送,郵件配置文件位於 config/mail.phpphp

return [
  'driver' => env('MAIL_DRIVER', 'smtp'),
  'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
  'port' => env('MAIL_PORT', 587),
  'from' => ['address' => null, 'name' => null],
  'encryption' => env('MAIL_ENCRYPTION', 'tls'),
  'username' => env('MAIL_USERNAME'),
  'password' => env('MAIL_PASSWORD'),
  'sendmail' => '/usr/sbin/sendmail -bs',
  'pretend' => false,
]

driver 用於配置默認的郵件發送驅動,Laravel支持多種郵件驅動方式,包括 smtpMailgunMaildrillAmazon SESmailsendmail ,Mailgun和Amazon SES都是收費的,Maildrill目前不支持中國區用戶,這三個都是第三方郵件服務。 mail 驅動使用PHP提供的 mail 函數發送, sendmail 驅動經過Sendmail/Postfix(Linux)提供的命令發送郵件, smtp 驅動經過支持ESMTP的SMTP發送郵件。laravel

注:ESMTP即Extended SMTP, 是對標準 SMTP 協議進行的擴展,它與 SMTP 服務的區別僅僅是,使用 SMTP 發信不須要驗證用戶賬戶,而用 ESMTP 發信時,服務器會要求用戶提供用戶名和密碼以便驗證身份。瀏覽器

就目前情況來看,使用 smtp 是最明智的選擇, mail 不安全, sendmail 須要安裝配置Sendmail/Postfix,其餘要麼付費要麼不能用(汗!)。下面其它配置的說明都基於 driversmtp安全

接下來其餘的配置都好理解, host 是郵箱所在主機,好比咱們使用163郵箱,對應值是 smtp.163.com ,使用QQ郵箱的話,對應值是 smtp.qq.com服務器

port 用於配置郵箱發送服務端口號,好比通常默認值是 25 ,但若是設置SMTP使用SSL加密,該值爲 465閉包

from 配置項包含 addressname ,前者表示發送郵箱,後者表示發送郵件使用的用戶名。app

encryption 表示加密類型,能夠設置爲 null 表示不使用任何加密,也能夠設置爲 tls / ssl函數

username 表示郵箱帳號,好比yaojinbu@163.com測試

password 表示上述郵箱登陸對應登陸密碼。ui

sendmail 是在設置 driversendmail 時使用,用於指定 sendmail 命令路徑。

pretend 用於配置是否將郵件發送記錄到日誌中,默認爲 false 則發送郵件不記錄日誌,若是爲 true 的話只記錄日誌不發送郵件,這一配置在本地開發中調試時頗有用。

根據你的郵箱服務及郵箱帳號填寫該配置文件,固然不少配置值須要在 .env 中設置。

二、定義路由

爲咱們的測試在 routes.php 定義路由規則:

Route::get('mail/send','MailController@send');

三、郵件發送邏輯實現

建立控制器

接下來建立匹配路由的控制器,使用以下命令建立一個乾淨的 MailController

php artisan make:controller MailController --plain

app/Http/Controllers 目錄下生成一個新的控制器 MailController

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;

class MailController extends Controller
{
    //
}

簡單郵件發送實現

在該控制器中添加郵件發送動做 send() ,咱們使用 Mail 門面的 send 方法發送郵件,咱們先發送一個最簡單的郵件:

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use Mail;
class MailController extends Controller
{
  public function send()
  {
    $name = '學院君';
    $flag = Mail::send('emails.test',['name'=>$name],function($message){
      $to = '1072155122@qq.com';
      $message ->to($to)->subject('測試郵件');
    });
    if($flag){
      echo '發送郵件成功,請查收!';
    }else{
      echo '發送郵件失敗,請重試!';
    }
  }
}

Mail::send 須要傳遞三個參數,第一個是郵件視圖,第二個是傳入視圖的數據,第三個是一個閉包,該閉包中定義了收件人、抄送人(若是有的話)、郵件主題、附件等信息。郵件的主體內容位於局部視圖中,下面咱們就來定義這個局部視圖,在 resources/views/emails 目錄下新建 test.blade.php ,編輯其內容以下:

{{$name}},這是一封測試郵件

而後咱們就能夠在瀏覽器中訪問 http://laravel.app:8000/mail/send 發送郵件,若是頁面顯示郵件發送成功,那麼到收件人郵箱就能收到郵件了:

更簡單的純文本郵件發送

上面的示例僅僅是發送一個字符串,對於純文本字符串郵件發送,還有更簡單的方法:

Mail::raw('這是一封測試郵件', function ($message) {
    $to = '1072155122@qq.com';
    $message ->to($to)->subject('測試郵件');
});

這樣的話無需建立視圖便可完成郵件發送。

發送帶附件的郵件(中文亂碼解決)

固然,郵件內容每每不單單是純文本這麼簡單,有時候咱們會在郵件中加上附件,那麼這該如何實現呢?

先上代碼:

$flag = Mail::send('emails.test',['name'=>$name],function($message){
  $to = '1072155122@qq.com';
  $message->to($to)->subject('測試郵件');
  $attachment = storage_path('app/files/test.doc');
  //在郵件中上傳附件
  $message->attach($attachment,['as'=>'測試文檔.doc']);
});

從代碼可知咱們使用閉包中 $message 實例上的 attach 方法上傳附件,該方法第一個參數是附件地址,第二個參數是一些額外參數,這裏咱們經過 as 指定附件在郵件中的顯示名稱。

注:須要注意的是 $message 其實是 Illuminate\Mail\Message 的實例,咱們能夠在 $message 上調用 Message 類的全部方法。

再次訪問 http://laravel.app:8000/mail/send 發送郵件,這樣在收件箱中能夠看到附件,但附件名稱出現中文亂碼,解決辦法以下:

$message->attach($attachment,['as'=>"=?UTF-8?B?".base64_encode('測試文檔')."?=.doc"]);

經過這樣處理後,就不會有中文亂碼出現了:

發送帶圖片的郵件

embed

除了附件以外,有時候爲了讓郵件內容更豐富,還會在郵件內容中插入圖片,咱們當然能夠在郵件視圖中硬編碼寫入圖片路徑,可是這顯然很笨重,靈活性不好,Laravel爲咱們提供了便捷方法——在視圖中使用 $message 上的 embed 方法:

{{$name}},這是一封測試郵件
<br>
<img src="{{$message->embed($imgPath)}}">

這裏的 $message 就是上述郵件發送閉包中的 $message ,Laravel內部自動將該變量傳遞到郵件視圖。固然咱們還須要在控制器動做中傳入 $imgPath 變量:

$name = '學院君';
$imgPath = 'http://laravelacademy.org/wp-statics/images/carousel/LaravelAcademy.jpg';
$flag = Mail::send('emails.test',['name'=>$name,'imgPath'=>$imgPath],function($message){
  $to = '1072155122@qq.com';
  $message->to($to)->subject('測試郵件');
  $attachment = storage_path('app/files/test.doc');
  //在郵件中上傳附件
  $message->attach($attachment,['as'=>"=?UTF-8?B?".base64_encode('測試文檔')."?=.doc"]);
});

在瀏覽器中訪問 http://laravel.app:8000/mail/send 發送郵件,郵件發送成功後去收件箱查看:

因而可知,圖片已經插入到郵件內容中。

embedData

此外還支持發送原生的圖片數據到郵件中,即將本地圖片讀取到內存而後渲染到郵件視圖,這能夠經過 $message 上的 embedData 實現。

首先咱們修改控制器動做以下:

$name = '學院君';
//$imgPath = 'http://laravelacademy.org/wp-statics/images/carousel/LaravelAcademy.jpg';
$image = Storage::get('images/test.jpg');
$flag = Mail::send('emails.test',['name'=>$name,'image'=>$image],function($message){
  $to = '1072155122@qq.com';
  $message->to($to)->subject('測試郵件');
  $attachment = storage_path('app/files/test.doc');
  //在郵件中上傳附件
  $message->attach($attachment,['as'=>"=?UTF-8?B?".base64_encode('測試文檔')."?=.doc"]);
});

記得在 MailController 頂部加上 use Storage ,而後修改郵件視圖 test.blade.php 以下:

{{$name}},這是一封測試郵件
<br>
<img src="{{$message->embedData($image,'LaravelAcademy.jpg')}}">

最後去瀏覽器中訪問http://laravel.app:8000/mail/send發送郵件,郵件發送成功去收件箱查看郵件內容:

一樣能夠成功插入圖片。

=================================

http://www.tuicool.com/articles/uE7Z3aF

相關文章
相關標籤/搜索