# .composer下载PHPMailer包
# 2.封装发送邮件功能
把这个函数丢到`app/common.php`公共的函数文件中去
~~~php
//邮件发送
if (!function_exists('sendmail')) {
function sendmail($address, $title, $body)
{
$mail = new \PHPMailer\PHPMailer\PHPMailer(true);
try {
$mail->SMTPDebug = 0;
$mail->isSMTP();
$mail->CharSet = "UTF-8"; //utf-8;
$mail->Encoding = "base64";
$mail->Host = env('mail.host');
$mail->SMTPAuth = true;
$mail->Username = env('mail.username');
$mail->Password = env('mail.password');
$mail->SMTPSecure = env('mail.encryption');
$mail->Port = env('mail.port');
//Recipients
$mail->setFrom(env('mail.from_address'), env('mail.from_name'));
//接收人
$mail->addAddress($address);
//回复的时候回复给哪个邮箱 建议和发件人一致
$mail->addReplyTo(env('mail.from_address'), 'info');
//Content
$mail->isHTML(true);
//防止中文乱码
$mail->Subject = "=?UTF-8?B?" . base64_encode($title) . "?=";
$mail->Body = $body;
$mail->AltBody = '您的邮箱客户端不支持显示HTML内容';
$mail->send();
return true;
} catch (Exception $e) {
return $e;
}
}
}
~~~
`.env`配置文件
最新的88邮箱配置smtp地址是smtp.88.com 端口465
~~~ini
[MAIL]
HOST = smtp.88.com
PORT = 465
USERNAME = xxxx
PASSWORD = xxxxx
ENCRYPTION = ssl
FROM_ADDRESS = xxxx
FROM_NAME = xxx
~~~
# 3.使用
~~~bash
sendmail('xxx@xx.xx', '系统通知', '<h1>你好啊</h1>');
~~~
# 拓展:使用think-queue消息队列发送邮件
~~~php
//前面的注册逻辑省略...
//缓存key(此处可以替换为redis等nosql缓存产品)
//参数说明
//参数1:缓存标志register_email_code_+用户注册入库时返回的主键id作为缓存key
//参数2:uuid当作缓存值进行缓存
//参数3:缓存过期时间(这里我从我的配置文件中读取,你可以直接设置值,单位:秒),24 * 60 * 60
cache("register_email_code_" . $user->id, $uuid, config('my.email_register.expire'));
//异步发送邮箱
//把需要的数据传递过去
Queue::push(RegEmailActiveJob::class, [
'user_id' => $user->id,
//昵称
'nickname' => $user->profile->nickname,
//uuid
'uuid' => $uuid,
//发给谁
'email' => $user->email
]);
~~~
生成RegEmailActiveJob异步任务
~~~php
<?php
namespace app\job;
use think\queue\Job;
class RegEmailActiveJob
{
public function fire(Job $job, $data)
{
$user_id = $data['user_id'];
$nickname = $data['nickname'];
$uuid = $data['uuid'];
$email = $data['email'];
$link = env('app.host') . '/validate/email?user_id=' . $user_id . '&code=' . $uuid;
//smarty替换变量后返回html内容
$html = app('smarty')->fetch('index/email/regEmailActive.tpl', compact('nickname', 'link'));
//发送邮件
sendmail($email, config('my.email_register.title'), $html);
if ($job->attempts() > 3) {
//通过这个方法可以检查这个任务已经重试了几次了
// Log::info("超过三次");
}
//如果任务执行成功后 记得删除任务,不然这个任务会重复执行,直到达到最大重试次数后失败后,执行failed方法
$job->delete();
// 也可以重新发布这个任务
//$job->release(0); //$delay为延迟时间
}
public function failed($data)
{
// ...任务达到最大重试次数后,失败了
}
}
~~~
uuid生成方法
~~~perl
//生成uuid
if (!function_exists('uuid')) {
function uuid($prefix = '')
{
$chars = md5(uniqid(mt_rand(), true));
$uuid = substr($chars, 0, 8);
$uuid .= substr($chars, 8, 4);
$uuid .= substr($chars, 12, 4);
$uuid .= substr($chars, 16, 4);
$uuid .= substr($chars, 20, 12);
return $prefix . $uuid;
}
}
~~~
# 发送成功后用户点击连接的处理
验证成功后你可以直接登录,你也可以跳转回登录页,让用户登录
~~~php
//邮箱注册链接回调
public function email(Request $request)
{
//接收参数
$user_id = $request->get('user_id');
$code = $request->get('code');
if ($user_id === null || $code === null) {
return $this->smarty->display('index/error/error.tpl', [
'msg' => '激活地址非法',
'code' => 500
]);
}
//判断缓存中取出来的是否和传递过来的是否相等
if (cache('register_email_code_' . $user_id) != $code) {
return $this->smarty->display('index/error/error.tpl', [
'msg' => '激活地址已失效',
'code' => 500
]);
}
//上面那一步过不来就等于是非法了,到这一步其实就已经可以直接更新状态了
$user = User::with(['profile'])->find($user_id);
$user->status = 1;
$user->save();
//让缓存失效
cache('register_email_code_' . $user_id, null);
//直接登录
session('index_user', $user);
return redirect((string)url('/'))->with('success', '登录成功');
}
~~~
- thinkphp6执行流程(一)
- php中use关键字用法详解
- Thinkphp6使用腾讯云发送短信步骤
- 路由配置
- Thinkphp6,static静态资源访问路径问题
- ThinkPHP6.0+ 使用Redis 原始用法
- smarty在thinkphp6.0中的最佳实践
- Thinkphp6.0 搜索器使用方法
- 从已有安装包(vendor)恢复 composer.json
- tp6with的用法,表间关联查询
- thinkphp6.x多对多如何添加中间表限制条件
- thinkphp6 安装JWT
- 缓存类型
- 请求信息和HTTP头信息
- 模型事件用法
- 助手函数汇总
- tp6集成Alipay 手机和电脑端支付的方法
- thinkphp6使用jwt
- 6.0session cookie cache
- tp6笔记
- TP6(thinkphp6)队列与延时队列
- thinkphp6 command(自定义指令)
- command(自定义指令)
- 本地文件上传
- 缓存
- 响应
- 公共函数配置
- 七牛云+文件上传
- thinkphp6:访问多个redis数据源(thinkphp6.0.5 / php 7.4.9)
- 富文本编辑器wangEditor3
- IP黑名单
- 增删改查 +文件上传
- workerman 定时器操作控制器的方法
- 上传文件到阿里云oss
- 短信或者邮箱验证码防刷代码
- thinkphp6:访问redis6(thinkphp 6.0.9/php 8.0.14)
- 实现关联多个id以逗号分开查询数据
- thinkphp6实现邮箱注册功能的细节和代码(点击链接激活方式)
- 用mpdf生成pdf文件(php 8.1.1 / thinkphp v6.0.10LTS )
- 生成带logo的二维码(php 8.1.1 / thinkphp v6.0.10LTS )
- mysql数据库使用事务(php 8.1.1 / thinkphp v6.0.10LTS)
- 一,创建过滤IP的中间件
- 源码解析请求流程
- 验证码生成
- 权限管理
- 自定义异常类
- 事件监听event-listene
- 安装与使用think-addons
- 事件与多应用
- Workerman 基本使用
- 查询用户列表按拼音字母排序
- 扩展包合集
- 查询用户数据,但是可以通过输入用户昵称来搜索用户同时还要统计用户的文章和粉丝数
- 根据图片的minetype类型获取文件真实拓展名思路
- 到处excel
- 用imagemagick库生成缩略图
- 生成zip压缩包并下载
- API 多版本控制
- 用redis+lua做限流(php 8.1.1 / thinkphp v6.0.10LTS )
- 【thinkphp6源码分析三】 APP类之父, 容器Container类
- thinkphp6表单重复提交解决办法
- 小程序授权
- 最简单的thinkphp6导出Excel
- 根据访问设备不同访问不同模块
- 服务系统
- 前置/后置中间件
- 给接口api做签名验证(php 8.1.1 / thinkphp v6.0.10LTS )
- 6实现邮箱注册功能的细节和代码(点击链接激活方式)
- 使用前后端分离的验证码(thinkphp 6.0.9/php 8.0.14/vue 3.2.26)
- 前后端分离:用jwt+middleware做用户登录验证(php 8.1.1 / thinkphp v6.0.10LTS )
- vue前后端分离多图上传
- thinkphp 分组、页面跳转与ajax
- thinkphp6 常用方法文档
- 手册里没有的一些用法
- Swagger 3 API 注释
- PHP 秒级定时任务
- thinkphp6集成gatewayWorker(workerman)实现实时监听
- thinkphp6按月新增数据表
- 使用redis 实现消息队列
- api接口 统一结果返回处理类
- 使用swoole+thinkphp6.0+redis 结合开发的登录模块
- 给接口api做签名验证
- ThinkPHP6.0 + UniApp 实现小程序的 微信登录
- ThinkPHP6.0 + Vue + ElementUI + axios 的环境安装到实现 CURD 操作!
- 异常$e
- 参数请求验证自定义和异常错误自定义