【极简低成本小终端】多 WiFi 自动连・3 键选消息・一键发 Outlook 邮件
(DFRobot ESP32 成品方案,无需电脑、无需后台,到手即用)
一、它是什么?
一个超小、超便宜、超稳定的离线一键发邮件工具。
提前写好 WiFi、收件人、邮件内容,按一个键,自动联网 → 自动发送到指定邮箱。
不用手机、不用电脑、不用点开任何软件。
二、核心功能(你想要的全都有)
✅ 提前存多个 WiFi(家里 / 公司 / 学校 / 场地都能用)
✅ 进入信号范围自动连接
✅ 3 个独立按键 = 3 条不同消息 + 3 个不同收件人
✅ 完美支持 Outlook / Office365
✅ 上电即用、断网重连、掉电不丢配置
✅ DFRobot 正品硬件,稳定可靠
三、应用场景(真实可落地)
1. 工地 / 设备 / 机房 —— 状态上报
- 按键 1:设备正常 → 发给管理员
- 按键 2:需要巡检 → 发给运维
- 按键 3:紧急告警 → 发给负责人
不用扫码、不用登账号,工人老人都能一键操作。
2. 校园 / 班级 / 机构 —— 简易通知
- 老师 / 值班人员一键发:
已到岗、教室正常、水电关闭、活动结束
邮件直接进老师 / 领导邮箱,留痕可查。
3. 家庭 / 老人 / 小孩 —— 安全求助
- 老人一键发:我已到家
- 一键发:身体正常
- 一键发:需要帮助
自动连家里 WiFi,邮件秒发到子女邮箱。
4. 商铺 / 小店 / 仓库 —— 日常报备
- 到货、清仓、盘点、异常、关门确认
不用打字,不用登微信,一键邮件存档。
5. 无人值守 / 物联网小站
- 环境触发、人工确认、事件上报
低成本替代:云平台、短信费、复杂设备。
四、硬件清单(最便宜 DFRobot 方案)
- DFRobot FireBeetle ESP32 主控(WiFi 核心)
- 3 个轻触按键(选择消息、一键发送)
- 杜邦线
- 5V USB 供电(充电宝 / 充电头均可)
可选:0.96 寸 OLED 屏幕(显示联网状态、发送成功 / 失败)
五、为什么选它?
✅ 比手机简单:不用解锁、不用打字、不会误触
✅ 比对讲机正式:邮件可留档、可追溯、可转发
✅ 比云平台便宜:一次做好,永久 0 服务费
✅ 比电脑方便:上电就用,随处可放
六、一句话总结
它就是:一个不用屏幕、不用账号、一键发 Outlook 邮件的极简小终端。
适合:告警、上报、通知、求助、巡检、存档。
操作方法:
极简接线图(超好接,不会烧板)
代码在下面,按键一端接 GPIO,一端接 GND
- 按键 1 → GPIO14
- 按键 2 → GPIO27
- 按键 3 → GPIO26
- 三个按键另一端 全部共接 GND
配套必做设置(我给你打包好)
- 安装库:SimpleMail
- Outlook 开启双重验证 → 获取应用密码
- 代码内填入:
- 3 组预设 WiFi 名 + 密码
- 发件 Outlook 账号 + 应用密码
- 3 个收件邮箱、3 组标题 + 正文
- DFRobot FireBeetle ESP32 按键接线实拍示意图(极简版)
接线规则(内部上拉,无需电阻)
- 按键一端接 ESP32 指定 GPIO
- 按键另一端统一接 GND
- 代码已配置内部上拉,按下为低电平触发
实物接线图
[img=0,24]data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20 ... eight=%27192%27/%3e[/img]
3 按键对应引脚(和代码完全匹配)
- 按键 1(消息 1) → GPIO14
- 按键 2(消息 2) → GPIO27
- 按键 3(消息 3) → GPIO26
- 三个按键的另一脚全部短接,接开发板任意 GND
接线步骤(文字版)
- 取 3 个轻触按键,用杜邦线分别将一端连到 GPIO14、GPIO27、GPIO26
- 三个按键的另一端用一根杜邦线连在一起,再接到 ESP32 的 GND 引脚
- 供电:MicroUSB 线插开发板,另一端接 5V 电源 / 充电宝 / 电脑 USB
- (可选)OLED 屏:SDA→GPIO21,SCL→GPIO22,VCC→3.3V,GND→GND
二、Outlook 应用密码获取步骤(必须开启双重验证)
前提
步骤 1:登录微软账户安全中心
步骤 2:开启双重验证(未开的先做)
- 进入 “安全” → 找到 “高级安全选项”(找不到就点 “查看全部”)
- 找到 “双重验证” → 点击 “开启”
- 按提示绑定手机号或 Microsoft Authenticator,完成验证
- 开启成功后,刷新页面
步骤 3:生成应用密码(ESP32 发邮件专用)
- 回到 “高级安全选项” → 找到 “应用密码”(开启 2FA 后才出现)
- 点击 “创建新应用密码” → 名称随便填(如 ESP32-Mail)
- 系统生成一串无空格的 16 位密码(只显示一次!)
- 立即复制并保存到记事本,后面填到代码里

