Skip to content

cler1818/sms_forwarding

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

68 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

低成本短信转发器

本仓库基于 chenxuuu/sms_forwarding 复刻修改,保留原短信转发能力,并增加主动配网、备用 WiFi、定时发送、状态快照、远程短信、来电提醒等功能。

后台页面演示

本项目旨在使用低成本的硬件设备,实现短信自动转发、网页管理、远程发送短信和在线状态通知,支持多种推送方式同时启用。

视频教程:B站视频

功能

  • 短信转发:收到短信后转发到已启用的推送通道和邮箱通道。
  • 来电提醒:收到来电后推送来电号码、归属地、本机号码和响铃时长。
  • 中文通知模板:短信、来电、系统通知均使用中文模板,时间格式为 2026年7月5日 14:56:00
  • 本机号码管理:可在网页或管理员短信中设置本机号码;保存本机号码时会尝试写入 SIM 卡本机号码;开机/首次识别 SIM 后会尝试从 SIM 卡读取本机号码并保存。
  • 内置手机号归属地库:基于 dannyhu926/phone_location 生成 ESP32 可查的压缩归属地表,来电/来信可显示省市和运营商。
  • 国外号码国别识别:国外号码按国家显示,如 美国日本韩国英国
  • 网页管理后台:支持浏览器配置账号、WiFi、邮箱、推送通道、管理员号码、黑名单、定时短信、状态快照等。
  • 主动配网:WiFi 连接失败时自动开启 ESP32 AP 热点,手机连接热点后可进入管理页面配置 WiFi。
  • WiFi 自动恢复:配网热点与 STA 同时运行,断线后持续尝试三组 WiFi;恢复并连续稳定 60 秒后发送“WiFi断线后已重新上线”提醒,10 分钟内重复波动只提醒一次。
  • 定时模组重启:可在“模组控制”中配置每天、每周或每月定时重启,并选择 AT 软重启或 EN 引脚硬重启。
  • 推送规则:系统消息、收到的短信、来电和其他兜底消息可分别选择邮箱 1~3、推送通道 1~5,并支持多条正则匹配规则。
  • 三组 WiFi:支持 WiFi1、WiFi2、WiFi3 顺序连接;无密码 WiFi 可留空密码。
  • 多邮箱通道:支持 3 个完全独立 SMTP 邮件通道,每个通道可填写多个接收邮箱。
  • 多推送通道:支持最多 5 个推送通道同时启用,每个通道可独立选择 POST JSON、Bark、GET、钉钉、PushPlus、Server酱、自定义、飞书、Gotify、Telegram。
  • PushPlus 群组推送:PushPlus 可填写群组名称/编码,直接推送到群组。
  • 推送优先发送:系统通知、短信通知、来电通知均优先发送推送通道,推送完成后再发送邮件,避免 SMTP 邮件连接慢拖延手机推送。
  • 推送失败重试:单个推送通道失败后立即继续下一个通道,所有通道尝试完成后再对失败通道重试 3 次。
  • 网页发送短信:可通过管理页面主动发送短信。
  • 管理员远程短信:管理员可通过统一 配置: 短信格式远程发送短信、修改本机号码、WiFi、推送通道、邮箱通道、定时短信、状态快照、号码黑名单,并可查询系统参数。
  • 管理员白名单:最多 10 个管理员号码可执行远程短信指令。
  • 号码黑名单:黑名单号码发来的短信会被忽略,不转发、不发邮件、不推送。
  • 定时发送短信:支持每天/每周/每月定时发送短信;短信内容留空时发送系统概览。
  • 状态快照:支持每天/每周/每月定时通过推送通道发送状态快照,不发送短信。
  • 长短信分段处理:长短信分段 5 秒内收齐只推送完整合并版;未收齐时推送已收到分段并标注可能不完整,后续收齐后再推送完整合并版。
  • 模组诊断:支持固件信息、信号质量、SIM 卡信息、网络状态、WiFi 状态查询。
  • 模组控制:支持模组软重启、硬重启、信号查询、运营商查询、IMEI 查询、飞行模式切换。
  • AT 指令终端:网页内置 AT 终端,可直接调试模组 AT 指令。
  • 系统日志:网页可查看设备运行日志。
  • 后台模组初始化:网页先启动,启动约 8 秒后初始化模组;未插 SIM 或未注册时不影响管理页面使用。
  • Huge APP 分区适配:内置完整归属地库后必须使用 Huge APP (3MB No OTA/1MB SPIFFS) 分区。

