在Laravel 8中使用Gmail的SMTP服务器发送邮件(详细教程)

1,384 阅读7分钟

发送电子邮件已经成为现代网络应用的一个重要组成部分。例如, 它们是与用户沟通的一个很好的方式, 当他们注册的时候, 当验证注册的时候, 以及重设密码的时候.

因此,在本教程中,你将学习如何在Laravel中使用Gmail SMTP服务器发送电子邮件。

前提条件

要学习本教程,你需要以下条件:

概述

在某些情况下,你的本地服务器在使用默认的PHPmail() 方法时,可能无法发送邮件,或者让它的发送变得相当麻烦。在这种情况下,使用一个专门的电子邮件库,如Symfony的Mailer组件,可以是一个实用的替代方案。

你也可以使用Laravel支持的许多电子邮件驱动,包括Mailgun,Amazon SES, 和Postmark.然而, 在本教程中, 你将学习如何配置Laravel来使用Gmail的SMTP服务器发送邮件.

你将创建一个用于通讯订阅的API。用户将通过提交他们的电子邮件地址来订阅新闻简报。这样做后,他们的电子邮件地址将被存储在数据库中,并向他们发送一封 "感谢您的订阅 "的邮件。

使用Gmail的SMTP服务器的好处

  • 使用Gmail的SMTP服务器有助于确保邮件不被储存在收件人的垃圾邮件文件夹中。
  • 由于其服务器的稳定性和稳定的性能,它是许多用户进行电子邮件通信的突出选择。

也就是说,要知道,谷歌对免费账户有一些限制,例如,,每天最多可以发送100封邮件。

创建Laravel应用程序

你可以通过Composer创建一个新的Laravel应用程序,或者将Laravel安装程序作为一个全局Composer依赖项安装。我们将在本教程中使用Laravel安装器,在终端运行以下命令:

laravel new mail_article

这将在一个新的目录下创建一个新的Laravel应用程序,名为mail_article。接下来, 改变到新的项目目录,并通过运行以下命令启动应用程序:

cd mail_article
php artisan serve

默认情况下, 该项目是在本地主机的8000端口服务.我们可以通过在浏览器中输入http://localhost:8000来访问它。你应该看到一个类似于下图的页面,确认你的项目正在运行。看到这一点后,按Ctrl+C停止该程序。

The default Laravel home page

添加Gmail SMTP服务器配置

Laravel在config/mail.php中存储电子邮件配置。默认情况下, 它被设置为使用SMTP。我们不需要编辑config/mail.php, 但是, 因为我们可以在*.env*中提供必要的信息, 它存储了我们的环境变量.config/mail.php将, 反过来, 从那里获取所需的细节.

打开 .env,并更新以下变量:

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=465
MAIL_USERNAME=<Enter your Gmail address>
MAIL_PASSWORD=<Enter your Gmail password>
MAIL_ENCRYPTION=ssl
MAIL_FROM_NAME=Newsletter

