Laravel进阶系列笔记--(十八)Laravel 发送邮件

作者: 温新

分类: 【Laravel】

阅读: 2796

时间: 2021-08-31 05:31:46

作者:温新

时间:2021-07-14

hi,我是温新,一-名PHPer。

Laravel发送邮件,之前基于QQ邮箱写过。现在应用163邮箱来演示。所使用的框架版本是Laravel8.x。

Laravel基于163邮箱发送邮件

第一步:开启SMTP服务

登录163邮箱,在【设置】中找到 POP3/SMTP服务并将其开启并获取授权密码。

第二步:安装驱动服务

composer require guzzlehttp/guzzle

第三步:.env文件中配置邮件信息

文件:.env

<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 0, 0)">MAIL_MAILER</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">=</span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">smtp</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 0, 0)">MAIL_HOST</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">=</span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">smtp</span>.<span style="box-sizing: border-box;color: rgb(17, 102, 68)">163.</span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">com</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 0, 0)">MAIL_PORT</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">=</span><span style="box-sizing: border-box;color: rgb(17, 102, 68)">25</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 0, 0)">MAIL_USERNAME</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">=</span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">ziruchu@163</span>.<span style="box-sizing: border-box;color: rgb(0, 0, 0)">com</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 0, 0)">MAIL_PASSWORD</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">=</span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">你的授权密码</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 0, 0)">MAIL_ENCRYPTION</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">=</span><span style="box-sizing: border-box;color: rgb(34, 17, 153)">null</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 0, 0)">MAIL_FROM_ADDRESS</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">=</span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">ziruchu@163</span>.<span style="box-sizing: border-box;color: rgb(0, 0, 0)">com</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 0, 0)">MAIL_FROM_NAME</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">=</span><span style="box-sizing: border-box;color: rgb(170, 17, 17)">"</span><span style="box-sizing: border-box;color: rgb(0, 85, 170)">$</span>{<span style="box-sizing: border-box;color: rgb(0, 0, 0)">APP_NAME</span>}<span style="box-sizing: border-box;color: rgb(170, 17, 17)">"</span></span>

配置解释:

<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 0, 0)">MAIL_MAILER</span>  <span style="box-sizing: border-box;color: rgb(152, 26, 26)">--</span> <span style="box-sizing: border-box;color: rgb(0, 0, 0)">驱动方式</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 0, 0)">MAIL_HOST</span>  <span style="box-sizing: border-box;color: rgb(152, 26, 26)">--</span> <span style="box-sizing: border-box;color: rgb(0, 0, 0)">邮箱所在主机</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 0, 0)">MAIL_PORT</span>  <span style="box-sizing: border-box;color: rgb(152, 26, 26)">--</span> <span style="box-sizing: border-box;color: rgb(0, 0, 0)">邮箱发送端口号</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 0, 0)">MAIL_USERNAME</span>  <span style="box-sizing: border-box;color: rgb(152, 26, 26)">--</span> <span style="box-sizing: border-box;color: rgb(0, 0, 0)">邮箱账号</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 0, 0)">MAIL_PASSWORD</span>  <span style="box-sizing: border-box;color: rgb(152, 26, 26)">--</span> <span style="box-sizing: border-box;color: rgb(0, 0, 0)">授权密码</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 0, 0)">MAIL_ENCRYPTION</span>   <span style="box-sizing: border-box;color: rgb(152, 26, 26)">--</span> <span style="box-sizing: border-box;color: rgb(0, 0, 0)">加密类型</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 0, 0)">MAIL_FROM_ADDRESS</span>  <span style="box-sizing: border-box;color: rgb(152, 26, 26)">--</span> <span style="box-sizing: border-box;color: rgb(0, 0, 0)">邮箱地址</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 0, 0)">MAIL_FROM_NAME</span>    <span style="box-sizing: border-box;color: rgb(152, 26, 26)">--</span> <span style="box-sizing: border-box;color: rgb(0, 0, 0)">发送人名称</span></span>

MAIL_ENCRYPTION 加密类型为null,表示不使用任务加密;加密方式可以是tls/ssl

第四步:创建邮件类

php artisan make:mail TestMail

第五步:编写生成的`TestMail.php

文件:app/Mail/TestMail.php

<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(152, 26, 26)"><?</span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">php</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(119, 0, 136)">namespace</span> <span style="box-sizing: border-box;color: rgb(0, 0, 255)">App\Mail</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(119, 0, 136)">use</span> <span style="box-sizing: border-box;color: rgb(0, 0, 0)">Illuminate\Bus\Queueable</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(119, 0, 136)">use</span> <span style="box-sizing: border-box;color: rgb(0, 0, 0)">Illuminate\Contracts\Queue\ShouldQueue</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(119, 0, 136)">use</span> <span style="box-sizing: border-box;color: rgb(0, 0, 0)">Illuminate\Mail\Mailable</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(119, 0, 136)">use</span> <span style="box-sizing: border-box;color: rgb(0, 0, 0)">Illuminate\Queue\SerializesModels</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(119, 0, 136)">class</span> <span style="box-sizing: border-box;color: rgb(0, 0, 255)">TestEmail</span> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">extends</span> <span style="box-sizing: border-box;color: rgb(0, 0, 0)">Mailable</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">{</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(119, 0, 136)">use</span> <span style="box-sizing: border-box;color: rgb(0, 0, 0)">Queueable</span>, <span style="box-sizing: border-box;color: rgb(0, 0, 0)">SerializesModels</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(119, 0, 136)">public</span> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">function</span> <span style="box-sizing: border-box;color: rgb(0, 0, 255)">__construct</span>()</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">    {</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">    }</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(170, 85, 0)">// 发送邮件</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(119, 0, 136)">public</span> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">function</span> <span style="box-sizing: border-box;color: rgb(0, 0, 255)">build</span>()</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">    {</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(170, 85, 0)">// 发送邮件的人是ziruchu@163.com</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(170, 85, 0)">// 内容是 test.blade.php中的内容</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(119, 0, 136)">return</span> <span style="box-sizing: border-box;color: rgb(0, 85, 170)">$this</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">from</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'ziruchu@163.com'</span>)<span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">view</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'mail.test'</span>);</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">    }</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">}</span>

第六步:定义视图文件

文件:resources/mail/test.blade.php

来自<h1>自如初</h1>的邮件

第七步:定义路由

主要是为了方便,我这里直接在路由中进行测试了。

<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(170, 85, 0)">// routes/web.php</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 0, 0)">Route</span>::<span style="box-sizing: border-box;color: rgb(0, 0, 0)">get</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'email'</span>, <span style="box-sizing: border-box;color: rgb(119, 0, 136)">function</span>(){</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(170, 85, 0)">// 将邮件发送给 xyhcx@foxmail.com 这个邮箱</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(0, 0, 0)">\Illuminate\Support\Facades\Mail</span>::<span style="box-sizing: border-box;color: rgb(0, 0, 0)">to</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'xyhcx@foxmail.com@qq.com'</span>)<span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">send</span>(<span style="box-sizing: border-box;color: rgb(119, 0, 136)">new</span> <span style="box-sizing: border-box;color: rgb(0, 0, 0)">\App\Mail\TestEmail</span>());</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">});</span>

相关方法

第四步创建了一个邮件类,现在来看看这个类文件中有哪些方法可用。

from()

from方法指明发送者的邮件。简单地说,这封邮件是从哪发送出去的。由于在.env文件中配置了发送者邮箱,因此在build方法中可以不写这个方法,如下:

<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(170, 85, 0)">// TestEmail.php</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(119, 0, 136)">public</span> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">function</span> <span style="box-sizing: border-box;color: rgb(0, 0, 255)">build</span>()</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(119, 0, 136)">return</span> <span style="box-sizing: border-box;color: rgb(0, 85, 170)">$this</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">view</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'mail.test'</span>);</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">}</span>

view()

view方法为发送邮件内容的模板视图文件。

subject()

subject方法用于描述该邮件主题。

// TestEmail.php
public function build()
{
    return $this->from('13818472103@163.com')->subject('PHP测试邮件')->view('mail.test');
}

with

with发送数据到邮件模板中。

// 步骤一、修改TestMail.php
public function build()
{
    $data = [
        'webTitle'   =>  '自如初',
        'webName'   =>  'PHPer'
    ];
    return $this->from('13818472103@163.com')
        ->subject('PHP测试邮件')
        ->view('mail.test')->with($data);
}
// 步骤二、修改test.blade.php邮件模板视图
来自<h1>自如初</h1>的邮件
{{ $webTitle }} -- {{ $webName }}

发送附件

attach('文件路径')

attach发送一封附件。如excel、图片、pdf等文件。

步骤一:public目录下新建file目录并在该目录下创建一个文件。

步骤二:发送邮件

public function build()
{
    $data = [
        'webTitle'   =>  '自如初',
        'webName'   =>  'PHPer'
    ];
    return $this->from('13818472103@163.com')
        ->subject('发送一个邮件信息')
        ->view('mail.test')
        ->with($data)
        ->attach('file/test.xlsx');
}

Markdown格式邮件

与发送基本邮件信息是类似的,不同的的邮件内容是用markdown语法来连接。

第一步:创建邮件类

php artisan make:mail DemoShipped --markdown=mail.demo_shipped

使用--markdown选项会自动生成对应的视图模板文件。

对于简单的演示来说,执行完第一步就已经可以进行对应的演示了,一切都不需要改动。

第二步:修改build方法

文件:app/Mail/DemoShipped.php

public function build()
{
    return $this->from('ziruchu@163.com')->markdown('mail.demo_shipped');
}

对应的视图文件方法使用的是markdown方法。

第三步:修改视图文件

文件:resources/mail.demo_shipped.blade.php

@component('mail::message')
# 介绍
> hi,我是温新,一名PHPer。

The body of your message.

@component('mail::button', ['url' => 'https://www.ziruchu.com','color'=>'success'])
自如初
@endcomponent

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

第四步:发送邮件

// routes/web.php

Route::get('email', function(){
    $result = \Illuminate\Support\Facades\Mail::to('457969743@qq.com')->send(new \App\Mail\DemoShipped());
    dd($result);
});

Markdown视图模板组件方法

在视图模板文件中看到了默认的方法,现在来看看它们。

按钮组件

按钮组件渲染一个居中的按钮链接。接收2个参数,分别是ulrcolor,支持的颜色有primarysuccesserror

@component('mail::button', ['url' => 'https://www.ziruchu.com','color'=>'success'])
自如初
@endcomponent

面板组件

面板有一个浅色背景区分其它信息,可以把它看到是一个着重信息,相当于markdown语法中 >所显示出来的文字。

@component('mail::panel')
This is the panel content.
@endcomponent

表格组件

将markdown语法的表格转成html表格。

@component('mail::table')
| Laravel       | Table         | Example  |
| ------------- |:-------------:| --------:|
| Col 2 is      | Centered      | $10      |
| Col 3 is      | Right-Aligned | $20      |
@endcomponent

我是温新

每天进步一点点,就一点点

请登录后再评论