远程短信格式

只有“管理员号码”列表中的手机号可以执行远程指令。管理员号码最多支持 10 个,每行填写一个手机号;发送方号码带不带 +86 都会做兼容匹配。

所有远程配置短信必须以 配置:CONFIG 开头,避免普通短信误触发。配置成功或失败后,设备都会发送系统通知,通知内容会写清楚本次修改了什么。

管理员短信指令完整说明

指令 格式 作用 备注
远程发送短信 配置: + 短信收件人:号码 + 短信内容:内容 让设备向指定号码发送短信 目前只保留这一种远程发短信格式
远程配置 配置: 开头的多行配置 修改本机号码、WiFi、邮箱、推送通道、定时任务、黑名单等 只有管理员号码可执行
远程查询系统参数 配置:查询系统参数 查询设备能读取到的系统和配置参数 会返回敏感配置,仅限可信管理员使用
远程重启 RESET 重启模组并重启 ESP32 必须全部大写

一次性修改多个参数

一条管理员短信可以同时修改多个配置项。格式仍然是第一行写 配置:,后面每行写一个 字段名:内容。例如同时修改本机号码、WiFi、PushPlus 和邮箱通道:

配置:
本机号码:13900000000
WIFI序号:1
WIFI名称:示例WiFi
WIFI密码:示例密码12345678
推送序号:1
推送类型:PushPlus
通道名称:我的PushPlus
Token:你的pushplus_token
群组:示例群组
启用:是
邮箱序号:1
SMTP服务器:smtp.qq.com
SMTP端口:465
发送邮箱账号:example@qq.com
密码:邮箱授权码
接收邮件地址:example@qq.com,example@qq.com

注意:同一种配置如果要同时修改多个槽位,例如推送通道 1 和推送通道 2,建议分两条短信发送;一条短信里只有一个 推送序号邮箱序号WIFI序号 会作为当前操作槽位。远程发送短信使用 短信收件人短信内容 时会优先执行发送短信,不建议和其它配置混在同一条短信里。

远程发送短信

配置:
短信收件人:13900000000
短信内容:查询话费

修改本机号码

手动设置本机号码;保存后会尝试写入 SIM 卡本机号码:

配置:
本机号码:13900000000

尝试从 SIM 卡读取本机号码并保存:

配置:
本机号码:自动

备注:不是所有 SIM 卡都会保存本机号码,也不是所有模组/SIM 都支持写入本机号码;失败时系统会保留本机配置号码。

添加、修改或删除 WiFi

自动写入空闲 WiFi 位;如果 1/2/3 都已有,会默认覆盖 WiFi1:

配置:
WIFI名称:示例WiFi
WIFI密码:示例密码12345678

指定修改 WiFi1、WiFi2 或 WiFi3:

配置:
WIFI序号:1
WIFI名称:示例WiFi
WIFI密码:示例密码12345678

删除 WiFi2:

配置:
WIFI序号:2
WIFI操作:删除

添加、修改或删除邮箱通道

邮箱序号可选:123

配置:
邮箱序号:1
SMTP服务器:smtp.qq.com
SMTP端口:465
发送邮箱账号:example@qq.com
密码:邮箱授权码
接收邮件地址:example@qq.com,example@qq.com

删除邮箱通道 2:

配置:
邮箱序号:2
邮箱操作:删除

添加、修改或删除推送通道

推送序号可选:12345启用 可填 是/否开启/关闭1/0

POST JSON 示例:

配置:
推送序号:1
推送类型:POST JSON
通道名称:我的POST
推送URL:https://example.com/sms
启用:是

Bark 示例:

配置:
推送序号:1
推送类型:Bark
通道名称:我的Bark
推送URL:https://api.day.app/你的key
启用:是

GET 示例:

配置:
推送序号:1
推送类型:GET
通道名称:我的GET
推送URL:https://example.com/push
启用:是

钉钉机器人示例:

配置:
推送序号:1
推送类型:钉钉
通道名称:钉钉群
推送URL:https://oapi.dingtalk.com/robot/send?access_token=xxx
Secret:SECxxxxxxxx
启用:是

PushPlus 示例;群组 可留空,留空则推送给自己:

配置:
推送序号:1
推送类型:PushPlus
通道名称:我的PushPlus
Token:你的pushplus_token
群组:群组名称
启用:是

Server酱 示例:

配置:
推送序号:1
推送类型:Server酱
通道名称:我的Server酱
Token:你的SendKey
启用:是

自定义模板示例;请求体 可使用 {sender}{message}{timestamp} 占位符:

配置:
推送序号:1
推送类型:自定义
通道名称:自定义接口
推送URL:https://example.com/custom
请求体:{"sender":"{sender}","message":"{message}","timestamp":"{timestamp}"}
启用:是

飞书机器人示例:

配置:
推送序号:1
推送类型:飞书
通道名称:飞书群
推送URL:https://open.feishu.cn/open-apis/bot/v2/hook/xxx
Secret:可选secret
启用:是

Gotify 示例:

配置:
推送序号:1
推送类型:Gotify
通道名称:Gotify
推送URL:https://gotify.example.com
Token:你的Gotify应用Token
启用:是

Telegram 示例:

配置:
推送序号:1
推送类型:Telegram
通道名称:Telegram
推送URL:https://api.telegram.org
ChatID:123456789
BotToken:示例BotToken
启用:是

删除推送通道 1:

配置:
推送序号:1
推送操作:删除

设置或删除定时短信

周期 可选:每天每周每月。每周可加 星期:1-7,每月可加 日期:1-31。短信内容留空时发送系统概览。

配置:
定时短信:开启
周期:每天
时间:09:30
号码:13900000000
内容:查询话费

每周示例:

配置:
定时短信:开启
周期:每周
星期:1
时间:09:30
号码:13900000000
内容:查询话费

删除定时短信:

配置:
定时短信操作:删除

设置或删除状态快照

周期 可选:每天每周每月。状态快照只走推送通道,不发送短信;内容留空时发送系统概览。

配置:
状态快照:开启
周期:每天
时间:09:00
内容:

删除状态快照:

配置:
状态快照操作:删除

设置号码黑名单

添加黑名单号码:

配置:
黑名单号码:13900000000

删除黑名单号码:

配置:
黑名单操作:删除
黑名单号码:13900000000

清空黑名单:

配置:
黑名单操作:清空

查询系统参数

配置:查询系统参数

返回内容包含管理地址、本机号码、管理员号码、推送通道、WiFi、IP、信号、可用内存、运行时长、模组状态、WiFi 配置、邮箱通道、推送通道、定时短信、状态快照等。

管理员和黑名单备注

  • 管理员号码:只有管理员号码发送的远程指令才会执行;非管理员发送同样内容会按普通短信处理或转发。
  • 号码黑名单:黑名单号码发来的短信会被直接忽略,不转发、不发邮件、不走推送通道。
  • 命令结果通知:远程发送短信成功/失败、远程重启等管理员操作会通过已配置的通知通道推送结果。
  • 查询参数提醒配置:查询系统参数 会返回保存的 WiFi 密码、邮箱授权码、推送 Token 等敏感配置,只允许可信管理员使用。
  • 安全建议:管理员号码不要填写无关号码;如果 SIM 卡可能被他人知道号码,建议只保留必要管理员。

推送通道支持

支持以下推送方式,可同时启用多个通道:

推送方式 说明 需要配置
POST JSON 通用HTTP POST URL
Bark iOS推送服务 Bark服务器URL
GET请求 URL参数方式 URL
钉钉机器人 企业群通知 Webhook URL,可选Secret加签
PushPlus 微信公众号推送 Token
Server酱 微信推送服务 SendKey
自定义模板 灵活的JSON模板 URL + 请求体模板
飞书机器人 自定义通知 Webhook URL
Gotify 自建推送服务 URL + Token
Telegram Bot Telegram Bot 推送 Chat ID + Bot Token