步骤 4:代码中填写(替换你的信息)
// 发件邮箱配置(Outlook)#define SMTP_SERVER "smtp.office365.com"#define SMTP_PORT 587#define SMTP_USER "你的outlook邮箱@outlook.com"#define SMTP_PASS "这里粘贴你生成的应用密码"
代码环节:
#include <WiFi.h>#include <SimpleMail.h>// ===================== 【1、预设3组WiFi】=====================const char* ssidList[] = { "WiFi_1_Name", "WiFi_2_Name", "WiFi_3_Name"};const char* pwdList[] = { "wifi1_pass", "wifi2_pass", "wifi3_pass"};#define WIFI_NUM 3// ===================== 【2、Outlook发件配置】=====================#define SMTP_HOST "smtp.office365.com"#define SMTP_PORT 587#define MAIL_FROM "你的Outlook邮箱@outlook.com"#define MAIL_PASS "你的微软应用密码"// ===================== 【3、3个收件邮箱】=====================String mailTo[3] = { "user1@qq.com", "user2@outlook.com", "user3@163.com"};// ===================== 【4、3条预设邮件内容】=====================String mailTitle[3] = { "设备通知 ①", "设备通知 ②", "设备通知 ③"};String mailBody[3] = { "这是第一条预设消息:\n设备正常运行。", "这是第二条预设消息:\n请注意检查现场状态。", "这是第三条预设消息:\n紧急提醒,请尽快处理。"};// ===================== 【5、按键引脚】=====================#define KEY1 14#define KEY2 27#define KEY3 26SimpleMail mail;// 自动遍历、扫描、连接可用预设WiFibool autoConnectWifi(){ if (WiFi.status() == WL_CONNECTED) return true; WiFi.disconnect(true); WiFi.mode(WIFI_STA); // 扫描周边WiFi int scanCnt = WiFi.scanNetworks(); for (int i = 0; i < scanCnt; i++) { String nowSSID = WiFi.SSID(i); for (int j = 0; j < WIFI_NUM; j++) { if (nowSSID == String(ssidList[j])) { WiFi.begin(ssidList[j], pwdList[j]); unsigned long t = millis(); while (millis() - t < 8000) { if (WiFi.status() == WL_CONNECTED) { Serial.print("已连接:"); Serial.println(ssidList[j]); return true; } delay(200); } } } } Serial.println("未扫描到预设WiFi"); return false;}// 发送邮件函数void sendMail(int idx){ if (!autoConnectWifi()) { Serial.println("联网失败,无法发送"); return; } mail.begin(SMTP_HOST, SMTP_PORT, MAIL_FROM, MAIL_PASS); mail.sendTo(mailTo[idx]); mail.setSubject(mailTitle[idx]); mail.setText(mailBody[idx]); if (mail.send()) { Serial.print("✅ 第"); Serial.print(idx+1); Serial.println(" 封邮件发送成功"); } else { Serial.println("❌ 发送失败:" + mail.errorReason()); } mail.end();}void setup(){ Serial.begin(115200); pinMode(KEY1, INPUT_PULLUP); pinMode(KEY2, INPUT_PULLUP); pinMode(KEY3, INPUT_PULLUP); // 上电自动连WiFi autoConnectWifi();}void loop(){ // 按键按下 = 对应编号邮件发送 if (digitalRead(KEY1) == LOW) { delay(80); if (digitalRead(KEY1) == LOW) { sendMail(0); while(digitalRead(KEY1)==LOW) delay(10); } } if (digitalRead(KEY2) == LOW) { delay(80); if (digitalRead(KEY2) == LOW) { sendMail(1); while(digitalRead(KEY2)==LOW) delay(10); } } if (digitalRead(KEY3) == LOW) { delay(80); if (digitalRead(KEY3) == LOW) { sendMail(2); while(digitalRead(KEY3)==LOW) delay(10); } } // 30秒重检一次网络 static unsigned long netCheckTimer = 0; if (millis() - netCheckTimer > 30000) { autoConnectWifi(); netCheckTimer = millis(); } delay(50);}
|
|
|
|
|
|
|
|
|