smssend/README.md
2026-03-19 18:28:51 +08:00

255 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SMS Send Module
短信发送模块,基于百度云短信服务实现验证码生成、校验和短信发送功能。
## 功能特性
- 百度短信发送
- 验证码生成与验证
- 配置从环境变量读取
## 环境配置
使用本模块前,需要配置以下环境变量:
| 环境变量 | 说明 |
|---------|------|
| `BAIDU_SMS_ACCESS_KEY` | 百度云 access key |
| `BAIDU_SMS_ACCESS_KEY_SECRET` | 百度云 access key secret |
| `BAIDU_SMS_HOST` | 百度短信服务 endpoint |
| `BAIDU_SMS_SIGNATURE_ID` | 短信签名 ID |
## 数据库创建
```mysql
CREATE TABLE `sms_template` (
`id` varchar(32) NOT NULL COMMENT 'id',
`name` varchar(32) DEFAULT NULL COMMENT '模板名称',
`template_type` varchar(32) DEFAULT NULL COMMENT '模板类型',
`code` varchar(32) DEFAULT NULL COMMENT '模板编码',
`content` varchar(200) DEFAULT NULL COMMENT '模板内容',
`description` varchar(100) DEFAULT NULL COMMENT '场景说明',
`provider` varchar(100) DEFAULT NULL COMMENT '短信供应商名称',
`del_flg` varchar(1) DEFAULT '0' COMMENT '删除标志',
`create_at` timestamp NULL DEFAULT current_timestamp() COMMENT '创建时间戳',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci ROW_FORMAT=DYNAMIC COMMENT='短信模板表';
CREATE TABLE `validatecode` (
`id` varchar(32) NOT NULL COMMENT 'id',
`vcode` varchar(32) DEFAULT NULL COMMENT '验证码',
`expire_time` timestamp NOT NULL DEFAULT current_timestamp() COMMENT '有效期',
`del_flg` varchar(1) DEFAULT '0' COMMENT '删除标志',
`create_at` timestamp NOT NULL DEFAULT current_timestamp() COMMENT '创建时间戳',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci ROW_FORMAT=DYNAMIC COMMENT='验证码表';
CREATE TABLE `sms_record` (
`id` varchar(32) NOT NULL COMMENT 'id',
`customerid` varchar(32) DEFAULT NULL COMMENT '客户id',
`send_type` varchar(32) DEFAULT NULL COMMENT '发送类型',
`mobile` varchar(15) DEFAULT NULL COMMENT '手机号',
`email` varchar(32) DEFAULT NULL COMMENT '邮箱',
`message` varchar(510) DEFAULT NULL COMMENT '发送内容',
`send_time` varchar(32) DEFAULT NULL COMMENT '发送时间',
`send_status` varchar(1) DEFAULT NULL COMMENT '发送状态',
`task_status` varchar(2) DEFAULT NULL COMMENT '任务状态 1:待发送,2:待定时发送,11:发送MQ成功,12:MQ消费成功,21:请求成功,22:请求失败,31:取消发送',
`remark` varchar(200) DEFAULT NULL COMMENT '发送失败备注信息',
`del_flg` varchar(1) DEFAULT NULL COMMENT '删除标志',
`create_at` timestamp NULL DEFAULT current_timestamp() COMMENT '创建时间戳',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci ROW_FORMAT=DYNAMIC COMMENT='短信邮箱记录表';
```
## 核心接口
### 1. load_smssend()
初始化加载短信模块,将功能注册到 ServerEnv。
```python
from smssend import load_smssend
load_smssend()
```
### 2. send_sms(phone: str, stype: str)
发送短信(整合生成验证码和发送功能)。
**参数:**
- `phone`: 接收手机号
- `stype`: 短信模板类型
**返回值:**
```python
# 发送成功
{
'status': 'ok',
'data': {
'codeid': 'xxx' # 验证码ID
}
}
# 发送失败
{
'status': 'error',
'data': {
'message': '错误信息'
}
}
```
**示例:**
```python
from smssend import send_sms
result = await send_sms(phone='13800138000', stype='用户注册登录验证')
if result.get('status') == 'ok':
code_id = result['data']['codeid']
print(f"发送成功验证码ID: {code_id}")
```
### 3. check_sms_code(code_id: str, vcode: str)
校验短信验证码。
**参数:**
- `code_id`: 验证码的唯一标识
- `vcode`: 用户输入的验证码
**返回值:**
- 验证成功返回 `True`,验证失败返回 `False`
- 验证码正确且未过期时验证通过,验证后自动标记为已使用
**示例:**
```python
from smssend import check_sms_code
is_valid = await check_sms_code(code_id='xxx', vcode='123456')
if is_valid:
print("验证通过")
else:
print("验证失败")
```
### 6. get_sms_engine()
获取 SMSEngine 单例实例。
**返回值:**
- 返回 `SMSEngine` 对象
**示例:**
```python
from smssend import get_sms_engine
engine = get_sms_engine()
```
## SMSEngine 类
核心引擎类,提供底层短信操作能力。
### 方法
| 方法 | 说明 |
|------|------|
| `send(stype, template_id, phone, params)` | 发送短信 |
| `send_vcode(phone, stype, vcode)` | 发送验证码短信 |
| `generate_sms_code(length, expire_minutes)` | 生成验证码 |
| `check_sms_code(code_id, vcode)` | 校验验证码 |
| `send_sms(phone, stype)` | 发送短信(整合功能) |
## 数据模型
### sms_template - 短信模板表
| 字段 | 类型 | 说明 |
|------|------|------|
| id | str | 主键 |
| name | str | 模板名称 |
| template_type | str | 模板类型 |
| code | str | 模板CODE百度云模板ID |
| content | str | 模板内容 |
| description | str | 描述 |
| provider | str | 供应商 |
| del_flg | str | 删除标志 |
| create_at | timestamp | 创建时间 |
### validatecode - 验证码表
| 字段 | 类型 | 说明 |
|------|------|------|
| id | str | 主键code_id |
| vcode | str | 验证码 |
| expire_time | timestamp | 过期时间 |
| del_flg | str | 删除标志0:未使用, 1:已使用) |
| create_at | timestamp | 创建时间 |
### sms_record - 短信记录表
| 字段 | 类型 | 说明 |
|------|------|------|
| id | str | 主键 |
| customerid | str | 客户ID |
| send_type | str | 发送类型 |
| mobile | str | 手机号 |
| email | str | 邮箱 |
| message | str | 消息内容 |
| send_time | str | 发送时间 |
| send_status | str | 发送状态0:失败, 1:成功) |
| task_status | str | 任务状态 |
| remark | str | 备注 |
| del_flg | str | 删除标志 |
| create_at | timestamp | 创建时间 |
## 使用示例
```python
import asyncio
from smssend import load_smssend, send_sms, check_sms_code
async def main():
# 1. 初始化模块
load_smssend()
# 2. 发送短信
result = await send_sms(phone='13800138000', stype='注册登录')
if result.get('status') == 'ok':
code_id = result['data']['codeid']
print(f"验证码已发送到手机验证码ID: {code_id}")
# 3. 假设用户输入了验证码 '123456'
is_valid = await check_sms_code(code_id=code_id, vcode='123456')
if is_valid:
print("验证码校验通过")
else:
print("验证码错误或已过期")
else:
print(f"发送失败: {result.get('data', {}).get('message')}")
if __name__ == '__main__':
asyncio.run(main())
```
## 依赖
- Python 3.9+
- baidubce (百度云 BCE SDK)
- aiohttp
- sqlor (数据库操作)
- appPublic
- ahserver
## 百度短信文档
详细接口说明请参考:[百度短信服务文档](https://cloud.baidu.com/doc/SMS/s/zjwvxry6e)