18

Laravel - 上手实现 - 邮件发送

 4 years ago
source link: http://www.cnblogs.com/laowenBlog/p/12771715.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Laravel 自带 SwiftMailer 库,集成了多种邮件API,可以很方便的实现邮件的发送。

我们使用到的是SMTP(Simple Message Transfer Protocol)简单邮件传输协议,通常理解为邮件发送服务器。

1、开启POP3和SMTP服务

1.1、在这里我们以QQ邮箱为案例

设置 -> 账户 -> POP3 -> 开启

yeAzAv7.png!web

ry6NB3M.png!web

到这一步会提示验证,按照提示发送短信通过验证:

BJBFFrA.png!web

短信发送成功,会出现如下提示、也就代表配置成功。你需要记录密钥,这个东西会在配置中用:

63mq6j3.png!web

1.2、在这里我们以 163邮箱为案例

后期有时间在维护。。。。理解理解。。。

2、对 Laravel 框架中邮件发送的配置文件进行修改:

.env 文件:

MAIL_DRIVER=smtp
MAIL_HOST=smtp.qq.com
MAIL_PORT=465
MAIL_USERNAME=********@qq.com
MAIL_PASSWORD=qq邮箱此处填写上图产生的授权码
MAIL_FROM_NAME=邮箱的名称
MAIL_ENCRYPTION=ssl

config/mail.php 文件:

return [
    'driver' => env('MAIL_DRIVER', 'smtp'),
    'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
    'port' => env('MAIL_PORT', 587),
    'from' => [
        'address' => env("MAIL_USERNAME", ""),
        'name' => env("MAIL_FROM_NAME")
    ],
    'encryption' => env('MAIL_ENCRYPTION'),
    'username' => env('MAIL_USERNAME'),
    'password' => env('MAIL_PASSWORD'),
    'sendmail' => '/usr/sbin/sendmail -bs',
    'pretend' => env('MAIL_PRETEND', false),
];

// driver:用于配置默认的邮件发送驱动。
    // Laravel支持多种邮件驱动方式,包括smtp、Mailgun、Maildrill、Amazon SES、mail和sendmail;
    // Mailgun和Amazon SES都是收费的Maildrill目前不支持中国区用户,这三个都是第三方邮件服务。
    // mail驱动使用PHP提供的mail函数发送,sendmail驱动通过Sendmail/Postfix(Linux)提供的命令发送邮件;
    // smtp驱动通过支持ESMTP的SMTP发送邮件。
    // 就目前状况来看,使用smtp是最明智的选择;
    // mail不安全,sendmail需要安装配置Sendmail/Postfix,其他要么付费要么不能用。

// host:邮箱所在主机;
    // 使用163邮箱,对应值是smtp.163.com;
    // 使用QQ邮箱,对应值是smtp.qq.com。
    // 使用腾讯企业邮箱,对应值是smtp.exmail.qq.com

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

// from:配置项包含address和name,
    // address 表示你自己的邮箱
    // name 表示你邮件用户名(这里邮箱,是用来发邮件的邮箱)。

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

// username: 表示邮箱账号,比如[email protected]
// password 表示上述邮箱登录对应登录密码。
    // 注意QQ邮箱的话应该开启POP3|SMTP服务时给的授权码。
// sendmail: 是在设置driver为sendmail时使用,用于指定sendmail命令路径。
// pretend: 用于配置是否将邮件发送记录到日志中;
    // 默认为false则发送邮件不记录日志;
    // 如果为true的话只记录日志不发送邮件,这一配置在本地开发中调试时很有用

3、生产控制器、配置路由

php artisan make:controller MailController
Route::any('mail/send','MailController@sendMail');

4、编辑控制器、加入以下代码:

// 记得使用内置的邮件类 use Illuminate\Support\Facades\Mail;
public function sendMail() {
    $name = '这是邮件发送的标题'; 
    // Mail::send()的返回值为空,所以可以其他方法进行判断 
    // Mail::send();需要传三个参数;
    // 第一个为引用的模板
    // 第二个为给模板传递的变量(邮箱发送的文本内容)
    // 第三个为一个闭包,参数绑定Mail类的一个实例。
    Mail::send('emails.test',['name'=>$name],function($message){ 
        $to = '[email protected]'; 
        $message ->to($to)->subject('邮件测试'); 
    }); 
    // 返回的一个错误数组,利用此可以判断是否发送成功
    dd(Mail::failures());  
}

5、由于上面:point_up_2:指定了邮件发送的视图层、所以去编辑

在resources/emails下创建一个模板文件。

这是测试邮件!!
{{$name}}

6、测试

访问: http://localhost/mail/send 如果返回一个空数组则表示邮件发送成功。

7、报错:stream_socket_client() 、certificate verify failed

具体报错如下:

stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages:
error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed

原因:

php openssl 没有加载 ca 证书 , 去下载个 ca 证书然后添加进去即可

解决:

查看phpinfo()、检查openssl.cafile的文件是否存在
不存在的话进行如下操作
1、找到自己的 php 的安装目录
2、进入目录:cd php/etc/
3、下载 ca 证书:wget http://curl.haxx.se/ca/cacert.pem
4、查看目录:pwd
5、编辑 php.ini:vim php.ini
6、修改 openssl.cafile 的路径 openssl.cafile=/usr/local/php/etc/cacert.pem

8、扩展:发送纯文本邮件

public function sendEmail()
{
    // 纯文本信息邮件测试
    Mail::raw('你好,我是PHP程序!', function ($message) {
        $to = '[email protected]';
        $message ->to($to)->subject('纯文本信息邮件测试');
    });
    if (count(Mail::failures()) < 1) {
        echo '发送邮件成功,请查收!';
    } else {
        echo '发送邮件失败,请重试!';
    }
}

9、扩展:邮件内容中增加图片

视图文件:

{{$name}} 
<br>
hello world。
<br>
<img src="{{ $message->embed($image) }}">

控制器:

public function sendEmail()
{
    // 邮件内部附件
    $name = '邮件内部附件';
    $image = public_path('php/8I0BHkS2QKmxyfQBBfiamBZALR5Ox2zkN62KFFoP.jpeg');
    // $image = 'http://t8.baidu.com/it/u=1484500186,1503043093&fm=79&app=86&f=JPEG?w=1280&h=853';//网上图片
    Mail::send('Emails.test', ['image' => $image, 'name' => $name], function ($message) {
        $to = '[email protected]';
        $message->to($to)->subject('图片测试');
    });
    if (count(Mail::failures()) < 1) {
        echo '发送邮件成功,请查收!';
    } else {
        echo '发送邮件失败,请重试!';
    }
}

10、扩展:邮件附件

public function sendEmail()
{
    // 发送附件邮件
    $name = '这是带附件的邮件';
    $image = 'http://t8.baidu.com/it/u=1484500186,1503043093&fm=79&app=86&f=JPEG?w=1280&h=853'; //网上图片
    Mail::send('Emails.test', ['image' => $image, 'name' => $name], function ($message) {
        $to = '[email protected]';
        $message->to($to)->subject('邮件测试');
        $attachment = public_path('file/1.xlsx');
        // 在邮件中上传附件 
        $message->attach($attachment, ['as' => '中文文档.xlsx']);
    });
    if (count(Mail::failures()) < 1) {
        echo '发送邮件成功,请查收!';
    } else {
        echo '发送邮件失败,请重试!';
    }
}

如果出现乱码、可以尝试以下写法:

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

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK