在本文中,我们将探索 Laravel Web 框架中的 Mail API。 Laravel 使用流行的 Symfony Mailer 组件,该组件易于使用,并且附带多种电子邮件驱动程序可供选择。
稍后,我将向您展示本文前半部分讨论的概念的深入演示。
Laravel 在 Symfony Mailer 组件之上实现了一个包装器,使电子邮件管理非常易于配置和使用。您可以在 config/mail.php 中找到默认邮件设置。
<?php return [ /* |-------------------------------------------------------------------------- | Default Mailer |-------------------------------------------------------------------------- | | This option controls the default mailer that is used to send any email | messages sent by your application. Alternative mailers may be set up | and used as needed; however, this mailer will be used by default. | */ 'default' => env('MAIL_MAILER', 'smtp'), /* |-------------------------------------------------------------------------- | Mailer Configurations |-------------------------------------------------------------------------- | | Here you may configure all of the mailers used by your application plus | their respective settings. Several examples have been configured for | you, and you are free to add your own as your application requires. | | Laravel supports a variety of mail "transport" drivers to be used while | sending an email. You will specify which one you are using for your | mailers below. You are free to add additional mailers as required. | | Supported: "smtp", "sendmail", "mailgun", "ses", | "postmark", "log", "array" | */ 'mailers' => [ 'smtp' => [ 'transport' => 'smtp', 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), 'port' => env('MAIL_PORT', 587), 'encryption' => env('MAIL_ENCRYPTION', 'tls'), 'username' => env('MAIL_USERNAME'), 'password' => env('MAIL_PASSWORD'), 'timeout' => null, 'auth_mode' => null, ], 'ses' => [ 'transport' => 'ses', ], 'mailgun' => [ 'transport' => 'mailgun', ], 'postmark' => [ 'transport' => 'postmark', ], 'sendmail' => [ 'transport' => 'sendmail', 'path' => '/usr/sbin/sendmail -bs', ], 'log' => [ 'transport' => 'log', 'channel' => env('MAIL_LOG_CHANNEL'), ], 'array' => [ 'transport' => 'array', ], ], /* |-------------------------------------------------------------------------- | Global "From" Address |-------------------------------------------------------------------------- | | You may wish for all emails sent by your application to be sent from | the same address. Here, you may specify a name and address that is | used globally for all emails that are sent by your application. | */ 'from' => [ 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), 'name' => env('MAIL_FROM_NAME', 'Example'), ], /* |-------------------------------------------------------------------------- | Markdown Mail Settings |-------------------------------------------------------------------------- | | If you are using Markdown-based email rendering, you may configure your | theme and component paths here, allowing you to customize the design | of the emails. Or you may simply stick with the Laravel defaults! | */ 'markdown' => [ 'theme' => 'default', 'paths' => [ resource_path('views/vendor/mail'), ], ], ];
在发送电子邮件方面,Laravel 支持多种驱动程序可供选择。如您所见,默认的 MAIL_DRIVER
设置为 smtp
。因此,如果您想将其更改为其他内容,则需要更改 .env 文件中的 MAIL_MAILER
变量,因为这是 config/mail.php 文件的所在位置读取邮件程序值。
如果您要使用 smtp
驱动发送邮件,那么您还需要设置其他相关设置,如 MAIL_HOST
、MAIL_PORT
、 class="inline">MAIL_ENCRYPTION、 class="inline">MAIL_USERNAME 和 .env 文件中的 MAIL_PASSWORD
。
另一方面,如果您要使用 sendmail
驱动程序,那么您需要确保 sendmail
系统路径设置为正确的值config/mail.php 文件。
您还可以设置 from
地址,该地址将在 from
键下发送电子邮件时使用。最后,如果您想使用基于 Markdown 的电子邮件渲染,您可以在 markdown
键下指定这些设置。
最重要的是,您还可以使用第三方电子邮件服务提供商,例如 Mailgun、Postmark、SES 等。如果您正在使用其中一项服务,则需要确保在 config/services.php 文件中设置相应的设置。
这就是 Laravel 中邮件 API 相关设置的基本介绍。从下一节开始,我们将通过一个自定义示例向您展示如何发送电子邮件。
在本节中,我们将创建 mailable 类,它将用于发送电子邮件。 mailable 类负责使用在 config/mail.php 文件中配置的邮件程序发送电子邮件。事实上,Laravel 已经提供了一个 artisan 命令,允许我们创建一个基本模板。
php artisan make:mail DemoEmail
这应该在 app/Mail/DemoEmail.php 中创建一个空白电子邮件模板,如以下代码片段所示。
<?php namespace AppMail; use IlluminateBusQueueable; use IlluminateContractsQueueShouldQueue; use IlluminateMailMailable; use IlluminateQueueSerializesModels; class DemoEmail extends Mailable { use Queueable, SerializesModels; /** * Create a new message instance. * * @return void */ public function __construct() { // } /** * Build the message. * * @return $this */ public function build() { return $this->view('view.name'); } }
让我们用以下内容替换该文件的内容。
<?php namespace AppMail; use IlluminateBusQueueable; use IlluminateContractsQueueShouldQueue; use IlluminateMailMailable; use IlluminateQueueSerializesModels; class DemoEmail extends Mailable { use Queueable, SerializesModels; /** * The demo object instance. * * @var Demo */ public $demo; /** * Create a new message instance. * * @return void */ public function __construct($demo) { $this->demo = $demo; } /** * Build the message. * * @return $this */ public function build() { return $this->from('sender@example.com') ->view('mails.demo') ->text('mails.demo_plain') ->with( [ 'testVarOne' => '1', 'testVarTwo' => '2', ]) ->attach(public_path('/images').'/demo.jpg', [ 'as' => 'demo.jpg', 'mime' => 'image/jpeg', ]); } }
mailable类通常实现两个重要的方法:__construct
和build
。 __construct
方法用于初始化您应该在电子邮件模板中使用的对象。另一方面,build
方法用于初始化更多特定于电子邮件的值,例如发件人、视图模板和附件。
在我们的例子中,我们将 $demo
对象作为构造函数参数传递,并将其分配给 demo
公共属性。
在 build
方法中,我们初始化了电子邮件特定的配置。
from
用于设置将用作发件人地址的电子邮件地址。view
方法,您可以设置使用此邮件发送电子邮件时将使用的电子邮件模板。在我们的例子中,我们将其设置为 mails.demo
,这意味着您需要在 resources/views/mails/demo.blade.php强>.text
方法用于设置电子邮件模板的纯文本版本。__construct
方法用于设置将在电子邮件模板中使用的对象。您还可以使用 with
方法,该方法允许您设置消息的视图数据。attach
方法将图像附加到消息中。请确保该图像可在 public/images/demo.jpg 中获取。当然,我们需要创建发送电子邮件时使用的电子邮件模板。继续创建一个文件resources/views/mails/demo.blade.php,如以下代码片段所示。
Hello <i>{{ $demo->receiver }}</i>, <p>This is a demo email for testing purposes! Also, it's the HTML version.</p> <p><u>Demo object values:</u></p> <div> <p><b>Demo One:</b> {{ $demo->demo_one }}</p> <p><b>Demo Two:</b> {{ $demo->demo_two }}</p> </div> <p><u>Values passed by With method:</u></p> <div> <p><b>testVarOne:</b> {{ $testVarOne }}</p> <p><b>testVarTwo:</b> {{ $testVarTwo }}</p> </div> Thank You, <br/> <i>{{ $demo->sender }}</i>
另外,让我们在 resources/views/mails/demo_plain.blade.php 创建该文件的纯文本版本。
Hello {{ $demo->receiver }}, This is a demo email for testing purposes! Also, it's the HTML version. Demo object values: Demo One: {{ $demo->demo_one }} Demo Two: {{ $demo->demo_two }} Values passed by With method: testVarOne: {{ $testVarOne }} testVarOne: {{ $testVarOne }} Thank You, {{ $demo->sender }}
这就是您可以使用的可邮寄类,我们还没有完成,因为我们需要使用 Mail
外观来实际发送电子邮件。在下一节中,我们将探讨如何使用 Mail
Facade 使用本节中刚刚创建的 DemoEmail
Mailable 类发送电子邮件。
在本节中,我们将创建一个示例来演示如何使用上一节中创建的 Mailable
类。
让我们使用以下命令创建一个控制器。
php artisan make:controller MailController
这应该在 app/Http/Controllers/MailController.php 处创建一个包含以下内容的空白控制器文件。
<?php namespace AppHttpControllers; use IlluminateHttpRequest; class MailController extends Controller { // }
让我们将其替换为以下内容。
<?php namespace AppHttpControllers; use AppHttpControllersController; use AppMailDemoEmail; use IlluminateSupportFacadesMail; class MailController extends Controller { public function send() { $objDemo = new stdClass(); $objDemo->demo_one = 'Demo One Value'; $objDemo->demo_two = 'Demo Two Value'; $objDemo->sender = 'SenderUserName'; $objDemo->receiver = 'ReceiverUserName'; Mail::to("receiver@example.com")->send(new DemoEmail($objDemo)); } }
值得注意的是,我们已经包含了 IlluminateSupportFacadesMail
Facade,它将用于发送电子邮件。在 send
方法中,以下语句负责通过首先初始化 AppMailDemoEmail
Mailable 来发送电子邮件。
Mail::to("receiver@example.com")->send(new DemoEmail($objDemo));
IlluminateSupportFacadesMail
Facade 返回 IlluminateMailPendingMail
类的实例,其中已包含在 config/mail.php 文件中配置的适当邮件程序。
最后,我们使用 IlluminateMailPendingMail
类的 send
方法来发送实际的电子邮件。
为了测试它,我们在 routes/web.php 文件中添加关联的路由。
// Email related routes Route::get('mail/send', 'MailController@send');
完成后,您可以访问 https://your-laravel-site.com/mail/send URL 看看它是否按预期工作。
另一方面,如果您想快速测试电子邮件模板而不发送实际电子邮件,Laravel 中有一项规定允许您记录所有外发电子邮件。
为此,您需要在 config/mail.php 文件中将 MAIL_DRIVER
的值设置为 log
。接下来,您可以运行上述 URL 并检查日志文件以检查电子邮件模板是否已记录在那里。
如果一切顺利,您应该会看到一封电子邮件被记录到 storage/logs/laravel.log 文件中。
这就是 Laravel 中邮件功能的全部内容,本文也到此结束。
今天,我们了解了 Laravel 内置的邮件 API,它也支持各种驱动程序。
从基本概念开始,我们实现了 mailable 类,它是 Laravel 中邮件 API 中的基本元素。最后,我们还通过创建自定义控制器来测试 mailable 类,看看它是否确实有效。
如果您刚刚开始使用 Laravel 或希望通过扩展扩展您的知识、网站或应用程序,您可以在 Envato Market 上学习各种内容。