Laravel 邮件发送记录


自己想弄个邮件发送功能,用于发送账号验证码等信息,想着Laravel有现成的邮件发送功能,就直接拿来用了,这里只是简单记录。仅此而已。

Laravel Framework Version: 6.18.43
PHP Version: 7.2.34

前期准备

在开始之前,邮件模板不支持外部样式,CSS3样式兼容也不好,所以建议使用表格进行布局,并使用行内样式,在做好手机端后再适配PC端。

如果想方便的话,做自适应邮件模板的时候可以用Laravel的Markdown模板。其它情况看你们自己选了,可以自己写好整个HTML样式,也可以到邮件在线编辑的位置复制源代码下来。

要用Markdown作为邮件模板,Laravel的模板就很不错,只是很多时候我们都想自定义,那么就先把Laravel的邮件模板提取出来。在命令行中运行命令:

php artisan vendor:publish --tag=laravel-mail

这个命令会将vendor/laravel/framework/src/Illuminate/Mail/resources/views目录下的文件提取到你的资源目录下,模板的路径为resources/views/vendor/mail

resources/views/vendor/mail下面会有两个目录htmltext,分别是HTML和纯文本格式页面存放的目录,修改的时候要两个目录的内容一起修改。当然,如果你的两种类型要求的格式不一样,那就根据实际情况修改。

可以注意到,使用Markdown作为邮件发送的模板,我们可以不用过多的关注样式,只用关注内容即可,那样式该如何调整?

这里我们可以通过修改resources/views/vendor/mail/html/themes/default.css中的样式,Laravel会自动将对应的样式添加到行内中去,减少我们一个一个的去调整HTML样式。用过之后,感觉爽爽的。

创建邮件类和邮件模板

创建测试邮件类和对应的邮件模板,项目开发过程中根据实际情况进行调整,不要上课不听课。在命令行中运行:

php artisan make:mail Test --markdown=mails.test.index

执行命令后,对应的文件位置为:
app/Mail/Test.php
resources/views/mails/test/index.blade.php

修改Test邮件类,这里根据自己的情况进行修改

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class Test extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        // ->subject() 设置邮件主题
        return $this->subject('This is a greeting Email')
            // 如果是你自己写的HTML用view()
            // ->view('mails.test.index');
            // 这里调用对应Markdown模板
            ->markdown('mails.test.index');
    }
}

编写邮件模板,注意编写的内容不是垃圾邮件,否则可能会被拦截。

@component('mail::message')
# Welcome

I'm Wenhsing. This is from wenhsing.com

@component('mail::button', ['url' => ''])
Hello
@endcomponent

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

随便创建一个路由,用于预览邮件模板。

Route::get('/mail/show', function () {
    return new \App\Mail\Wenhsing();
});

配置邮件发送

当我们设计好邮件模板后,我们就可以开始配置邮件发送功能了。

修改config/mail.php配置文件

<?php

return [
    // 邮件驱动方式: "smtp", "sendmail", "mailgun", "ses" 等等
    'driver' => env('MAIL_DRIVER', 'smtp'),

    // 提供邮件服务的服务器主机,这里指定的是阿里云
    'host' => env('MAIL_HOST', 'smtp.aliyun.com'),

    // 对应的端口号
    'port' => env('MAIL_PORT', 465),

    // 指定发送邮件的邮件地址和名称
    'from' => [
        'address' => env('MAIL_FROM_ADDRESS', 'yourusername@aliyun.com'),
        'name' => env('MAIL_FROM_NAME', 'Wenhsing'),
    ],

    // 设置加密方式
    'encryption' => env('MAIL_ENCRYPTION', 'ssl'),

    // 登录邮件服务的账号
    'username' => env('MAIL_USERNAME'),

    // 登录邮件服务的密码
    'password' => env('MAIL_PASSWORD'),

    'sendmail' => '/usr/sbin/sendmail -bs',

    'markdown' => [
        'theme' => 'default',

        'paths' => [
            resource_path('views/vendor/mail'),
        ],
    ],

    'log_channel' => env('MAIL_LOG_CHANNEL'),
];

阿里云个人邮件服务器参考:

服务器名称 服务器地址 服务器端口号(非加密) 服务器端口号(SSL加密)
POP3 pop3.aliyun.com 110 995
SMTP smtp.aliyun.com 25 465
IMAP imap.aliyun.com 143 993

修改.env配置

MAIL_DRIVER=smtp
MAIL_HOST=smtp.aliyun.com
MAIL_PORT=465
MAIL_USERNAME=yourusername@aliyun.com
MAIL_PASSWORD=yourpassword
MAIL_ENCRYPTION=ssl
MAIL_FROM_ADDRESS=yourusername@aliyun.com
MAIL_FROM_NAME="${APP_NAME}"

测试邮件是否正确发送

随便创建一个控制器,使用Laravel的Mail Facades发送邮件:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;

class WenhsingController extends Controller
{
    public function mail(Request $request)
    {
        $request->validate(['email' => 'required|email']);
        Mail::to($request->email)->send(new \App\Mail\Test());
        return 'success';
    }
}

访问对应的控制器,查看一下邮件是否发送吧。也可以到邮件服务器上查看发信记录,如果有退信的情况,也可以直接在邮件服务器上看得到。

就先到这里吧,之后有什么再补充修改。