核心要点
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中文网其他相关文章!