<article><h1>Laravel 的 郵件發送功能</h1><ul><li><a href="#introduction">簡介</a><ul><li><a href="#driver-prerequisites">驅動前提</a></li></ul></li><li><a href="#generating-mailables">生成 mailables</a></li><li><a href="#writing-mailables">編寫 mailables</a><ul><li><a href="#configuring-the-sender">配置發送者</a></li><li><a href="#configuring-the-view">配置視圖</a></li><li><a href="#view-data">視圖數據</a></li><li><a href="#attachments">附件</a></li><li><a href="#inline-attachments">內部附件</a></li></ul></li><li><a href="#markdown-mailables">Markdown 格式的郵件</a><ul><li><a href="#generating-markdown-mailables">生成 Markdown 格式的郵件</a></li><li><a href="#writing-markdown-messages">編寫 Markdown 格式的郵件</a></li><li><a href="#customizing-the-components">自定義組件</a></li></ul></li><li><a href="#sending-mail">發送郵件</a><ul><li><a href="#queueing-mail">隊列郵件</a></li></ul></li><li><a href="#mail-and-local-development">郵件與本地開發</a></li><li><a href="#events">事件</a></li></ul><p><a name="introduction"></a></p><h2><a href="#introduction">簡介</a></h2><p>Laravel 基于 <a href="http://swiftmailer.org">SwiftMailer</a> 函數庫提供了一套干凈、簡潔的郵件 API ,Laravel 為 SMTP 、Mailgun 、SparkPost 、 Amazon SES 、 PHP 的 <code class=" language-php">mail</code> 函數及 <code class=" language-php">sendmail</code> 提供驅動,讓你可以快速從本地或云端服務自由地發送郵件。</p><p><a name="driver-prerequisites"></a></p><h3>驅動前提</h3><p>基于 API 的驅動,例如 Mailgun 和 SparkPost 通常比 SMTP 服務器更簡單快速。如果可能,你應該盡可能使用這些驅動。所有的 API 驅動都需要 Guzzle HTTP 函數庫,你可以使用 Composer 包管理器安裝它:</p><pre class=" language-php"><code class=" language-php">composer <span class="token keyword">require</span> guzzlehttp<span class="token operator">/</span>guzzle</code></pre><h4>Mailgun 驅動</h4><p>要使用 Mailgun 驅動,首先必須安裝 Guzzle,之后將 <code class=" language-php">config<span class="token operator">/</span>mail<span class="token punctuation">.</span>php</code> 配置文件中的 <code class=" language-php">driver</code> 選項設置為 <code class=" language-php">mailgun</code>。接下來,確認 <code class=" language-php">config<span class="token operator">/</span>services<span class="token punctuation">.</span>php</code> 配置文件包含以下選項:</p><pre class=" language-php"><code class=" language-php"><span class="token string">'mailgun'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>
<span class="token string">'domain'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'your-mailgun-domain'</span><span class="token punctuation">,</span>
<span class="token string">'secret'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'your-mailgun-key'</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span></code></pre><h4>SparkPost 驅動</h4><p>要使用 SparkPost 驅動,首先必須安裝 Guzzle,之后將 <code class=" language-php">config<span class="token operator">/</span>mail<span class="token punctuation">.</span>php</code> 配置文件中的 <code class=" language-php">driver</code> 選項設置為 <code class=" language-php">sparkpost</code>。接下來,確認 <code class=" language-php">config<span class="token operator">/</span>services<span class="token punctuation">.</span>php</code> 配置文件包含以下選項:</p><pre class=" language-php"><code class=" language-php"><span class="token string">'sparkpost'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>
<span class="token string">'secret'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'your-sparkpost-key'</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span></code></pre><h4>SES 驅動</h4><p>要使用 Amazon SES 驅動,必須安裝 PHP 的 Amazon AWS SDK。你可以在 <code class=" language-php">composer<span class="token punctuation">.</span>json</code> 文件的 <code class=" language-php"><span class="token keyword">require</span></code> 段落加入下面這一行并運行 <code class=" language-php">composer update</code> 命令:</p><pre class=" language-php"><code class=" language-php"><span class="token string">"aws/aws-sdk-php"</span><span class="token punctuation">:</span> <span class="token string">"~3.0"</span></code></pre><p>接下來,將 <code class=" language-php">config<span class="token operator">/</span>mail<span class="token punctuation">.</span>php</code> 配置文件中的 <code class=" language-php">driver</code> 設置為 <code class=" language-php">ses</code>。然后確認 <code class=" language-php">config<span class="token operator">/</span>services<span class="token punctuation">.</span>php</code> 配置文件包含下列選項:</p><pre class=" language-php"><code class=" language-php"><span class="token string">'ses'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>
<span class="token string">'key'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'your-ses-key'</span><span class="token punctuation">,</span>
<span class="token string">'secret'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'your-ses-secret'</span><span class="token punctuation">,</span>
<span class="token string">'region'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'ses-region'</span><span class="token punctuation">,</span> <span class="token comment" spellcheck="true"> // e.g. us-east-1
</span><span class="token punctuation">]</span><span class="token punctuation">,</span></code></pre><p><a name="generating-mailables"></a></p><h2><a href="#generating-mailables">生成 mailables</a></h2><p>在 Laravel 中,每種類型的郵件都代表一個「mailables」對象。這些對象存儲在 <code class=" language-php">app<span class="token operator">/</span>Mail</code> 目錄中。如果在你的應用中沒有看見這個目錄,別擔心,在首次使用 <code class=" language-php">make<span class="token punctuation">:</span>mail</code> 命令創建 mailables 類時這個目錄會被創建,例如:</p><pre class=" language-php"><code class=" language-php">php artisan make<span class="token punctuation">:</span>mail OrderShipped</code></pre><p><a name="writing-mailables"></a></p><h2><a href="#writing-mailables">編寫 mailables</a></h2><p>所有的 「mailables」類都在其 <code class=" language-php">build</code> 方法中完成配置。在這個方法內,你可以調用其他各種方法,如 <code class=" language-php">from</code> 、 <code class=" language-php">subject</code> 、 <code class=" language-php">view</code> 和 <code class=" language-php">attach</code> 來配置完成郵件的詳情。</p><p><a name="configuring-the-sender"></a></p><h3>配置發送者</h3><h4>使用 <code class=" language-php">from</code> 方法</h4><p>首先,演示配置郵件的發送者,也就是郵件的參數 「from」,既誰發送了郵件。有兩種方法配置發送者。第一種是你可以在 <code class=" language-php">build</code> 方法中使用 <code class=" language-php">from</code> 方法:</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* Build the message.
*
* @return $this
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">build<span class="token punctuation">(</span></span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">from<span class="token punctuation">(</span></span><span class="token string">'example@example.com'</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">view<span class="token punctuation">(</span></span><span class="token string">'emails.orders.shipped'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><h4>使用一個全局 <code class=" language-php">from</code> 地址</h4><p>然而,如果應用使用相同的 <code class=" language-php">from</code> 地址,你每次發送郵件這種設置方式顯得笨拙,替代的方法就是在 <code class=" language-php">config<span class="token operator">/</span>mail<span class="token punctuation">.</span>php</code> 配置文件中設置一個全局 <code class=" language-php">from</code> 地址,這個配置在沒有單獨指定 「from」時是默認的 <code class=" language-php">from</code> :</p><pre class=" language-php"><code class=" language-php"><span class="token string">'from'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token string">'address'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'example@example.com'</span><span class="token punctuation">,</span> <span class="token string">'name'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'App Name'</span><span class="token punctuation">]</span><span class="token punctuation">,</span></code></pre><p><a name="configuring-the-view"></a></p><h3>配置視圖</h3><p>在 <code class=" language-php">build</code>方法內,你可以使用 <code class=" language-php">view</code> 方法指定郵件的模板,以渲染郵件的內容。因為所有郵件都會使用 <a href="/docs/5.4/blade">Blade 模板</a> 渲染內容,你能很容易的使用 Blade 模板引擎構建郵件的 HTML:</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* Build the message.
*
* @return $this
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">build<span class="token punctuation">(</span></span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">view<span class="token punctuation">(</span></span><span class="token string">'emails.orders.shipped'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><blockquote class="has-icon tip"><p><div class="flag"><span class="svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" version="1.1" x="0px" y="0px" width="56.6px" height="87.5px" viewBox="0 0 56.6 87.5" enable-background="new 0 0 56.6 87.5" xml:space="preserve"><path fill="#FFFFFF" d="M28.7 64.5c-1.4 0-2.5-1.1-2.5-2.5v-5.7 -5V41c0-1.4 1.1-2.5 2.5-2.5s2.5 1.1 2.5 2.5v10.1 5 5.8C31.2 63.4 30.1 64.5 28.7 64.5zM26.4 0.1C11.9 1 0.3 13.1 0 27.7c-0.1 7.9 3 15.2 8.2 20.4 0.5 0.5 0.8 1 1 1.7l3.1 13.1c0.3 1.1 1.3 1.9 2.4 1.9 0.3 0 0.7-0.1 1.1-0.2 1.1-0.5 1.6-1.8 1.4-3l-2-8.4 -0.4-1.8c-0.7-2.9-2-5.7-4-8 -1-1.2-2-2.5-2.7-3.9C5.8 35.3 4.7 30.3 5.4 25 6.7 14.5 15.2 6.3 25.6 5.1c13.9-1.5 25.8 9.4 25.8 23 0 4.1-1.1 7.9-2.9 11.2 -0.8 1.4-1.7 2.7-2.7 3.9 -2 2.3-3.3 5-4 8L41.4 53l-2 8.4c-0.3 1.2 0.3 2.5 1.4 3 0.3 0.2 0.7 0.2 1.1 0.2 1.1 0 2.2-0.8 2.4-1.9l3.1-13.1c0.2-0.6 0.5-1.2 1-1.7 5-5.1 8.2-12.1 8.2-19.8C56.4 12 42.8-1 26.4 0.1zM43.7 69.6c0 0.5-0.1 0.9-0.3 1.3 -0.4 0.8-0.7 1.6-0.9 2.5 -0.7 3-2 8.6-2 8.6 -1.3 3.2-4.4 5.5-7.9 5.5h-4.1H28h-0.5 -3.6c-3.5 0-6.7-2.4-7.9-5.7l-0.1-0.4 -1.8-7.8c-0.4-1.1-0.8-2.1-1.2-3.1 -0.1-0.3-0.2-0.5-0.2-0.9 0.1-1.3 1.3-2.1 2.6-2.1H41C42.4 67.5 43.6 68.2 43.7 69.6zM37.7 72.5H26.9c-4.2 0-7.2 3.9-6.3 7.9 0.6 1.3 1.8 2.1 3.2 2.1h4.1 0.5 0.5 3.6c1.4 0 2.7-0.8 3.2-2.1L37.7 72.5z"></path></svg></span></div> 你可以創建一個 <code class=" language-php">resources<span class="token operator">/</span>views<span class="token operator">/</span>emails</code> 目錄來存放所有的郵件模板;然而,這不是強制要求,你可以在有的將郵件模板放在 <code class=" language-php">resources<span class="token operator">/</span>views</code> 目錄的任意位置。</p></blockquote><h4>純文本郵件</h4><p>如果你想要定義一個純文本郵件,你可以使用 <code class=" language-php">text</code> 方法。如同 <code class=" language-php">view</code> 方法,<code class=" language-php">text</code> 方法接受一個模板名稱,這個名稱告訴方法使用哪個模板來渲染郵件,可以自由定義郵件 HTML 和純文本消息:</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* Build the message.
*
* @return $this
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">build<span class="token punctuation">(</span></span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">view<span class="token punctuation">(</span></span><span class="token string">'emails.orders.shipped'</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">text<span class="token punctuation">(</span></span><span class="token string">'emails.orders.shipped_plain'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><p><a name="view-data"></a></p><h3>視圖數據</h3><h4>通過公共屬性</h4><p>通常,你會希望傳遞一些數據來渲染你的郵件的 HTML 。那么有兩種方法可以讓視圖獲得數據,第一種,mailable 類任何公共屬性都可以在視圖中使用。所以,例如你可以傳遞數據到 mailable 類的構造函數并且在類中定義數據的公共屬性:</p><pre class=" language-php"><code class=" language-php"><span class="token delimiter"><?php</span>
<span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation">\</span>Mail</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">App<span class="token punctuation">\</span>Order</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Bus<span class="token punctuation">\</span>Queueable</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Mail<span class="token punctuation">\</span>Mailable</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Queue<span class="token punctuation">\</span>SerializesModels</span><span class="token punctuation">;</span>
<span class="token keyword">class</span> <span class="token class-name">OrderShipped</span> <span class="token keyword">extends</span> <span class="token class-name">Mailable</span>
<span class="token punctuation">{</span>
<span class="token keyword">use</span> <span class="token package">Queueable</span><span class="token punctuation">,</span> SerializesModels<span class="token punctuation">;</span>
<span class="token comment" spellcheck="true">/**
* order 實例。
*
* @var Order
*/</span>
<span class="token keyword">public</span> <span class="token variable">$order</span><span class="token punctuation">;</span>
<span class="token comment" spellcheck="true">/**
* 創建一個新消息實例。
*
* @return void
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">__construct<span class="token punctuation">(</span></span>Order <span class="token variable">$order</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">order</span> <span class="token operator">=</span> <span class="token variable">$order</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment" spellcheck="true">/**
* 構建消息。
*
* @return $this
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">build<span class="token punctuation">(</span></span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">view<span class="token punctuation">(</span></span><span class="token string">'emails.orders.shipped'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre><p>一旦數據被設置為公共屬性,它們將自動在視圖中加載,所以你可以訪問像訪問其他 Blade 模板數據一樣訪問它們:</p><pre class=" language-php"><code class=" language-php"><span class="token markup"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span></span>
Price<span class="token punctuation">:</span> <span class="token punctuation">{</span><span class="token punctuation">{</span> <span class="token variable">$order</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">price</span> <span class="token punctuation">}</span><span class="token punctuation">}</span>
<span class="token markup"><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span></span></code></pre><h4>通過 <code class=" language-php">with</code> 方法:</h4><p>你可以使用 <code class=" language-php">with</code> 方法來傳遞數據給模板。一般情況下,你仍然是使用 mailable 類的構造函數來接受數據傳參。然而你需要為這些數據屬性設置 <code class=" language-php"><span class="token keyword">protected</span></code> 或 <code class=" language-php"><span class="token keyword">private</span></code> 聲明,否則這些數據會被自動加載到模板中。接下來你可以使用 <code class=" language-php">with</code> 方法接受鍵值數組傳參來傳遞數據給模板,就如控制器里為視圖傳參一樣:</p><pre class=" language-php"><code class=" language-php"><span class="token delimiter"><?php</span>
<span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation">\</span>Mail</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">App<span class="token punctuation">\</span>Order</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Bus<span class="token punctuation">\</span>Queueable</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Mail<span class="token punctuation">\</span>Mailable</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Queue<span class="token punctuation">\</span>SerializesModels</span><span class="token punctuation">;</span>
<span class="token keyword">class</span> <span class="token class-name">OrderShipped</span> <span class="token keyword">extends</span> <span class="token class-name">Mailable</span>
<span class="token punctuation">{</span>
<span class="token keyword">use</span> <span class="token package">Queueable</span><span class="token punctuation">,</span> SerializesModels<span class="token punctuation">;</span>
<span class="token comment" spellcheck="true">/**
* order 實例。
*
* @var Order
*/</span>
<span class="token keyword">protected</span> <span class="token variable">$order</span><span class="token punctuation">;</span>
<span class="token comment" spellcheck="true">/**
* 創建一個新消息實例。
*
* @return void
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">__construct<span class="token punctuation">(</span></span>Order <span class="token variable">$order</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">order</span> <span class="token operator">=</span> <span class="token variable">$order</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment" spellcheck="true">/**
* 構建消息。
*
* @return $this
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">build<span class="token punctuation">(</span></span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">view<span class="token punctuation">(</span></span><span class="token string">'emails.orders.shipped'</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">with<span class="token punctuation">(</span></span><span class="token punctuation">[</span>
<span class="token string">'orderName'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">order</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">name</span><span class="token punctuation">,</span>
<span class="token string">'orderPrice'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">order</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">price</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre><p>一旦數據已經用 <code class=" language-php">with</code> 方法傳遞,它們將自動在視圖中加載,所以你可以訪問像訪問其他 Blade 模板數據一樣訪問它們:</p><pre class=" language-php"><code class=" language-php"><span class="token markup"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span></span>
Price<span class="token punctuation">:</span> <span class="token punctuation">{</span><span class="token punctuation">{</span> <span class="token variable">$orderPrice</span> <span class="token punctuation">}</span><span class="token punctuation">}</span>
<span class="token markup"><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span></span></code></pre><p><a name="attachments"></a></p><h3>附件</h3><p>要在郵件中加入附件,在 <code class=" language-php">build</code> 方法中使用 <code class=" language-php">attach</code> 方法。<code class=" language-php">attach</code> 方法接受文件的絕對路徑作為它的第一個參數:</p><pre class=" language-php"><code class=" language-php"> <span class="token comment" spellcheck="true">/**
* Build the message.
*
* @return $this
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">build<span class="token punctuation">(</span></span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">view<span class="token punctuation">(</span></span><span class="token string">'emails.orders.shipped'</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">attach<span class="token punctuation">(</span></span><span class="token string">'/path/to/file'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><p>附加文件到消息時,你也可以傳遞 <code class=" language-php">數組</code> 給 <code class=" language-php">attache</code> 方法作為第二個參數,以指定顯示名稱和 / 或是 MIME 類型:</p><pre class=" language-php"><code class=" language-php"> <span class="token comment" spellcheck="true">/**
* Build the message.
*
* @return $this
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">build<span class="token punctuation">(</span></span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">view<span class="token punctuation">(</span></span><span class="token string">'emails.orders.shipped'</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">attach<span class="token punctuation">(</span></span><span class="token string">'/path/to/file'</span><span class="token punctuation">,</span> <span class="token punctuation">[</span>
<span class="token string">'as'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'name.pdf'</span><span class="token punctuation">,</span>
<span class="token string">'mime'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'application/pdf'</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><h4>原始數據附件</h4><p><code class=" language-php">attachData</code> 可以使用字節數據作為附件。例如,你可以使用這個方法將內存中生成而沒有保存到磁盤中的 PDF 附加到郵件中。<code class=" language-php">attachData</code> 方法第一個參數接收原始字節數據,第二個參數為文件名,第三個參數接受一個數組以指定其他參數:</p><pre class=" language-php"><code class=" language-php"> <span class="token comment" spellcheck="true">/**
* Build the message.
*
* @return $this
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">build<span class="token punctuation">(</span></span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">view<span class="token punctuation">(</span></span><span class="token string">'emails.orders.shipped'</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">attachData<span class="token punctuation">(</span></span><span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">pdf</span><span class="token punctuation">,</span> <span class="token string">'name.pdf'</span><span class="token punctuation">,</span> <span class="token punctuation">[</span>
<span class="token string">'mime'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'application/pdf'</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><p><a name="inline-attachments"></a></p><h3>內部附件</h3><p>在郵件中嵌入內部圖標通常是件麻煩事;然而 Laravel 提供了一個便利的方法,讓你在郵件中附件圖片并獲取適當的 CID 。要嵌入內部圖片,在郵件模板的 <code class=" language-php"><span class="token variable">$message</span></code> 變量上調用 <code class=" language-php">embed</code> 方法,Laravel 會自動讓你所有郵件模板都能夠獲取到 <code class=" language-php"><span class="token variable">$message</span></code> 變量,所以不必擔心如何手動傳遞它:</p><pre class=" language-php"><code class=" language-php"><span class="token markup"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>body</span><span class="token punctuation">></span></span></span>
這是一張圖片:
<span class="token markup"><img src="{{ $message-></span><span class="token function">embed<span class="token punctuation">(</span></span><span class="token variable">$pathToFile</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">}</span>"<span class="token operator">></span>
<span class="token markup"><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>body</span><span class="token punctuation">></span></span></span></code></pre><h4>嵌入原始數據附件</h4><p>如果你已經有想嵌入原始數據,希望嵌入郵件模板,你可以調用 <code class=" language-php"><span class="token variable">$message</span></code> 變量的 <code class=" language-php">embedData</code> 方法:</p><pre class=" language-php"><code class=" language-php"><span class="token markup"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>body</span><span class="token punctuation">></span></span></span>
這是一張原始數據圖片:
<span class="token markup"><img src="{{ $message-></span><span class="token function">embedData<span class="token punctuation">(</span></span><span class="token variable">$data</span><span class="token punctuation">,</span> <span class="token variable">$name</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">}</span>"<span class="token operator">></span>
<span class="token markup"><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>body</span><span class="token punctuation">></span></span></span></code></pre><p><a name="markdown-mailables"></a></p><h2><a href="#markdown-mailables">Markdown 格式的 Mailables 類</a></h2><p>Markdown 格式的 mailable 消息允許你從預編譯的模板和你的 mailables 類中的郵件提醒組件中受益。因為消息是用 Markdown 格式寫的, Laravel 能為消息體渲染出漂亮、響應式的 HTML 模板,也能自動生成一個純文本的副本。</p><p><a name="generating-markdown-mailables"></a></p><h3>生成 Markdown 格式的 Mailables</h3><p>要生成一個包含友好的 Markdown 模板的 mailable 類,你在使用 <code class=" language-php">make<span class="token punctuation">:</span>mail</code> 這個 Artisan 命令時,要加上 <code class=" language-php"><span class="token operator">--</span>markdown</code> 選項:</p><pre class=" language-php"><code class=" language-php">php artisan make<span class="token punctuation">:</span>mail OrderShipped <span class="token operator">--</span>markdown<span class="token operator">=</span>emails<span class="token punctuation">.</span>orders<span class="token punctuation">.</span>shipped</code></pre><p>然后,在使用 <code class=" language-php">build</code> 方法配置 mailable 時,用 <code class=" language-php">markdown</code> 方法來換掉 <code class=" language-php">view</code> 方法, <code class=" language-php">markdown</code> 方法接受一個 Markdown 模板的名稱和一個將在模板中可用的選項數組:</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* 構建消息。
*
* @return $this
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">build<span class="token punctuation">(</span></span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token this">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">from<span class="token punctuation">(</span></span><span class="token string">'example@example.com'</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">markdown<span class="token punctuation">(</span></span><span class="token string">'emails.orders.shipped'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre><p><a name="writing-markdown-messages"></a></p><h3>編寫 Markdown 格式的消息</h3><p>Markdown mailables 使用 Blade 組件和 Markdown 語法的組合,允許你輕松地構建郵件消息,同時利用 Laravel 的預制組件。</p><pre class=" language-php"><code class=" language-php">@<span class="token function">component<span class="token punctuation">(</span></span><span class="token string">'mail::message'</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">
# Order Shipped
</span>
Your order has been shipped<span class="token operator">!</span>
@<span class="token function">component<span class="token punctuation">(</span></span><span class="token string">'mail::button'</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string">'url'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token variable">$url</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
View Order
@endcomponent
Thanks<span class="token punctuation">,</span><span class="token markup"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>br</span><span class="token punctuation">></span></span></span>
<span class="token punctuation">{</span><span class="token punctuation">{</span> <span class="token function">config<span class="token punctuation">(</span></span><span class="token string">'app.name'</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">}</span>
@endcomponent</code></pre><blockquote class="has-icon tip"><p><div class="flag"><span class="svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" version="1.1" x="0px" y="0px" width="56.6px" height="87.5px" viewBox="0 0 56.6 87.5" enable-background="new 0 0 56.6 87.5" xml:space="preserve"><path fill="#FFFFFF" d="M28.7 64.5c-1.4 0-2.5-1.1-2.5-2.5v-5.7 -5V41c0-1.4 1.1-2.5 2.5-2.5s2.5 1.1 2.5 2.5v10.1 5 5.8C31.2 63.4 30.1 64.5 28.7 64.5zM26.4 0.1C11.9 1 0.3 13.1 0 27.7c-0.1 7.9 3 15.2 8.2 20.4 0.5 0.5 0.8 1 1 1.7l3.1 13.1c0.3 1.1 1.3 1.9 2.4 1.9 0.3 0 0.7-0.1 1.1-0.2 1.1-0.5 1.6-1.8 1.4-3l-2-8.4 -0.4-1.8c-0.7-2.9-2-5.7-4-8 -1-1.2-2-2.5-2.7-3.9C5.8 35.3 4.7 30.3 5.4 25 6.7 14.5 15.2 6.3 25.6 5.1c13.9-1.5 25.8 9.4 25.8 23 0 4.1-1.1 7.9-2.9 11.2 -0.8 1.4-1.7 2.7-2.7 3.9 -2 2.3-3.3 5-4 8L41.4 53l-2 8.4c-0.3 1.2 0.3 2.5 1.4 3 0.3 0.2 0.7 0.2 1.1 0.2 1.1 0 2.2-0.8 2.4-1.9l3.1-13.1c0.2-0.6 0.5-1.2 1-1.7 5-5.1 8.2-12.1 8.2-19.8C56.4 12 42.8-1 26.4 0.1zM43.7 69.6c0 0.5-0.1 0.9-0.3 1.3 -0.4 0.8-0.7 1.6-0.9 2.5 -0.7 3-2 8.6-2 8.6 -1.3 3.2-4.4 5.5-7.9 5.5h-4.1H28h-0.5 -3.6c-3.5 0-6.7-2.4-7.9-5.7l-0.1-0.4 -1.8-7.8c-0.4-1.1-0.8-2.1-1.2-3.1 -0.1-0.3-0.2-0.5-0.2-0.9 0.1-1.3 1.3-2.1 2.6-2.1H41C42.4 67.5 43.6 68.2 43.7 69.6zM37.7 72.5H26.9c-4.2 0-7.2 3.9-6.3 7.9 0.6 1.3 1.8 2.1 3.2 2.1h4.1 0.5 0.5 3.6c1.4 0 2.7-0.8 3.2-2.1L37.7 72.5z"></path></svg></span></div> 當你在寫 Markdown 格式郵件的時候千萬不要有多余縮進,不然 Markdown 解析器很容易會把縮進的內容渲染成代碼塊。</p></blockquote><h4>按鈕組件</h4><p>按鈕連組件渲染一個居中的連接按鈕,組件接受兩個參數,一個 <code class=" language-php">url</code> 和一個可選的 <code class=" language-php">color</code> 。支持的顏色有 <code class=" language-php">blue</code> 、 <code class=" language-php">green</code> 、 和 <code class=" language-php">red</code> 。你可以在郵件消息體中加入隨便多個你想要的按鈕。</p><pre class=" language-php"><code class=" language-php">@<span class="token function">component<span class="token punctuation">(</span></span><span class="token string">'mail::button'</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string">'url'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token variable">$url</span><span class="token punctuation">,</span> <span class="token string">'color'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'green'</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
View Order
@endcomponent</code></pre><h4>面板組件</h4><p>面板組件將面板中給定的一塊文字的背景渲染成跟其他的消息體背景稍微不同。這樣可以讓這塊文字引起人們的注意。</p><pre class=" language-php"><code class=" language-php">@<span class="token function">component<span class="token punctuation">(</span></span><span class="token string">'mail::panel'</span><span class="token punctuation">)</span>
This is the panel content<span class="token punctuation">.</span>
@endcomponent</code></pre><h4>表格組件</h4><p>表格組件允許你將一個 Markdown 格式的表格轉換成一個 HTML 格式的表格。組件接受 Markdown 格式的表格作為它的內容。表格列對齊方式按照默認的 Markdown 對齊風格而定。</p><pre class=" language-php"><code class=" language-php">@<span class="token function">component<span class="token punctuation">(</span></span><span class="token string">'mail::table'</span><span class="token punctuation">)</span>
<span class="token operator">|</span> Laravel <span class="token operator">|</span> Table <span class="token operator">|</span> Example <span class="token operator">|</span>
<span class="token operator">|</span> <span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span> <span class="token operator">|</span><span class="token punctuation">:</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span><span class="token punctuation">:</span><span class="token operator">|</span> <span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token punctuation">:</span><span class="token operator">|</span>
<span class="token operator">|</span> Col <span class="token number">2</span> is <span class="token operator">|</span> Centered <span class="token operator">|</span> <span class="token variable">$10</span> <span class="token operator">|</span>
<span class="token operator">|</span> Col <span class="token number">3</span> is <span class="token operator">|</span> Right<span class="token operator">-</span>Aligned <span class="token operator">|</span> <span class="token variable">$20</span> <span class="token operator">|</span>
@endcomponent</code></pre><p><a name="customizing-the-components"></a></p><h3>自定義組件</h3><p>你或許會為了自定義而導出你應用中所有的 Markdown 郵件組件。要導出這些組件,使用 <code class=" language-php">vendor<span class="token punctuation">:</span>publish</code> 這個 Artisan 命令來發布資源文件標簽。</p><pre class=" language-php"><code class=" language-php">php artisan vendor<span class="token punctuation">:</span>publish <span class="token operator">--</span>tag<span class="token operator">=</span>laravel<span class="token operator">-</span>mail</code></pre><p>這個命令會發布 Markdown 郵件組件到 <code class=" language-php">resources<span class="token operator">/</span>views<span class="token operator">/</span>vendor<span class="token operator">/</span>mail</code> 文件夾。而 <code class=" language-php">mail</code> 文件夾會包含一個 <code class=" language-php">html</code> 文件夾和一個 <code class=" language-php">markdown</code> 文件夾,每個文件夾都包含他們的可用組件的描述。你可以按照你的意愿自定義這些組件。</p><h4>自定義樣式表 CSS</h4><p>在導出組件之后,<code class=" language-php">resources<span class="token operator">/</span>views<span class="token operator">/</span>vendor<span class="token operator">/</span>mail<span class="token operator">/</span>html<span class="token operator">/</span>themes</code> 文件夾將包含一個默認的 <code class=" language-php"><span class="token keyword">default</span><span class="token punctuation">.</span>css</code> 文件。你可以在這個文件中自定義 CSS ,你定義的這些樣式將會在 Markdown 格式消息體轉換成 HTML 格式時自動得到應用。</p><blockquote class="has-icon tip"><p><div class="flag"><span class="svg"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" version="1.1" x="0px" y="0px" width="56.6px" height="87.5px" viewBox="0 0 56.6 87.5" enable-background="new 0 0 56.6 87.5" xml:space="preserve"><path fill="#FFFFFF" d="M28.7 64.5c-1.4 0-2.5-1.1-2.5-2.5v-5.7 -5V41c0-1.4 1.1-2.5 2.5-2.5s2.5 1.1 2.5 2.5v10.1 5 5.8C31.2 63.4 30.1 64.5 28.7 64.5zM26.4 0.1C11.9 1 0.3 13.1 0 27.7c-0.1 7.9 3 15.2 8.2 20.4 0.5 0.5 0.8 1 1 1.7l3.1 13.1c0.3 1.1 1.3 1.9 2.4 1.9 0.3 0 0.7-0.1 1.1-0.2 1.1-0.5 1.6-1.8 1.4-3l-2-8.4 -0.4-1.8c-0.7-2.9-2-5.7-4-8 -1-1.2-2-2.5-2.7-3.9C5.8 35.3 4.7 30.3 5.4 25 6.7 14.5 15.2 6.3 25.6 5.1c13.9-1.5 25.8 9.4 25.8 23 0 4.1-1.1 7.9-2.9 11.2 -0.8 1.4-1.7 2.7-2.7 3.9 -2 2.3-3.3 5-4 8L41.4 53l-2 8.4c-0.3 1.2 0.3 2.5 1.4 3 0.3 0.2 0.7 0.2 1.1 0.2 1.1 0 2.2-0.8 2.4-1.9l3.1-13.1c0.2-0.6 0.5-1.2 1-1.7 5-5.1 8.2-12.1 8.2-19.8C56.4 12 42.8-1 26.4 0.1zM43.7 69.6c0 0.5-0.1 0.9-0.3 1.3 -0.4 0.8-0.7 1.6-0.9 2.5 -0.7 3-2 8.6-2 8.6 -1.3 3.2-4.4 5.5-7.9 5.5h-4.1H28h-0.5 -3.6c-3.5 0-6.7-2.4-7.9-5.7l-0.1-0.4 -1.8-7.8c-0.4-1.1-0.8-2.1-1.2-3.1 -0.1-0.3-0.2-0.5-0.2-0.9 0.1-1.3 1.3-2.1 2.6-2.1H41C42.4 67.5 43.6 68.2 43.7 69.6zM37.7 72.5H26.9c-4.2 0-7.2 3.9-6.3 7.9 0.6 1.3 1.8 2.1 3.2 2.1h4.1 0.5 0.5 3.6c1.4 0 2.7-0.8 3.2-2.1L37.7 72.5z"></path></svg></span></div> 如果你想為 Markdown 組件構建一個全新的主題,只要寫一個新的 CSS 文件,放在 <code class=" language-php">html<span class="token operator">/</span>themes</code> 文件夾,然后在你的 <code class=" language-php">mail</code> 配置文件中改變 <code class=" language-php">theme</code> 選項就可以了。</p></blockquote><p><a name="sending-mail"></a></p><h2><a href="#sending-mail">發送郵件</a></h2><p>要發送郵件,使用 <code class=" language-php">Mail</code> <a href="/docs/5.4/facades">facade</a> 的 <code class=" language-php">to</code> 方法。 <code class=" language-php">to</code> 方法接受一個郵件地址,一個 user 實現或一個 users 集合。如果傳遞一個對象或集合,mailer 將自動使用 <code class=" language-php">email</code> 和 <code class=" language-php">name</code> 屬性來設置郵件收件人,所以確保你的對象里有這些屬性。一旦指定收件人,你可以傳遞一個實現到 mailable 類的 <code class=" language-php">send</code> 方法:</p><pre class=" language-php"><code class=" language-php"><span class="token delimiter"><?php</span>
<span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation">\</span>Http<span class="token punctuation">\</span>Controllers</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">App<span class="token punctuation">\</span>Order</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">App<span class="token punctuation">\</span>Mail<span class="token punctuation">\</span>OrderShipped</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Http<span class="token punctuation">\</span>Request</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Support<span class="token punctuation">\</span>Facades<span class="token punctuation">\</span>Mail</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">App<span class="token punctuation">\</span>Http<span class="token punctuation">\</span>Controllers<span class="token punctuation">\</span>Controller</span><span class="token punctuation">;</span>
<span class="token keyword">class</span> <span class="token class-name">OrderController</span> <span class="token keyword">extends</span> <span class="token class-name">Controller</span>
<span class="token punctuation">{</span>
<span class="token comment" spellcheck="true">/**
* Ship the given order.
*
* @param Request $request
* @param int $orderId
* @return Response
*/</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">ship<span class="token punctuation">(</span></span>Request <span class="token variable">$request</span><span class="token punctuation">,</span> <span class="token variable">$orderId</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token variable">$order</span> <span class="token operator">=</span> <span class="token scope">Order<span class="token punctuation">::</span></span><span class="token function">findOrFail<span class="token punctuation">(</span></span><span class="token variable">$orderId</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment" spellcheck="true"> // Ship order...
</span>
<span class="token scope">Mail<span class="token punctuation">::</span></span><span class="token function">to<span class="token punctuation">(</span></span><span class="token variable">$request</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">user<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">send<span class="token punctuation">(</span></span><span class="token keyword">new</span> <span class="token class-name">OrderShipped</span><span class="token punctuation">(</span><span class="token variable">$order</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre><p>當然,不局限于只使用「to」給收件人發送郵件,你可以通過一個單一的鏈式調用來自由的設置 「to」,「cc」和 「bcc」接收者:</p><pre class=" language-php"><code class=" language-php"><span class="token scope">Mail<span class="token punctuation">::</span></span><span class="token function">to<span class="token punctuation">(</span></span><span class="token variable">$request</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">user<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">cc<span class="token punctuation">(</span></span><span class="token variable">$moreUsers</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">bcc<span class="token punctuation">(</span></span><span class="token variable">$evenMoreUsers</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">send<span class="token punctuation">(</span></span><span class="token keyword">new</span> <span class="token class-name">OrderShipped</span><span class="token punctuation">(</span><span class="token variable">$order</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p><a name="queueing-mail"></a></p><h3>隊列 Mail</h3><h4>將郵件消息加入隊列</h4><p>由于發送消息會大幅延遲應用響應時間,許多開發者選擇將郵件消息加入隊列在后臺進行發送。Laravel 使用內置的 <a href="/docs/5.4/queues">統一的隊列 API</a> 來輕松完成此工作。將郵件消息加入隊列,使用 <code class=" language-php">Mail</code> facade 的 <code class=" language-php">queue</code> 方法:</p><pre class=" language-php"><code class=" language-php"><span class="token scope">Mail<span class="token punctuation">::</span></span><span class="token function">to<span class="token punctuation">(</span></span><span class="token variable">$request</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">user<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">cc<span class="token punctuation">(</span></span><span class="token variable">$moreUsers</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">bcc<span class="token punctuation">(</span></span><span class="token variable">$evenMoreUsers</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">queue<span class="token punctuation">(</span></span><span class="token keyword">new</span> <span class="token class-name">OrderShipped</span><span class="token punctuation">(</span><span class="token variable">$order</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>這個方法會自動將工作加入隊列,以便后臺發送郵件。當然,在使用這個功能前,你需要 <a href="/docs/5.4/queues">設置你的隊列</a> 。</p><h4>延遲郵件消息隊列</h4><p>如果你希望延遲發送已加入隊列的郵件消息,你可以使用 <code class=" language-php">later</code> 方法。<code class=" language-php">later</code> 第一個參數接受一個 <code class=" language-php">DateTime</code> 實現以告知這個消息應該何時發送:</p><pre class=" language-php"><code class=" language-php"><span class="token variable">$when</span> <span class="token operator">=</span> <span class="token scope">Carbon<span class="token punctuation">\</span>Carbon<span class="token punctuation">::</span></span><span class="token function">now<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">addMinutes<span class="token punctuation">(</span></span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token scope">Mail<span class="token punctuation">::</span></span><span class="token function">to<span class="token punctuation">(</span></span><span class="token variable">$request</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">user<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">cc<span class="token punctuation">(</span></span><span class="token variable">$moreUsers</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">bcc<span class="token punctuation">(</span></span><span class="token variable">$evenMoreUsers</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">later<span class="token punctuation">(</span></span><span class="token variable">$when</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">OrderShipped</span><span class="token punctuation">(</span><span class="token variable">$order</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><h4>推送到特定隊列</h4><p>因為所有 mailable 類是通過 <code class=" language-php">make<span class="token punctuation">:</span>mail</code> 命令生成并使用 <code class=" language-php">Illuminate\<span class="token package">Bus<span class="token punctuation">\</span>Queueable</span></code> trait ,你可以在任何 mailable 類實現中調用 <code class=" language-php">onQueue</code> 來指定隊列名稱,還有 <code class=" language-php">onConnection</code> 方法來指定隊列鏈接名稱:</p><pre class=" language-php"><code class=" language-php"><span class="token variable">$message</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">OrderShipped</span><span class="token punctuation">(</span><span class="token variable">$order</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">onConnection<span class="token punctuation">(</span></span><span class="token string">'sqs'</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">onQueue<span class="token punctuation">(</span></span><span class="token string">'emails'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token scope">Mail<span class="token punctuation">::</span></span><span class="token function">to<span class="token punctuation">(</span></span><span class="token variable">$request</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">user<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">cc<span class="token punctuation">(</span></span><span class="token variable">$moreUsers</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">bcc<span class="token punctuation">(</span></span><span class="token variable">$evenMoreUsers</span><span class="token punctuation">)</span>
<span class="token operator">-</span><span class="token operator">></span><span class="token function">queue<span class="token punctuation">(</span></span><span class="token variable">$message</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><h4>默認隊列</h4><p>如果你的 mailable 類想要默認使用隊列,你可以在類中實現 <code class=" language-php">ShouldQueue</code> 接口契約。現在,即便你調用 <code class=" language-php">send</code> 方法來發送郵件, mailable 類仍將郵件放入隊列中發送。</p><pre class=" language-php"><code class=" language-php"><span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Contracts<span class="token punctuation">\</span>Queue<span class="token punctuation">\</span>ShouldQueue</span><span class="token punctuation">;</span>
<span class="token keyword">class</span> <span class="token class-name">OrderShipped</span> <span class="token keyword">extends</span> <span class="token class-name">Mailable</span> <span class="token keyword">implements</span> <span class="token class-name">ShouldQueue</span>
<span class="token punctuation">{</span>
<span class="token comment" spellcheck="true"> //
</span><span class="token punctuation">}</span></code></pre><p><a name="mail-and-local-development"></a></p><h2><a href="#mail-and-local-development">郵件和本地開發</a></h2><p>當應用開發發送郵件時,你或許不想真實的發送郵件到真實的郵件地址。Laravel 提供幾種方法以在本地開發時真實發送 「失去能力」。</p><h4>日志驅動</h4><p>代替真實發送,<code class=" language-php">log</code> 郵件驅動將所有郵件消息寫入日志文件以供檢查,需要更多根據環境來設置應用程序的信息,可參考 <a href="/docs/5.4/installation#environment-configuration">配置文件</a>.</p><h4>通用收件者</h4><p>另一個由 Laravel 提供的解決方案是設置一個通用郵件接收者,由框架發送郵件。這個方法將所有郵件發送到一個郵件地址,而不是發送給實際收件人。這可以通過 <code class=" language-php">config<span class="token operator">/</span>mail<span class="token punctuation">.</span>php</code> 配置文件的 <code class=" language-php">to</code> 選項來完成:</p><pre class=" language-php"><code class=" language-php"><span class="token string">'to'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>
<span class="token string">'address'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'example@example.com'</span><span class="token punctuation">,</span>
<span class="token string">'name'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token string">'Example'</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span></code></pre><h4>Mailtrap</h4><p>最后,你可以使用像 <a href="https://mailtrap.io">Mailtrap</a> 和 <code class=" language-php">smtp</code> 驅動來將你的郵件消息發送到一個 「虛假的」郵箱中,你卻可以在一個真實的郵件客戶端中查看它們。這個方法的好處是讓你可以在 Mailtrap 的消息閱讀器中查看最終的實際郵件。</p><p><a name="events"></a></p><h2><a href="#events">事件</a></h2><p>Laravel 會在發送郵件消息之前觸發一個事件。切記,這個事件只會在郵件 <em>發送</em> 時觸發,在加入隊列時不觸發。你可以在你的 <code class=" language-php">EventServiceProvider</code> 注冊一個事件監聽器:</p><pre class=" language-php"><code class=" language-php"><span class="token comment" spellcheck="true">/**
* 應用事件監聽映射。
*
* @var array
*/</span>
<span class="token keyword">protected</span> <span class="token variable">$listen</span> <span class="token operator">=</span> <span class="token punctuation">[</span>
<span class="token string">'Illuminate\Mail\Events\MessageSending'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span>
<span class="token string">'App\Listeners\LogSentMessage'</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">;</span></code></pre><h2>譯者署名</h2><table><thead><tr><th>用戶名</th><th>頭像</th><th>職能</th><th>簽名</th></tr></thead><tbody><tr><td><a href="https://github.com/qufo">@qufo</a></td><td><img class="avatar-66 rm-style" src="https://avatars1.githubusercontent.com/u/2526883?v=3&s=460?imageView2/1/w/100/h/100"></td><td>翻譯</td><td>歡迎共同探討。<a href="https://github.com/qufo">@Qufo</a></td></tr></tbody></table></article>
- 入門指南
- 安裝
- 配置信息
- 文件夾結構
- 請求周期
- 開發環境部署
- Valet
- Homestead
- 核心概念
- 服務提供者
- Facades
- Contracts
- 服務容器
- HTTP 層
- 路由
- 中間件
- CSRF 保護
- 控制器
- 請求
- 響應
- 視圖
- Session
- 表單驗證
- 前端
- Blade 模板
- 本地化
- 前端指南
- 編輯資源 Mix
- 安全
- API 認證
- 用戶認證
- 用戶授權
- 加密解密
- 哈希
- 重置密碼
- 數據庫
- 快速入門
- 查詢構造器
- 分頁
- 數據庫遷移
- Redis
- 數據填充
- Eloquent ORM
- Eloquent ORM快速入門
- 模型關聯
- Eloquent 集合
- 修改器
- 序列化
- 綜合話題
- Artisan 命令行
- 廣播系統
- 緩存系統
- 集合
- 錯誤與日志
- 事件系統
- 文件存儲
- 輔助函數
- 郵件發送
- 消息通知
- 擴展包開發
- 隊列
- 任務調度