使用yii2发送邮件

简介: 前言:收到网站发送的邮件,在我们的生活中经常遇到,那么,我们在网站开发当中,如何向用户发送邮件呢下面我就来介绍下如何在yii2框架中发送邮件目录:mailer组件的配置封装发送邮件的方法mailer里的坑我们使用mailer插件来发送邮件这是这个插件的github地址https://github.

前言:
收到网站发送的邮件,在我们的生活中经常遇到,那么,我们在网站开发当中,如何向用户发送邮件呢
下面我就来介绍下如何在yii2框架中发送邮件


目录:

  1. mailer组件的配置
  2. 封装发送邮件的方法
  3. mailer里的坑

  1. 我们使用mailer插件来发送邮件

这是这个插件的github地址https://github.com/PHPMailer/PHPMailer

但是yii2中内置了mailer组件,我们只需要将它配置下就可以了

//我们在config中的main.php中进行配置,
如果觉得前后台都要用到的话,我们可以在common里来配置
//这里要注意的是组件必须在键名为components的数组中配置
 'mailer' => [
            'class' => \yii\swiftmailer\Mailer::className(),
  ]
//这样我们就配置好了一个最基本的配置

但是这样配置,并不能发送一封邮件.我们知道在yii2中组件类中的public属性我们都是可以自行配制的.我们来看看这个mailer类中,有哪里需要我们配置的数据

mailer中的注释

当我们进入mailer类中,我们可以看到开发者为我们准备了这样的注释
我们注意到,开发者让我们配置一个属性名为transport的属性.让后我们往下面找,并没有发现这个共有的属性,但是我们找到了一个魔术方法

transport魔术方法

这个魔术方法,从命名中可以看出是一个写入方法,方法有一个形参,数据类型为数组或者Swift_Transport对象

我们看了注释,也看了方法,我们现在就可以开始配置了

  • 第一个参数class 我们跟着注释写,Swift_SmtpTransport
  • 第二个参数填写邮件的服务器

我们以qq邮箱为例:
我们进入邮箱


image.png

点击设置
找到这个设置选项


image.png

看看他的说明
image.png

这里找到我们需要的配置信息
我们要发送邮件,那么发送邮件的服务器就是smtp.qq.com

  • 第三个参数 和第四个参数,在自己的邮箱里去设置,一般邮箱会发一个专门的密码来用于外部使用
  • 第四个参数就是用于传递数据的端口号,注意加密和不加密的端口是不同的
  • 第五个参数就是加密的方式

这些在邮箱的帮助文档中都有很详细的说明
下面是我的配置,不同的邮箱配置是不一样的

'mailer' => [
            'class' => \yii\swiftmailer\Mailer::className(),
            'transport' => [
                'class' => 'Swift_SmtpTransport',
                'host' => 'smtp.qq.com',
                'username' => '********@qq.com',
                'password' => '%%%%%%%%%',
                'port' => '465',
                'encryption' => 'ssl',
            ]

  1. 当我们配置完成后,我们就要开始使用了

通常我们会将发送邮件的操作封装到一个方法里,方便我们在不同的地方使用

   /**
     * 向用户发送邮件的方法
     * @param $toMember
     * 用户的邮件地址
     * @param $subject
     * 邮件主题
     * @param $body
     * 邮件内容
     * @return bool
     * 发送结果
     */
    private function sendEmail($toMember, $subject, $body)
    {
        //1构造对象
        $emailObj = Yii::$app->mailer->compose();
        //设置发件人的邮件地址
        return $emailObj->setFrom(Yii::$app->params['adminEmail'])
            ->setTo($toMember)//设置收件人的地址
            ->setSubject($subject)//设置邮件主题
            ->setHtmlBody($body)//设置邮件的内容的html
            ->send();//发送方法
    }

构造mailer对象的写法是固定写法,感情兴趣的朋友可以看看底层源码是如何写的.是在mailer的基类中继承了一个MailerInterface接口
setHtmlBody注意了,里面需要写html代码,如果不想写html的话,还有一个setTextBody方法可以不用写html代码
当我们按照上面的代码写好之后,send方法会返回一个bool值,代表是否发送成功


  1. 细心的朋友应该发现了,send之后命名返回的true,却没有收到发送的邮件.这个就是一个坑了.我们在配置中还有一个需要配置的地方.
    那就是
'useFileTransport' => false

这是一个在mailer基类中的一个属性
官方给的注释是whether to save email messages as files under [[fileTransportPath]] instead of sending them
* to the actual recipients. This is usually used during development for debugging purpose.

意思是,是否将邮件以文件的形式保存,而不是发送给实际的接收者.
是个用来调试用的开关.但是我们发现

image.png

它默认是关闭的.也就是没有开启本地调试.
这里我的解决方法就是在组件中,再次配置一次.

        'mailer' => [
            'class' => \yii\swiftmailer\Mailer::className(),
            'transport' => [
                'class' => 'Swift_SmtpTransport',
                'host' => 'smtp.qq.com',
                'username' => '*********@qq.com',
                'password' => '%%%%%%%%',
                'port' => '465',
                'encryption' => 'ssl',
            ],
            'useFileTransport' => false
        ],

也就是这样,一个完整的mailer组件的配置就是这样.这样配置好了之后就可以正常的发送邮件了.

如果有不正确的地方欢迎大家指正,共同学习.谢谢
以上.

相关文章
|
1月前
|
安全 PHP Apache
thinkphp3.2发送邮件并发送附件
thinkphp3.2发送邮件并发送附件
32 0
thinkphp3.2发送邮件并发送附件
|
4月前
|
小程序 PHP Perl
laravel8(六)使用自定义邮件类发送邮件
当登录邮箱为腾讯企业邮箱的时候。 Phpmailer发送邮件就不好用了,具体哪里不好用,我没真没找到。 但是,邮件得发啊,怎么办呢?
26 2
|
4月前
|
小程序 JavaScript 前端开发
laravel8(五)使用phpmailer发送邮件
博客留言系统需要用到邮件发送,有用户给我留言程序会自动给我发送邮件。很实用的一个小功能。 一:下载phpmailer类库。 我这里使用composer下载:有可能会失败,可以多试几次 bash 复制代码 composer require phpmailer/phpmailer 二:开始使用 php 复制代码 /** * @name: 发送邮件方法 * @author: camellia * @date: 2022-01-19 * @param: $email string 发送给谁 * @param: $mail_title stri
54 0
|
9月前
|
PHP
laravel-发送邮件
laravel-发送邮件
129 0
|
数据安全/隐私保护
Yii2如何把日志发送邮件?底层原理是什么?
Yii2如何把日志发送邮件?底层原理是什么?
|
网络协议 安全 网络安全
SMTP邮件服务器原理解析,php发送邮件,swoole发送邮件
简单邮件传输协议 (Simple Mail Transfer Protocol 简称 SMTP) 是一个相对简单的基于文本的协议。 在发送方(客户端)和接收方(服务器)间创建TCP连接之后 那么接下来就是一个合法的SMTP会话了。(SMTP会话的本质只是一个普通TCP,只是会话的消息按照规范组装发送) 在下面的对话中,所有客户端发送的都以C:作为前缀,所有服务器发送的都以S:作为前缀。
180 0
SMTP邮件服务器原理解析,php发送邮件,swoole发送邮件
laravel5.5 使用sendcloud发送邮件
laravel5.5 使用sendcloud发送邮件
|
PHP 数据安全/隐私保护 安全