注意不要使用引号(",',)或空格。

配置谷歌账户设置

现在电子邮件配置已经更新,我们需要在我们的Gmail账户中配置一些安全设置。要做到这一点,请登录Gmail,并从个人资料(cog)选项中选择 "管理你的谷歌账户"。然后,在 "不太安全的应用程序 "下,选择 "安全",点击 "打开访问(不推荐)",并拨动 "允许不太安全的应用程序 "右侧的选项。关闭"。

Less secure app access enabled in a Google Account

这是因为,在默认情况下,Gmail不会让*"不太安全*"的应用程序有机会使用你的Gmail账户。

了解这个术语的含义很重要。不太安全描述了一类第三方应用程序,它们从根本上不如使用像OAuth这样的授权系统来获得你的凭证安全。OAuth不会让第三方应用程序访问你的凭证,它只为某些服务提供授权。

设置模型和迁移

现在我们已经做了必要的配置修改,让我们来添加订阅用户的代码。

首先,通过运行下面的命令,同时创建模型和数据库迁移:

php artisan make:model Subscriber -m

这将在app/Models目录下创建一个名为Subscriber.php模型文件,并在数据库/migrations目录下创建一个名为create_subscriber_table.php迁移文件。

更新Subscriber.php,将下面的代码添加到文件的顶部,使Model大量分配

protected $guarded = [];

然后,更新迁移文件中的up() 方法,增加一个email 字段,如下例所示:

Schema::create('subscribers', function (Blueprint $table) {
    $table->id();
    $table->string('email');
    $table->timestamps();
});

建立数据库连接

为了设置应用程序的数据库,在*.env*中,更新数据库配置,使其与下面的例子相匹配,用你的数据库的细节替换占位符:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=<Enter your database name>
DB_USERNAME=<Enter your database username>
DB_PASSWORD=<Enter your database password>

你可能需要清除缓存,尽管这并不是必须的。要做到这一点,在终端运行以下命令:

php artisan config:cache

接下来通过运行下面的命令来运行数据库迁移:

php artisan migrate

生成一个Mailable

Laravel提供了多样化的方式来支持使用Mailable类来发送邮件, 同时支持Markdown和纯文本邮件.我们将在本教程中使用一个Markdown Mailable

Markdown Mailable包含了Markdown和Blade模板的混合,允许你用Laravel预制的UI元素来构建你的邮件。

要创建Mailable*(app/Mail/Subscribe.php)* 和其相应的视图模板*(resources/views/emails/subscribers.blade.php)*,运行以下Artisan命令:

php artisan make:mail Subscribe --markdown=emails.subscribers

设置控制器

接下来,你需要创建一个控制器来存储管理电子邮件地址的逻辑,并向提交的电子邮件地址发送确认邮件。要创建控制器,运行这个Artisan命令:

php artisan make:controller SubscriberController

它将在app/Http/Controllers目录下创建一个名为SubscriberController.php的新文件。文件创建后,添加下面的import 语句,导入控制器将使用的类:

use App\Mail\Subscribe;
use App\Models\Subscriber;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Validator;

接下来,通过复制下面的方法到类中,定义subscribe() ,该方法将保存业务逻辑。它将通过$request ,接收用户的输入:

public function subscribe(Request $request) 
{
    $validator = Validator::make($request->all(), [
         'email' => 'required|email|unique:subscribers'
    ]);

    if ($validator->fails()) {
        return new JsonResponse(['success' => false, 'message' => $validator->errors()], 422);
    }  

    $email = $request->all()['email'];
        $subscriber = Subscriber::create([
            'email' => $email
        ]
    ); 

    if ($subscriber) {
        Mail::to($email)->send(new Subscribe($email));
        return new JsonResponse(
            [
                'success' => true, 
                'message' => "Thank you for subscribing to our email, please check your inbox"
            ], 
            200
        );
    }
}

subscribe() 方法做的第一件事是验证。它确认正在发送的是一个有效的电子邮件地址,而不是一个空字段或一些随机的文本。它还检查用户是否已经订阅,也就是说,用户是否已经在数据库中的subscribers表中。

如果任何验证规则失败,将返回一个JSON响应,其中包含失败规则的错误信息。如果验证规则通过,它就会向提交的电子邮件地址发送电子邮件,一旦它被存储在数据库中。

接下来,它通过实例化Subscriber 模型创建一个新的订阅者记录,并将提交的电子邮件传递给create() 方法。

我们在$email 变量中把电子邮件地址传给Mailable,这样我们就可以在要发送的电子邮件中看到它的返回信息。to() 方法只接受接收者的电子邮件地址,而MailableSubscribe() 则接收需要在电子邮件中建立的任何数据属性。

创建一个可发送邮件

Mailable类为我们建立了电子邮件。它带有一个build 方法,在这个方法中你可以调用其他方法,如from,view,markdown, 和subject ,它们可以配置各种 Mailable 属性。

打开app/Mail/Subscriber.php,更新__construct() 方法,如下所示:

public $email;

public function __construct($email)
{
    $this->email = $email;
}

如果你没有数据要传递给邮件,让__construct() 方法保持原样。

接下来是build() 方法,它调用subject() ,给我们的电子邮件一个主题。

public function build()
{
    return $this
        ->subject('Thank you for subscribing to our newsletter')
        ->markdown('emails.subscribers');
}

它默认已经有了markdown() 方法,该方法指定了可以写入电子邮件的组件的Blade文件。

编写Markdown信息

打开包含邮件所有组件的Blade文件resources/views/emails/subscribers.blade.php,并更新它以匹配下面的代码。

注意: markdown() 这是在Mailable类的build() 方法中的Blade文件被作为目标:

@component('mail::message')
# Welcome to the first Newsletter

Dear {{$email}},

We look forward to communicating more with you. For more information visit our blog.

@component('mail::button', ['url' => 'enter your desired url'])
Blog
@endcomponent

Thanks,<br>
{{ config('app.name') }}
@endcomponent

这里同时支持Markdown和Blade。虽然,避免过多的缩进,因为它可能导致Markdown中的代码块。你可以在这里编写你想要的信息,并利用不同的属性,如按钮、表格等。要了解更多关于Markdown Mailable的信息,请阅读这个Laravel文档

设置路线

鉴于这是一个我们正在建立的API,我们将在routes/api.php中添加一个新的路由。我们只需要定义一个,因为我们只有一个端点,/api/subscribe ,供用户提交他们的电子邮件。

要定义它,请在rouse/api.php中添加以下代码:

Route::post('/subscribe', [SubscriberController::class, 'subscribe']);

然后,在文件的顶部添加import 语句:

use App\Http\Controllers\SubscriberController;

测试应用程序

现在是时候测试我们的API并确认一切运作正常了。有多种方法可以做到这一点,比如Postman,或者我们将要使用的cURL

首先运行下面的命令来启动应用程序:

php artisan serve

在项目的根目录下运行下面的命令,用需要订阅的电子邮件地址替换<subscriber email address>

curl -X POST -F "email=<subscribers email address>" http://localhost:8000/api/subscribe 

如果一切按预期进行,你会看到与下面的例子类似的输出:

{
    "success":true,
    "message":"Thank you for subscribing to our mail, please check your inbox"
}

现在检查你的收件箱,你应该看到一封电子邮件,其中有消息,发件人信息,和电子邮件的主题等,很好的格式化了一些预制的Laravel用户界面

The received thank you email

如果请求不成功,因为该邮件已经被订阅了,你会看到一个类似于下面的例子的输出:

{
    "success":false,
    "message":{
        "email":[
            "The email has already been taken."
        ]
    }
}

结语

在这个教程中, 你学到了如何在Laravel中使用Gmail SMTP服务器来发送邮件.Laravel中的邮件本身是一个广泛的概念,但本教程可以作为一个伟大的入门指南。更多的信息可以在Laravel官方文档中找到.