核心要點
php artisan email:parse
,該命令可以在 Artisan 中註冊並執行以從 IO 流中檢索原始郵件。 php-mime-mail-parser
等包可以將原始郵件解析為單獨的部分。這允許檢索郵件的主題和正文等標頭。然後可以輕鬆地將解析後的郵件存儲在數據庫中。 引言
在項目管理或支持管理工具中,您會經常看到這種情況:您可以回復電子郵件,它會自動顯示在 Web 應用程序中。這些工具能夠將這些電子郵件直接導入其係統。
在本文中,我們將了解如何將電子郵件傳遞到我們的 Laravel 4 應用程序。為此,我們從一個全新的 Laravel 4 項目開始,該項目通過 Composer 安裝,如下所示。
<code class="language-bash">composer create-project laravel/laravel your-project-name --prefer-dist</code>
創建 Artisan 命令
為了能夠將電子郵件導入我們的應用程序,我們必須通過命令行將電子郵件傳遞到我們的應用程序。幸運的是,Laravel 有一個名為 Artisan 的命令行工具,它能夠執行多個任務。要查看 Artisan 可以運行的所有任務的列表,您可以在項目的根目錄中運行 php artisan list
。
在這種情況下,我們希望它執行一項非常具體的任務:接受原始電子郵件並在我們的應用程序中使用它。不幸的是,這不是 Artisan 可以處理的基本功能之一。我們可以使用新命令輕鬆擴展它:php artisan email:parse
。然後,我們將啟動 Artisan 並執行特定任務,在本例中稱為 email:parse
。
我們的第一步是創建此命令。您可以通過 Artisan 自己的創建新命令的命令來創建新命令。只需在項目的根目錄中運行以下命令:
<code class="language-bash">php artisan command:make EmailParserCommand</code>
如果一切順利,您現在將在 app/commands
目錄中找到一個名為 EmailParserCommand.php
的文件。在您喜歡的編輯器中打開它,並查看 $name
和 $description
屬性。我們可以根據需要自定義它。通過為其提供清晰的名稱和描述,該命令將在 Artisan 命令列表中很好地列出。
例如,我將其更改為此:
<code class="language-php">/** * 控制台命令名称。 * * @var string */ protected $name = 'email:parse'; /** * 控制台命令描述。 * * @var string */ protected $description = '解析传入的电子邮件。';</code>
註冊命令
當我們在項目的根目錄中運行 php artisan email:parse
時,您將收到一條消息,指出此命令尚未註冊。我們的下一步是確保此命令在 Artisan 中註冊。讓我們打開 app/start/artisan.php
文件,並將 Artisan::add(new EmailParserCommand);
添加到文件的末尾以註冊我們新創建的命令。我們現在可以再次運行 list
命令來查看我們列出的 email:parse
命令。請注意,您剛剛填寫的名稱和描述將在此處顯示。
檢索原始電子郵件
每當通過 Artisan 調用命令時,它總是會調用 fire
方法。因此,最初我們必須在此處添加我們的電子郵件解析。電子郵件當前位於我們的 IO 流中,我們可以從 php://stdin
中檢索它。我們打開此 IO 流,然後收集少量電子郵件,直到我們讀取整個流。
<code class="language-bash">composer create-project laravel/laravel your-project-name --prefer-dist</code>
發送到我們的 Artisan 命令的電子郵件現在位於 $rawEmail
變量中。它是整個電子郵件,包含標頭、正文和任何附件。
解析電子郵件
我們現在有了原始電子郵件,但我更希望將電子郵件分成多個部分。我想檢索諸如主題和郵件正文之類的標頭。我們可以編寫我們自己的代碼來分割所有這些部分,但有人已經創建了一個我們可以在我們的應用程序中使用的包。此包能夠將我們的整個電子郵件分成邏輯部分。將以下行添加到您的 composer.json
文件中並運行 composer update
<code class="language-bash">php artisan command:make EmailParserCommand</code>
現在我們需要確保我們實際上可以在我們的命令中使用此包,因此我們再次打開我們的 app/command/EmailParserCommand.php
,並將以下幾行添加到頂部:
<code class="language-php">/** * 控制台命令名称。 * * @var string */ protected $name = 'email:parse'; /** * 控制台命令描述。 * * @var string */ protected $description = '解析传入的电子邮件。';</code>
現在我們可以將原始電子郵件解析為單獨的部分。將以下幾行代碼添加到 fire
方法的末尾。
<code class="language-php">/** * 执行控制台命令。 * * @return void */ public function fire() { // 从 stdin 读取 $fd = fopen("php://stdin", "r"); $rawEmail = ""; while (!feof($fd)) { $rawEmail .= fread($fd, 1024); } fclose($fd); }</code>
我們首先創建一個新的解析器。接下來,我們將原始電子郵件設置為解析器的文本,最後,我們調用各種不同的方法來從標頭或正文中獲取數據。
您現在可以輕鬆地將電子郵件存儲在數據庫中。例如,如果您有一個電子郵件實體,您可以像這樣將電子郵件保存到您的數據庫:
<code class="language-json">"messaged/php-mime-mail-parser": "dev-master"</code>
處理附件
您甚至可能希望將附加到電子郵件的任何附件存儲在您的服務器上。電子郵件解析器類可以處理任何可用的附件。首先,再次將以下幾行添加到 app/command/EmailParserCommand.php
類的頂部。
<code class="language-php">use MimeMailParser\Parser;</code>
現在我們必須用一些將處理附件的代碼擴展我們的 fire
方法:
<code class="language-bash">composer create-project laravel/laravel your-project-name --prefer-dist</code>
讓我們看看這部分實際上做了什麼。第一行從電子郵件中檢索附件。 $attachments
變量是一個附件對象的數組。接下來,我們確保創建了一個新的 FileSystem 對象,它將處理在我們的服務器上保存文件。然後我們開始迭代所有附件。我們調用 FileSystem 對象的 put
方法,它接受文件的路徑和內容。在這種情況下,我們想將文件添加到 public/uploads
目錄並使用附件實際具有的文件名。第二個參數是實際文件的內容。
就是這樣!您的文件現在存儲在 public/uploads
中。只需確保您的郵件服務器可以通過設置正確的權限來實際將文件添加到此目錄。
配置我們的郵件服務器
到目前為止,我們已經準備好了整個應用程序來檢索、分割和保存我們的電子郵件。但是,如果您不知道如何將電子郵件實際發送到您新創建的 Artisan 命令,則此代碼毫無用處。
下面您將找到將電子郵件傳遞到您的應用程序的不同方法,具體取決於您使用的工具或郵件服務器。例如,我想將 support@peternijssen.nl
轉發到我的應用程序,該應用程序位於 /var/www/supportcenter
。
請注意,在下面您將看到的實際命令中,我每次都添加了 --env=local
,以確保 Artisan 的運行方式就像我們在開發機器上一樣。如果您處於生產環境中,則可以刪除此部分。
如果您使用的是 CPanel,您可以點擊常規菜單中的轉發器。添加一個新的轉發器並定義您想轉發到您的應用程序的地址。單擊高級設置並選擇管道到程序選項。 在輸入字段中,您可以插入以下行:
<code class="language-bash">php artisan command:make EmailParserCommand</code>
請注意,CPanel 使用相對於您的主目錄的路徑。
如果在 Exim 上,請打開文件 /etc/valiases/peternijssen.nl
。
確保此文件中存在以下行:
<code class="language-php">/** * 控制台命令名称。 * * @var string */ protected $name = 'email:parse'; /** * 控制台命令描述。 * * @var string */ protected $description = '解析传入的电子邮件。';</code>
運行 newaliases
以重建別名數據庫。
在 Postfix 上,請確保在繼續之前,以下幾行存在於您的 /etc/postfix/main.cf
文件中並且未被註釋:
<code class="language-php">/** * 执行控制台命令。 * * @return void */ public function fire() { // 从 stdin 读取 $fd = fopen("php://stdin", "r"); $rawEmail = ""; while (!feof($fd)) { $rawEmail .= fread($fd, 1024); } fclose($fd); }</code>
如果您必須更改文件,請通過運行 service postfix reload
來重新加載 postfix。
我們現在可以創建一個新的別名,它將被傳遞到我們的應用程序。
打開 /etc/aliases
並添加以下行:
<code class="language-json">"messaged/php-mime-mail-parser": "dev-master"</code>
運行 newaliases
以重建別名數據庫。
使用 Sendmail,您應該首先在 /etc/aliases
文件中創建一個別名:
<code class="language-php">use MimeMailParser\Parser;</code>
運行 newaliases
以重建別名數據庫。接下來,確保 Artisan 文件的 chmod 為 755,以便可以執行。
最後,將 artisan 文件和 php 本身符號鏈接到 /etc/smrsh
<code class="language-bash">composer create-project laravel/laravel your-project-name --prefer-dist</code>
根據您的安裝情況,您必須確保存在以下文件:
<code class="language-bash">php artisan command:make EmailParserCommand</code>
或:
<code class="language-php">/** * 控制台命令名称。 * * @var string */ protected $name = 'email:parse'; /** * 控制台命令描述。 * * @var string */ protected $description = '解析传入的电子邮件。';</code>
打開任一文件並將以下行添加為內容:
<code class="language-php">/** * 执行控制台命令。 * * @return void */ public function fire() { // 从 stdin 读取 $fd = fopen("php://stdin", "r"); $rawEmail = ""; while (!feof($fd)) { $rawEmail .= fread($fd, 1024); } fclose($fd); }</code>
結論
任何具有可用命令行工具的框架都能夠處理您的電子郵件。此處提供的代碼只是一個基本設置。根據您的項目,您可能只想允許某些電子郵件地址向您的應用程序發送電子郵件。在傳遞到您的應用程序之前,請確保您已經在 postfix 等工具中過濾了電子郵件。
如果您想使用某種票務系統,您可以輕鬆嘗試從電子郵件主題中提取支持票證 ID,並根據該 ID 對電子郵件執行多個不同的操作。
密切關注郵件服務器的日誌文件。當實際管道在如何解決它方面失敗時,它會為您提供一些提示。
(由於篇幅限制,FAQs部分略去。 原FAQs內容與文章主題關聯性較弱,且部分內容與文章內容重複,故不進行偽原創處理。)
以上是將電子郵件提供給Laravel應用程序的詳細內容。更多資訊請關注PHP中文網其他相關文章!