• laravel发送邮件


    环境

    基于 Laravel Framework 5.5.45,使用自带的SMTP协议提供驱动。

    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,其他要么付费要么不能用。

    官方文档

    第一步 laravel 邮箱配置

    hotmail 获取邮箱授权码    Gmail获取邮箱授权码
    laravel只需要配置.env即可。

    MAIL_DRIVER=smtp
    MAIL_HOST=smtp.gmail.com
    MAIL_PORT=465
    MAIL_USERNAME=你的Gmail邮箱地址
    MAIL_PASSWORD=你的Gmail邮箱地址对应的授权密码(不是登录密码)
    MAIL_ENCRYPTION=ssl 
    MAIL_FROM_ADDRESS="你的Gmail邮箱地址 |这项需要和MAIL_USERNAME一模一样"
    MAIL_FROM_NAME="发件人名称"
    

    Notice: MAIL_ENCRYPTION可以根据需要修改,但是如果不使用ssl,也需要修改MAIL_PORT为25端口

    生成 Mailable 对象

    在 Laravel 中,每种类型的邮件都代表一个「Mailable」对象。这些对象存储在 app/Mail 目录中。如果在你的应用中没有看见这个目录,别担心,在首次使用 make:mail 命令创建 Mailable 类时这个目录会被创建,例如:

    php artisan make:mail OrderShipped
    

    编写 Mailable

    使用 from 方法

    首先,演示配置邮件的发送者,也就是邮件的参数 「from」,既谁发送了邮件。有两种方法配置发送者。第一种是你可以在 build 方法中使用 from 方法:

    form方法一定要填写第二个参数,不然会报错 Swift_TransportException: Expected response code 250 but got code "501", with message "501

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->from('example@example.com这里填邮箱','这里添写发送人名称,不然会报错的')
                    ->view('emails.orders.shipped');
    }
    

    配置视图

    build 方法内,你可以使用 view 方法指定邮件的模板,以渲染邮件的内容。因为所有邮件都会使用 Blade 模板 渲染内容,你能很容易的使用 Blade 模板引擎构建邮件的 HTML:

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

    {tip} 你可以创建一个 resources/views/emails 目录来存放所有的邮件模板;然而,这不是强制要求,你可以在有的将邮件模板放在 resources/views 目录的任意位置。

    通过 subject 方法设置邮件主题

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('emails.orders.shipped')
                 ->subject('xxx'); // 邮件主题
    }
    

    通过 with 方法向模板传参:

    你可以使用 with 方法来传递数据给模板。一般情况下,你仍然是使用 Mailable 类的构造函数来接受数据传参。然而你需要为这些数据属性设置 protectedprivate 声明,否则这些数据会被自动加载到模板中。接下来你可以使用 with 方法接受键值数组传参来传递数据给模板,就如控制器里为视图传参一样:

    <?php
    
    namespace AppMail;
    
    use AppOrder;
    use IlluminateBusQueueable;
    use IlluminateMailMailable;
    use IlluminateQueueSerializesModels;
    
    class OrderShipped extends Mailable
    {
        use Queueable, SerializesModels;
    
        /**
         * order 实例。
         *
         * @var Order
         */
        protected $order;
    
        /**
         * 创建一个新消息实例。
         *
         * @return void
         */
        public function __construct(Order $order)
        {
            $this->order = $order;
        }
    
        /**
         * 构建消息。
         *
         * @return $this
         */
        public function build()
        {
            return $this->view('emails.orders.shipped')
                        ->with([
                            'orderName' => $this->order->name,
                            'orderPrice' => $this->order->price,
                        ]);
        }
    }
    

    一旦数据已经用 with 方法传递,它们将自动在视图中加载,所以你可以访问像访问其他 Blade 模板数据一样访问它们:

    <div>
        Price: {{ $orderPrice }}
    </div>
    

    发送邮件

    要发送邮件,使用 Mail facade 的 to 方法。 to 方法接受一个邮件地址,一个 user 实现或一个 users 集合。如果传递一个对象或集合,mailer 将自动使用 emailname 属性来设置邮件收件人,所以确保你的对象里有这些属性。一旦指定收件人,你可以传递一个实现到 Mailable 类的 send 方法:

    <?php
    
    namespace AppHttpControllers;
    
    use AppOrder;
    use AppMailOrderShipped;
    use IlluminateHttpRequest;
    use IlluminateSupportFacadesMail;
    use AppHttpControllersController;
    
    class OrderController extends Controller
    {
        /**
         * Ship the given order.
         *
         * @param  Request  $request
         * @param  int  $orderId
         * @return Response
         */
        public function ship(Request $request, $orderId)
        {
            $order = Order::findOrFail($orderId);
    
            // Ship order...
    
            Mail::to($request->user())->send(new OrderShipped($order));
        }
    
        /**
         * 这个是我的改造的demo
         * 发送邮件
         */
        public function sendEmail(Request $request)
        {
            $email = $request->input('email');
            $verify_code = $request->input('verify_code');
            $return = ['code' => 0, 'msg' => '成功'];
    
            $email_preg = '/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.|-]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/';
            if (!preg_match($email_preg, $email)) {
                return ['code' => 1, 'msg' => '邮箱格式错误'];
            }
            $code_preg = '/^[0-9]{6}$/';
            if (!preg_match($code_preg, $verify_code)) {
                return ['code' => 2, 'msg' => '验证码格式错误'];
            }
    
            try {
                Mail::to($email)->send(new Email($verify_code));
            } catch (Error $error) {
                $return = ['code' => 4, 'msg' => '邮件发送失败'];
            }
            return $return;
        }
    }
    
  • 相关阅读:
    c++继承与多态
    逻辑运算符
    页面分栏布局
    js中的三大特殊数据:undefined,null,NaN
    逻辑分支中if小括号中的隐式转换
    最小高度的兼容方法
    js数据类型的转换
    ognl.OgnlException: target is null for setProperty(null, "goodsSize", [Ljava.lang.String;@c3bb5。
    解决拦截器的对于参数传递无效问题
    引用外部js乱码问题
  • 原文地址:https://www.cnblogs.com/niuben/p/13626519.html
Copyright © 2020-2023  润新知