将心比心,方得人心~

laravel中邮件的使用

周洲 2019-10-08 16:22:03

Laravel 基于 SwiftMailer 库提供了一套干净、清爽的邮件 API。Laravel 为 SMTP、Mailgun、Postmark、Amazon SES,以及 sendmail 提供了驱动,从而允许你快速通过本地或云服务发送邮件。

由于sendmail需要安装配置Sendmail/Postfix,其他要么付费要么不能用。所以这里driver的配置是smtp。

使用QQ邮箱的话,需要开启POP3和SMTP服务。开启方式如下:

QQ邮箱 > 设置 > 账户

开启所有SMTP服务,开启成功会生成密钥,这个密钥会在后面的MAIL_PASSWORD中用到


host是邮箱所在主机,比如我们使用QQ邮箱,对应值是smtp.163.com,使用QQ邮箱的话,对应值是smtp.qq.com。

port用于配置邮箱发送服务端口号,比如一般默认值是25,但如果设置SMTP使用SSL加密,该值为465。

from配置项包含address和name,前者表示发送邮箱,后者表示发送邮件使用的用户名。

encryption表示加密类型,可以设置为null表示不使用任何加密,也可以设置为tls/ssl。

username表示邮箱账号,比如12345@qq.com

password表示上述邮箱登录对应登录密码。

sendmail是在设置driver为sendmail时使用,用于指定sendmail命令路径。

pretend用于配置是否将邮件发送记录到日志中,默认为false则发送邮件不记录日志,如果为true的话只记录日志不发送邮件,这一配置在本地开发中调试时很有用。

基础配置:

// 代码演示
// 配置可以选择在config/mail.php中配置也可以选择在.env中配置,这里选择在.env中配置
MAIL_FROM_ADDRESS=555666@qq.com
MAIL_FROM_NAME=发件人称呼 MAIL_DRIVER=smtp MAIL_HOST=smtp.qq.com MAIL_PORT=25 MAIL_USERNAME=555666@qq.com MAIL_PASSWORD=zklafekkjkabbmlc MAIL_ENCRYPTION=null


安装 Guzzle HTTP 函数库

composer require guzzlehttp/guzzle


方案一:

添加路由规则

Route::get('mail/send','MailController@send');

生成控制器

php artisan make::controller MailController

控制器中代码

<?php

namespace App\Http\Controllers;
use Mail;
use Illuminate\Support\Facades\Storage;

class MailController
{
    public function send()
    {
        $name = '小码哥';
        // Mail::send()的返回值为空,所以可以其他方法进行判断
        $image = Storage::disk('public')->get('images/test.png'); // 存放在自己创建目录storage\app\public\images
        Mail::send('emails.test',['image'=>$image, 'name'=>$name],function($message){
            $to = '55555@qq.com';
            $message->to($to)->subject('邮件测试');
            $attachment = storage_path('file/test.txt'); // 存放在自己创建目录storage\file
            // 在邮件中上传附件
            // $message->attach($attachment,['as'=>'中文文档.txt']); // 如果乱码请改用下面的方式
            $message->attach($attachment,['as'=>"=?UTF-8?B?".base64_encode('中文文档')."?=.txt"]);
        });

        // 返回的一个错误数组,利用此可以判断是否发送成功
        if(count(Mail::failures()) < 1){
            echo '发送邮件成功,请查收!';
        }else{
            echo '发送邮件失败,请重试!';
        }
    }

}

在resources/emails下创建一个模板文件。test.blade.php,添加代码

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

{{$name}},这是一封测试邮件
<br>
<img src="{{$message->embedData($image,'我的自拍照.png')}}">
</body>
</html>


方案二:


生成 Mailables(可邮寄类)

php artisan make:mail OrderShipped


代码:

<?php

namespace App\Mail;

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

class OrderShipped extends Mailable
{
    use Queueable, SerializesModels;

    public $order;
    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($order)
    {
        $this->order = $order;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('email');
    }
}

创建email.blade.php视图

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>BroadcastService</title>
</head>
<body>

邮件测试
{{$order->price}}

</body>
</html>

发送邮件

<?php


namespace App\Http\Controllers;


use App\Mail\OrderShipped;
use App\Models\Order;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;
use Laravel\Socialite\Facades\Socialite;

class IndexController extends Controller
{


    public function send()
    {
        $order = Order::first();
        Mail::to("888999@qq.com")->send(new OrderShipped($order));

    }

}







打赏

『微信打赏』

Tag标签邮件 

我是有底线的