zoukankan      html  css  js  c++  java
  • Laravel自带SMTP邮件组件实现发送邮件(QQ、163、企业邮箱都可)

    Laravel自带SMTP邮件组件实现发送邮件(QQ、163、企业邮箱都可)

    laravel自带SMTP邮件配置和遇到的坑

    laravel自带SwiftMailer库,集成了多种邮件API,可以很方便的实现邮件的发送。在本教程中使用到的是SMTP(Simple Message Transfer Protocol)简单邮件传输协议,通常理解为邮件发送服务器

    以QQ邮箱为例

    使用QQ邮箱的话,需要开启POP3和SMTP服务(QQ邮箱登录=》选择设置=》账户=》下拉找到图2)。 
    使用企业邮箱不用开启SMTP,因为企业邮箱自带,如果配置有问题去查一下是否关闭安全登录(企业邮箱) 
    开启方式如下: 
    这里写图片描述 
    这里写图片描述 
    当开启成功会生成密钥,这个东西会在配置中用: 
    这里写图片描述

    配置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

    配置laravel config/mail.php文件

    这文件是laravel自带的文件,如果没有需求,内容可不动

    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),
    ];
    1. 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,其他要么付费要么不能用。
    2. host:邮箱所在主机,使用163邮箱,对应值是smtp.163.com,使用QQ邮箱,对应值是smtp.qq.com。使用腾讯企业邮箱,对应值是smtp.exmail.qq.com
    3. port:用于配置邮箱发送服务端口号,一般默认值是25,但如果设置SMTP使用SSL加密,该值为465。
    4. from:配置项包含address和name,前者表示你自己的邮箱,后者表示你邮件用户名(这里邮箱,是用来发邮件的邮箱)。
    5. encryption:表示加密类型,可以设置为null表示不使用任何加密,也可以设置为tls或ssl。
    6. username: 表示邮箱账号,比如123456789@qq.com
    7. password 表示上述邮箱登录对应登录密码。注意QQ邮箱的话应该开启POP3|SMTP服务时给的授权码。
    8. sendmail: 是在设置driver为sendmail时使用,用于指定sendmail命令路径。
    9. pretend: 用于配置是否将邮件发送记录到日志中,默认为false则发送邮件不记录日志,如果为true的话只记录日志不发送邮件,这一配置在本地开发中调试时很有用

    开始代码之旅

    生成控制器

    php artisan make::controller MailController

    配置路由

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

    在app/Http/Controllers生成了一个MailController控制器,如下所示:

    <?php 
        namespace AppHttpControllers; 
        use AppHttpRequests; 
        class MailController extends Controller { 
            //
         }

    编辑上面控制器,加入以下的逻辑处理:

    use Mail;
    class MailController{ 
        public function send() {
         $name = '我发的第一份邮件'; 
         // Mail::send()的返回值为空,所以可以其他方法进行判断 
         Mail::send('emails.test',['name'=>$name],function($message){ 
         $to = '123456789@qq.com'; $message ->to($to)->subject('邮件测试'); 
         }); 
         // 返回的一个错误数组,利用此可以判断是否发送成功
          dd(Mail::failures());
        } 
    } 

    Mail::send();需要传三个参数,第一个为引用的模板,第二个为给模板传递的变量(邮箱发送的文本内容),第三个为一个闭包,参数绑定Mail类的一个实例。

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

    {{$name}} hello world。

    好,现在在服务器上进行测试了,在地址栏输入http://localhost/mail/send(自己的访问地址),发送成功。

    1. 发送纯文本邮件

    Mail::raw('你好,我是PHP程序!', function ($message) {
        $to = '123456789@qq.com';
        $message ->to($to)->subject('纯文本信息邮件测试');
    });

    2.邮件中发送附件

    发生图片:

    {{$name}},这是一封测试邮件
    <br>
    <img src="{{$message->embedData($image,'test.jpg')}}">
    public function send(){ 
        $image = Storage::get('images/obama.jpg'); //本地文件
        //$image = 'http://www.baidu.com/sousuo/pic/sdaadar24545ssqq22.jpg';//网上图片
        Mail::send('emails.test',['image'=>$image],function($message){ 
            $to = '123456789@qq.com';
            $message->to($to)->subject('图片测试'); 
        }); 
        if(count(Mail::failures()) < 1){
         echo '发送邮件成功,请查收!'; 
        }else{
         echo '发送邮件失败,请重试!';
        } 
    }

    3. 邮件附件

    public function sendFile(){ 
        $name = '我发的第一份邮件'; 
        Mail::send('emails.test',['name'=>$name],function($message){ 
            $to = '123456789@qq.com';
            $message->to($to)->subject('邮件测试'); 
            $attachment = storage_path('xls/files/test.xls');
             // 在邮件中上传附件 
            $message->attach($attachment,['as'=>'中文文档.xls']); 
        }); 
    } 

    $message的attach方法上传附件,该方法第一个参数是附件地址,第二个参数为一些额外参数,这里我们通过as指定附件在邮件中的显示名称。

    测试如果显示文件名乱码的话,就这样写

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

    好了,现在我们的邮件发生功能已经基本满足所有客户的需求了,欢迎小伙伴的留言和光顾,希望帮助每一个踩坑的小伙伴,如果有哪里不对的还希望各位小伙伴多多指出,如果对你请推荐给身边的小伙伴,此博客会时常更新,感谢参考过的每一个博客,谢谢这些前辈为我们填好的坑

  • 相关阅读:
    JZOJ 3034. 【NOIP2012模拟10.17】独立集
    JZOJ 3035. 【NOIP2012模拟10.17】铁轨
    JZOJ 1259. 牛棚安排
    数位DP JZOJ 3316. 非回文数字
    JZOJ 3046. 游戏
    JZOJ 3013. 填充棋盘
    debian 安装oracle提供的java8
    java 汉字转拼音 PinYin4j
    debian ssh设置root权限登陆 Permission denied, please try again
    java并发下订单生成策略
  • 原文地址:https://www.cnblogs.com/brady-wang/p/10531950.html
Copyright © 2011-2022 走看看