Laravel 发送邮件

编辑于 2023-03-23 22:35 阅读 650

简单使用

配置

以阿里企业邮为例,修改.env文件

MAIL_MAILER=smtp
MAIL_HOST=smtp.mxhichina.com
MAIL_PORT=25
MAIL_USERNAME=notifications-noreply@a.com
MAIL_PASSWORD=123
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=notifications-noreply@a.com
MAIL_FROM_NAME=notifications-noreply

关于MAIL_ENCRYPTION参数,我查看了源码,它的值只有tls和其他,tls即ssl加密,源码如下:

    public function setEncryption($encryption)
    {
        $encryption = strtolower($encryption ?? '');
        if ('tls' == $encryption) {
            $this->params['protocol'] = 'tcp';
            $this->params['tls'] = true;
        } else {
            $this->params['protocol'] = $encryption;
            $this->params['tls'] = false;
        }

        return $this;
    }

发送邮件

发送文本邮件

        Mail::raw('邮件内容。。', function (\Illuminate\Mail\Message $message){
//            $message->to('1@qq.com');//无主题
            $message->subject('测试一下。。')->to('1@qq.com');
        });

发送富文本邮件

        Mail::send('emails.test',['name'=>'张三'],function (\Illuminate\Mail\Message $message){
            $message->subject('测试一下。。')->to('1@qq.com');
        })

视图文件 resources/views/emails/test.blade.php

生成Mailables

Laravel 更推荐使用mailable类来发送邮件

创建RegisterSuccess

root@php-fpm:/var/www/laravel-demo# php artisan make:mail RegisterSuccess

如上,生成了一个mailable 类app/Mail/RegisterSuccess.php,请注意所有可邮寄类的配置都是在 build 方法中完成的。

配置视图

    public function build()
    {
        return $this->view('emails.register_success');
    }

视图文件resources/views/emails/register_success.blade.php

纯文本邮件

你可以使用 text 方法来定义一个纯文本格式的邮件。和 view 方法一样, 该 text 方法接受一个模板名,模板名指定了在渲染邮件内容时你想使用的模板。你既可以定义纯文本格式亦可定义 HTML 格式:

/**
 * 构建消息.
 *
 * @return $this
 */
public function build()
{
    return $this->view('emails.register_success')
                ->text('emails.register_success_plain');
}

视图数据

有两种方法传递数据到视图中。

第一种,通过 Public 属性

你在 mailable 类中定义的所有 public 的属性都将自动传递到视图中。

    public User $user;
    public function __construct(User $user)
    {
        //
        $this->user=$user;
    }
    public function build()
    {
        return $this->view('emails.register_success')->with(['name' => 'abc']);
    }

//视图文件
<body>
test2..<?=$name?>
--
<?=$user->name?>

</body>
</html>

第二种,通过 with 方法

    public function build()
    {
        return $this->view('emails.register_success')->with(['name' => 'abc']);
    }

Markdown 格式邮件

Markdown 格式邮件允许你可以使用 mailable 中的预构建模板和 邮件通知 组件。由于消息是用 Markdown 编写,Laravel 能够渲染出美观的、响应式的 HTML 模板消息,同时还能自动生成纯文本副本。

生成 Markdown 邮件

root@php-fpm:/var/www/laravel-demo# php artisan make:mail RegisterSuccess2 --markdown=emails.register_success2

//

    public function build()
    {
        return $this->markdown('mail.register-success2', [
                    'url' => $this->orderUrl,
                ]);
    }

Markdown mailable 类整合了 Markdown 语法和 Blade 组件,让你能够非常方便的使用 Laravel 预置的 UI 组件来构建邮件消息

常用组件:按钮组件,面板组件,表格组件,当然你也可以自定义组件

可以将所有 Markdown 邮件组件导出到自己的应用,用作自定义组件的模板。若要导出组件,使用 laravel-mail 资产标签的 vendor:publish Artisan 命令:

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

发送邮件

若要发送邮件,使用 Mail 门面 的方法。该 to 方法接受 邮件地址、用户实例或用户集合。如果传递一个对象或者对象集合,mailer 在设置收件人时将自动使用它们的 email 和 name 属性,因此请确保对象的这些属性可用。一旦指定了收件人,就可以将 mailable 类实例传递给 send 方法:

$user=User::query()->first();
//Mail::to('1@qq.com')->send(new RegisterSuccess($user));
Mail::to($user)->send(new RegisterSuccess($user));

渲染邮件

有时您可能希望捕获邮件的 HTML 内容而不发送它。为此,可以调用邮件类的 render 方法。此方法将以字符串形式返回邮件类的渲染内容:

use App\Mail\InvoicePaid;
use App\Models\Invoice;

$invoice = Invoice::find(1);

return (new InvoicePaid($invoice))->render();

在浏览器中预览邮件

Route::get('/mailable', function () {
    $invoice = App\Models\Invoice::find(1);

    return new App\Mail\InvoicePaid($invoice);
});

参考

https://mp.weixin.qq.com/s/xWKrOMIFh_ZTTEuYJUwiAQ

https://learnku.com/docs/laravel/9.x/mail/12233

广而告之,我的新作品《语音助手》上架Google Play了,欢迎下载体验