首页 > 文章列表 > Laravel教程:如何发送电子邮件

Laravel教程:如何发送电子邮件

laravel 邮件 发送
133 2023-08-31

在本文中,我们将探索 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_HOSTMAIL_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类通常实现两个重要的方法:__constructbuild__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>&nbsp;{{ $demo->demo_one }}</p>
<p><b>Demo Two:</b>&nbsp;{{ $demo->demo_two }}</p>
</div>
 
<p><u>Values passed by With method:</u></p>
 
<div>
<p><b>testVarOne:</b>&nbsp;{{ $testVarOne }}</p>
<p><b>testVarTwo:</b>&nbsp;{{ $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 类

在本节中,我们将创建一个示例来演示如何使用上一节中创建的 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 上学习各种内容。