在Laravel5.4中使用SMTP驱动实现邮件发送

在平时的项目开发中,经常会遇到需要发送邮件的情况。比如,用户注册网站之后发送激活邮件,忘记密码之后发送找回密码邮件,甚至会遇到在linux运维中因系统负载过高需要发送报警邮件的情况。在laravel中,这一切都将变的简单。


Laravel基于目前流行的SwiftMailer库为我们提供了一组邮件API,使我们可以很方便的进行邮件的发送。Laravel支持多种邮件发送方式,包括smtp,sendmail,mailgun,mandrill,ses等。这里我们使用简单且实用的smtp方式发送邮件。


一. 配置文件

邮件配置文件位于config/mail.php

return [
    // 邮件发送方式,一般为smtp
    'driver' => env('MAIL_DRIVER', 'smtp'),
    // smtp服务器地址
    'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
    // smtp服务器端口号
    'port' => env('MAIL_PORT', 587),
    // 发送邮箱以及使用的用户名
    'from' => [
        'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
        'name' => env('MAIL_FROM_NAME', 'Example'),
    ],
    // 加密类型
    'encryption' => env('MAIL_ENCRYPTION', 'tls'),
    // 邮箱账号
    'username' => env('MAIL_USERNAME'),
    // 邮箱密码(163邮箱客户端授权码)
    'password' => env('MAIL_PASSWORD'),
    // 驱动方式为sendmail时使用,用于指定sendmail命令路径
    'sendmail' => '/usr/sbin/sendmail -bs',
    // markdown主题及组件路径
    'markdown' => [
        'theme' => 'default',
        'paths' => [
            resource_path('views/vendor/mail'),
        ],
    ],
];

编辑.env文件

MAIL_DRIVER=smtp
MAIL_HOST=smtp.163.com
MAIL_PORT=465
MAIL_USERNAME=15557115073@163.com
MAIL_PASSWORD=xxxxxx
MAIL_FROM_ADDRESS=15557115073@163.com
MAIL_FROM_NAME=烟雨
MAIL_ENCRYPTION=ssl


二. 定义路由

routes/web.php 定义如下路由

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


三. 创建MailController控制器文件

php artisan make:controller MailController

并编写发送邮件的代码如下

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Mail;
class MailController extends Controller
{
    public function send()
    {
        $name = '张仿松';
        Mail::send('mail.send', ['name'=>$name], function ($mail){
            $to = '845573796@qq.com';
            $mail->to($to)->subject('过几天去杭州');
        });
        
        if(Mail::failures()){
            echo '邮件发送失败,请重试';
        }else{
            echo '邮件发送成功,请注意查收';
        }
    }
    
}

Mail::send需要传递三个参数,第一个是邮件视图,第二个是传入视图的数据,第三个是一个闭包,该闭包中定义了收件人、抄送人(如果有的话)、邮件主题、附件等信息。邮件的主体内容位于局部视图中,下面我们就来定义这个局部视图,在resources/views/mail目录下新建send.blade.php,编辑其内容如下:

{{ $name }},过几天去杭州你有时间吗?

Mail::failures 方法检测发送是否失败,如果失败会返回一个不为空的数组,然后在浏览器输入http://lblog.com/mail/send (http://lblog.com虚拟主机地址,这里请填写你自己的)如果页面输出"邮件发送成功,请注意查收" 则邮件发送成功,收件人的邮箱就应该可以收到刚发的这封邮件了。

1.png


上面展示的是发送html邮件,如果只是想发送纯文本邮件可以使用raw方法

Mail::raw('过几天去杭州看你吧,不知道有没有时间', function ($message) {
    $to = '845573796@qq.com';
    $message->to($to)->subject('过几天去杭州看你吧');
});

2.png


发送带附件的邮件

$name = '张仿松';
Mail::send('mail.send', ['name'=>$name], function ($mail){
    $to = '845573796@qq.com';
    $mail->to($to)->subject('过几天去杭州');
    $attachment = storage_path('app/file.txt');
    $mail->attach($attachment, ['as'=>'文档.txt']);
});

3.png


如果出现中文乱码,最后一句可以改成这样

$mail->attach($attachment, ['as'=>"=?UTF-8?B?".base64_encode('文档')."?=.txt"]);

4.png

问题就可以解决了。

在Laravel5.4中使用SMTP驱动实现邮件发送》上暂无评论!

发表评论