您现在的位置是:网站首页>>PHP>>laravel

laravel 邮件发送

发布时间:2018-12-13 10:19:42作者:wangjian浏览量:682点赞量:0

    laravel 内部提供了十分完善的邮件发送功能,你可以快速从本地或云端服务自由地发送邮件

    一:邮件配置

    邮件配置文件在config/mail.php,文件内几个重要配置:

    1:配置邮件驱动

    'driver' => env('MAIL_DRIVER', 'smtp'),

    laravel提供了SMTP 、Mailgun 、SparkPost 、 Amazon SES 、 PHP 的 mail 函数及 sendmail驱动对应的driver参数为smtp, sendmail, mailgun, mandrill, ses,sparkpost

    (1)如果使用了Mailgun 和 SparkPos驱动的话需要安装 Guzzle HTTP 函数库

    composer require guzzlehttp/guzzle

    使用Mailgun驱动,需要登录Mailgun官网注册一个账号,注册完成后将账号的信息在config/services.php文件中填写

    'mailgun' => [
        'domain' => env('MAILGUN_DOMAIN'),
        'secret' => env('MAILGUN_SECRET'),
    ],

    使用SparkPost驱动,需要登录SparkPost官网注册一个账号,注册完成后将账号的信息在config/services.php文件中填写

    'sparkpost' => [
        'secret' => env('SPARKPOST_SECRET'),
    ],

    (2)使用 Amazon SES 驱动,必须安装 PHP 的 Amazon AWS SDK

    composer require aws/aws-sdk-php "~3.0"

    使用Amazon SES驱动,需要登录Amazon SES官网注册一个账号,注册完成后将账号的信息在config/services.php文件中填写

    'ses' => [
        'key' => env('SES_KEY'),
        'secret' => env('SES_SECRET'),
        'region' => 'us-east-1',
    ],

    2:连接域名邮箱的服务器地址

    'host' => env('MAIL_HOST', 'smtp.mailgun.org'),

    3:端口号

    'port' => env('MAIL_PORT', 587),

    4:发件人地址和姓名

    'from' => [
        'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),//发件人的连接地址
        'name' => env('MAIL_FROM_NAME', 'Example'),//发件人姓名
    ],

    5:电子邮件加密协议(加密方式一般使用ssl方式加密) 这里我使用tls加密总是超时,具体原因不清楚,有知道了评论区告诉我,不甚感谢

    'encryption' => env('MAIL_ENCRYPTION', 'tls'),

    6:用户名和密码

    'username' => env('MAIL_USERNAME'),//发送人的地址
    'password' => env('MAIL_PASSWORD'),//密码

    我的config/mail.php配置如下,按照我的配置进行配置即可

    <?php
    return [
        /*
        |--------------------------------------------------------------------------
        | Mail Driver
        |--------------------------------------------------------------------------
        |
        | Laravel supports both SMTP and PHP's "mail" function as drivers for the
        | sending of e-mail. You may specify which one you're using throughout
        | your application here. By default, Laravel is setup for SMTP mail.
        |
        | Supported: "smtp", "sendmail", "mailgun", "mandrill", "ses",
        |            "sparkpost", "log", "array"
        |
        */
        // 默认发送邮件驱动
        'driver' => 'smtp',
        /*
        |--------------------------------------------------------------------------
        | SMTP Host Address
        |--------------------------------------------------------------------------
        |
        | Here you may provide the host address of the SMTP server used by your
        | applications. A default option is provided that is compatible with
        | the Mailgun mail service which will provide reliable deliveries.
        |
        */
        // 发送邮件主机地址
        'host' => 'smtp.qq.com',
        /*
        |--------------------------------------------------------------------------
        | SMTP Host Port
        |--------------------------------------------------------------------------
        |
        | This is the SMTP port used by your application to deliver e-mails to
        | users of the application. Like the host we have set this value to
        | stay compatible with the Mailgun e-mail application by default.
        |
        */
        //发送邮件主机端口
        'port' => '465',
        /*
        |--------------------------------------------------------------------------
        | Global "From" Address
        |--------------------------------------------------------------------------
        |
        | You may wish for all e-mails sent by your application to be sent from
        | the same address. Here, you may specify a name and address that is
        | used globally for all e-mails that are sent by your application.
        |
        */
        // 指定发送邮件的邮箱地址和用户名称
        'from' => [
            'address' => '243681093@qq.com',
            'name' => 'wangjian',
        ],
        /*
        |--------------------------------------------------------------------------
        | E-Mail Encryption Protocol
        |--------------------------------------------------------------------------
        |
        | Here you may specify the encryption protocol that should be used when
        | the application send e-mail messages. A sensible default using the
        | transport layer security protocol should provide great security.
        |
        */
        //电子邮件加密协议
        'encryption' => 'ssl',
        /*
        |--------------------------------------------------------------------------
        | SMTP Server Username
        |--------------------------------------------------------------------------
        |
        | If your SMTP server requires a username for authentication, you should
        | set it here. This will get used to authenticate with your server on
        | connection. You may also set the "password" value below this one.
        |
        */
        //发送人账号
        'username' => '243681093@qq.com',
        //密码
        'password' => 'tkccftyagtkobghh',
        /*
        |--------------------------------------------------------------------------
        | Sendmail System Path
        |--------------------------------------------------------------------------
        |
        | When using the "sendmail" driver to send e-mails, we will need to know
        | the path to where Sendmail lives on this server. A default path has
        | been provided here, which will work well on most of your systems.
        |
        */
        // 当驱动为 sendmail 时,指定驱动的命令地址
        'sendmail' => '/usr/sbin/sendmail -bs',
        /*
        |--------------------------------------------------------------------------
        | Markdown Mail Settings
        |--------------------------------------------------------------------------
        |
        | If you are using Markdown based email rendering, you may configure your
        | theme and component paths here, allowing you to customize the design
        | of the emails. Or, you may simply stick with the Laravel defaults!
        |
        */
        'markdown' => [
            'theme' => 'default',
            'paths' => [
                resource_path('views/vendor/mail'),
            ],
        ],
    ];

    二:简单实现发送邮件

    1:发送文本信息+f附件

    Mail::raw('内容',function ($message){
       $message->to('收集人邮箱地址(如果收件人为多个使用数组即可)')->subject('主题');
       $attachment = '附件地址';
       if (!file_exists($attachment)) {
           die('文件不存在');
       }
       // 防止中文乱码
       $message->attach($attachment, ['as' => '=?UTF-8?B?'.base64_encode('二维码图片').'?=.png']);
    });

    2:发送模板内容 + 附件

    $data = ['test'=>'内容'];
    Mail::send('test.test(模板地址)', $data, function($message) use($data)
    {
        $message->to('wangjian@yidian-mall.com', '名称')->subject('主题');
        $attachment = '附件地址';
        if (!file_exists($attachment)) {
            die('文件不存在');
        }
        // 防止中文乱码
        $message->attach($attachment, ['as' => '=?UTF-8?B?'.base64_encode('二维码图片').'?=.png']);
        
    });

    发送模板内容时在指定模板中可以使用$data数据

    二:使用 Mailable类发送邮件

    1:生成Mailable

    使用 make:mail 命令创建一个 Mailable 类

    php artisan make:mail Testmail

    执行上面的命令会在

    app/Mail目录下生成一个TestMail.php文件的Mailable类

    2:配置Mailable类(修改app/Mail/TestMail.php)

    (1):配置纯文本邮件

    public function build()
    {
      return $this->text('test.test');//test.test表示纯文本数据视图地址
    }

    向纯文本视图发送参数

    (1)通过公共属性向纯文本视图发送参数

    class Testmail extends Mailable
    {
        use Queueable, SerializesModels;
        public $order;
        /**
         * Create a new message instance.
         * $order  调用Mailable类时传递来的参数
         * @return void
         */
        public function __construct($order)
        {
            $this->order = $order;
        }
        /**
         * Build the message.
         *
         * @return $this
         */
        public function build()
        {
            return $this->view('test.test');
        }
    }

    这时候就可以在纯文本视图模板使用$order参数

    (2)通过 with 方法向纯文本视图发送参数

    class Testmail extends Mailable
    {
       use Queueable, SerializesModels;

       protected  $order;

       /**
        * Create a new message instance.
        * $order  调用Mailable类时传递来的参数
        * @return void
        */
       public function __construct($order)
       {
           $this->order = $order;
       }

       /**
        * Build the message.
        *
        * @return $this
        */
       public function build()
       {
           return $this->text('test.test')->with(['order'=>$this->order]);
       }
    }

    这时候就可以在纯文本视图模板使用$order参数

    (2):配置视图邮件

    public function build()
    {
        return $this->view('test.test');//test.test表示视图地址
    }

    向视图文件发送参数

    方法和纯文本向纯文本视图发送参数方法相同

    (3):配置附件

    要在邮件中加入附件,在 build 方法中使用 attach 方法。attach 方法接受文件的绝对路径作为它的第一个参数

    public function build()
    {
        return $this->attach('/path/to/file');//参数为附件地址
    }

    你也可以传递 数组 给 attache 方法作为第二个参数,以指定显示名称和 / 或是 MIME 类型

    public function build()
    {
        return $this->attach('/path/to/file', [
                        'as' => 'name.pdf',
                        'mime' => 'application/pdf',
                    ]);
    }

    3:在浏览器上预览邮件

    在路由配置文件routes/web.php中加上

    Route::get('/mailable', function () {
        return new App\Mail\Testmail();//实例化指定的Mailable类,如果指定的Mailable类需要参数,在括号中加入指定的参数
    });

    然后在浏览器上访问 http://你的域名地址/mailable,这时候浏览器上就可以看到邮件信息

    4:发送邮件

    (1)简单发送邮件

    Mail::to('wangjian@yidian-mall.com')->send(new Testmail());//to方法里面的参数为收件人邮件地址,如果有多个收件单使用数组new Testmail()表示实例化指定的Mailable类,括号里可以加参数,表示向Mailable类中传递参数

    (2)添加抄送和密送

    Mail::to('wangjian@yidian-mall.com')
    ->cc(['243681093@qq.com'])   //抄送
    ->bcc(['test@yidian-mall.com'])  //密送
    ->send(new Testmail());

    (3)将邮件消息加入队列(队列相关内容参考 laravel 队列系统)

    由于发送消息会大幅延迟应用响应时间,这时候就可以选择将邮件消息加入队列在后台进行发送,将邮件消息加入队列,使用queue 方法实现将邮件加入队列

    Mail::to('wangjian@yidian-mall.com')->queue(new Testmail());

    延迟邮件消息队列

    延迟发送已加入队列的邮件消息,使用 later 方法。later 第一个参数接受一个 DateTime 实现以告知这个消息应该何时发送

    $when = Carbon::now()->addMinutes(10);
    Mail::to('wangjian@yidian-mall.com')->later($when, new Testmail());

    推送到特定队列

    $message = (new Testmail($order))
                   ->onConnection('database')//指定队列链接名称
                   ->onQueue('emails');//指定队列名称
    Mail::to('wangjian@yidian-mall.com')->queue($message);


上一篇:laravel 队列系统

下一篇:laravel 缓存操作

0 +1