推送格式说明

  • POST JSON: {"sender":"发送者号码","message":"短信内容","timestamp":"时间戳"}
  • Bark: {"title":"发送者号码","body":"短信内容"}
  • GET请求: URL?sender=xxx&message=xxx&timestamp=xxx(自动URL编码)
  • 钉钉机器人: 文本消息格式,支持加签验证
  • PushPlus: 使用Token推送,支持HTML格式
  • Server酱: 使用SendKey推送,支持Markdown格式
  • 自定义模板: 使用{sender}{message}{timestamp}占位符
  • 飞书机器人: 文本消息格式,支持加签验证
  • Gotify: 使用 Token 推送到 Gotify 服务
  • Telegram Bot: 使用 Chat ID 和 Bot Token 推送
  • PushPlus 群组: 参数2可填写群组名称/编码,留空则推送给自己
状态信息 主动ping

硬件搭配

若没有焊接能力,希望直接使用成品,可选直接购以下套件(我看过了,和自己做的成本一样)
支持移动/联通/电信卡

如果希望自行焊接硬件,参考下面的硬件搭配,总成本约¥27.8(会有浮动,可按实际自行组合搭配)
仅支持移动/联通卡

硬件连接

ESP32C3 与 ML307R-DC 通过串口(UART)连接,接线如下:

┌───────────────────────────────────────────────┐
|                                               |
|   ESP32C3 Super Mini      ML307R-DC核心板     |
| ┌───────────────────┐    ┌─────────────────┐ |
└─┼─ GPIO5 (MODEM_EN) │    │                 │ |
  │       GPIO3 (TX) ─┼───►│ RX              │ |
  │                   │    │             EN ─┼─┘
  │       GPIO4 (RX) ◄┼────┤ TX              │ 
  │                   │    │                 │ 
  │              GND ─┼────┤ GND             │ 
  │                   │    │                 │ 
  │               5V ─┼────┤ VCC (5V)        |
  │                   │    │                 │
  └───────────────────┘    └─────────────────┘
                           │                 │
                           │  SIM卡槽        │
                           │  (插入Nano SIM) │
                           │                 │
                           │  天线接口       │
                           │  (连接4G天线)   │
                           └─────────────────┘

可通过USB连接ESP32C3进行编程和供电,正常工作时,可通过网页与模组进行AT通信,方便调试。

软件组成

  • ESP32C3运行自己的Arduino固件,负责连接WiFi和接收ML307R-DC发送过来的短信数据,然后转发到指定HTTP接口或邮箱
  • ML307R-DC运行默认的AT固件,不用动

需要在Arduino IDE中单独安装这些库:

  • ReadyMail by Mobizt
  • pdulib by David Henry

需要在Arduino IDE中安装ESP32开发板支持,参考官方文档,版型选MakerGO ESP32 C3 SuperMini

Arduino IDE 烧录设置

安装 IDE 前期准备

  1. 在 Windows 商店下载并安装 Arduino IDE 2
  2. 打开 Arduino IDE 2,点击界面最左侧一列的 开发板管理器,搜索并安装 esp32 by Espressif Systems
  3. 点击界面最左侧一列的 库管理,搜索并安装 ReadyMail by Mobiztpdulib by David Henry

在 Arduino IDE 顶部菜单依次进入 工具,按下面设置:

设置项 选择值 为什么这样设置
开发板 MakerGO ESP32 C3 SuperMini 当前代码按这块 ESP32-C3 SuperMini 的引脚和板卡定义适配
Partition Scheme Huge APP (3MB No OTA/1MB SPIFFS) 固件功能较多,默认 1.2MB APP 分区空间很紧;本项目升级通常是 USB 重新烧录,不依赖 OTA
Erase All Flash Before Sketch Upload Disabled 避免每次烧录清空已保存的 WiFi、推送通道、账号等配置
USB CDC On Boot Enabled 方便通过 USB 串口查看启动日志和调试输出
Upload Speed 921600 烧录速度更快;如果烧录失败,再临时降到 115200

注意:如果切换过 Partition Scheme 后出现异常,建议第一次切换时可临时选择 Erase All Flash Before Sketch Upload: Enabled 完整刷一次;刷完后再改回 Disabled,避免后续配置被清空。

网站截图

以下截图为本地模拟管理页面生成,用于展示页面结构;实际设备中的 IP、号码、WiFi、推送通道等内容会按你的真实配置显示。

使用说明

系统概览

账号管理

邮件通道

推送通道

账号管理中的管理员与黑名单

WiFi 设置

设备支持三组 WiFi 按主 WiFi、备用 A、备用 B 的顺序连接。运行期间 WiFi 中断时,设备会开启 192.168.4.1 配网热点,同时继续在后台自动重连,不会因一次连接失败永久停留在热点模式。

配网页支持实时重新扫描和手动输入 SSID。后台连接使用全信道扫描,并在重新连接 STA 前恢复正常发射功率。

当运行中的设备发生 WiFi 中断并重新上线后,会等待连接连续稳定 60 秒,再通过已启用的推送/邮箱通道发送恢复提醒。提醒包含 SSID、IP、RSSI、BSSID、信道、估算离线时长和断线原因代码。为避免路由器波动造成消息轰炸,恢复提醒设置了 10 分钟冷却时间;冷却期内的重复断线恢复不会再次提醒。设备首次开机联网仍发送原有开机通知,不作为断线恢复提醒。

定时模组重启

“定时任务”页面支持配置每天、每周或每月定时重启,并可选择以下方式:

  • 软重启:发送 AT+CFUN=1,1,主要重启模组协议栈和固件,耗时较短,对供电冲击较小。
  • 硬重启:通过 ESP32-C3 控制模组 EN 引脚断电再上电,重启更彻底,适合模组无 AT 响应或软重启无效的情况。
  • 整机重启:先通过 EN 引脚硬重启 4G 模组,再执行 ESP.restart() 重启 ESP32-C3 主控,是范围最完整的重启方式。

软重启和硬重启只控制蜂窝通信模组;只有“整机重启”会同时重启 4G 模组和 ESP32-C3。任务执行前会先保存当天的运行标记,避免同一分钟内重复触发。定时功能依赖设备已获得有效网络时间,默认关闭。

推送规则

左侧“推送规则”将通知合并为四类:系统消息、短信、电话、其他。开机、WiFi 恢复、配置变化、重启、状态快照和短信发送结果均归入系统消息;“其他”作为以后新增消息的防漏兜底。每一类都可独立选择邮箱 1~3和推送通道 1~5。

每类消息提供默认通道和 5 个正则规则槽位。正则过滤默认关闭,所有规则也默认不勾选,只预填示例内容;短信规则 1 预填验证码相关表达式。开启正则过滤时必须至少勾选一条规则,否则拒绝保存。多条规则同时匹配时会合并目标通道并去重。

“管理员 & 黑名单”已合并到“账号管理”的登录凭据下方。左侧新增“定时任务”,集中显示定时短信、状态快照和定时模组/整机重启;原“定时发送”更名为“定时短信”。

左侧“配置”区当前顺序为:使用说明、系统概览、账号管理、WiFi 设置、邮件通道、推送通道、推送规则、定时任务。“定时任务”不再放在“工具”区。推送规则使用独立内容页嵌入右侧,避免重复显示整套左侧菜单。

轻量正则支持 |.*+?^$、字符组 []\d\w\s,英文匹配不区分大小写。规则保存在 NVS 中。

管理主页的推送通道表单采用分段流式输出,避免页面较大、堆内存碎片化时 %PUSH_CHANNELS% 占位符替换失败。空白配置项会直接跳过输出,不能作为空 HTTP 数据块发送,否则浏览器会把它当成页面传输结束,造成页面脚本缺失和左侧菜单无法点击。

工具菜单

发送短信

模组诊断

网络测试

模组控制

AT 终端

系统日志

About

超低成本硬件短信转发器,支持移动联通电信,ML307R+ESP32C3

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • C++ 99.8%
  • C 0.2%