feat: email forwarding via SMTPS
Parallel to Bark: when email forwarding is enabled and a recipient is set, notifications are also sent via SMTP over SSL (port 465, SMTPS). Works standalone — no Bark server required. - core/EmailSender: SMTP over SSL (implicit TLS, port 465), AUTH LOGIN, UTF-8 subject/body via Base64/MIME; trySend() fire-and-forget helper - SettingsStore: 7 email settings (enabled, host, port, user, password, from, to) - NotifyListenerService + PhoneCallMonitor: call EmailSender.trySend in parallel with Bark forwarding; fires even if no Bark servers configured - UI: new "电邮转发" SectionCard in settings (toggle + host/port/user/ password/from/to fields + save button) - version 1.6.0 -> 1.6.1 (code 10 -> 11); CLAUDE.md synced Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -63,6 +63,7 @@ NotifyListenerService (系统通知入口)
|
||||
旁路(不经通知监听器):
|
||||
PhoneCallMonitor 轮询 getCallState() → 来电/未接构造 Decision 推送(绕过 MIUI 限制)
|
||||
UpdateChecker 查 Gitea Releases → 新版本横幅 → 应用内下载 + 系统安装器
|
||||
EmailSender 并联电邮转发(SMTP,fire-and-forget)
|
||||
```
|
||||
|
||||
### 包结构 `com.a2i.forwarder`
|
||||
@@ -77,6 +78,7 @@ NotifyListenerService (系统通知入口)
|
||||
| `core/AppParsers.kt` | 微信/QQ/Telegram 的 `clickUrl` 映射 + 重要消息关键词(@我、验证码、通话等)。 |
|
||||
| `core/BarkClient.kt` | OkHttp POST 到 `${server}/push`,超时 10/10/15s;body 用 `msg.copy(deviceKey=server.deviceKey)`;对 connection closed / 超时 / TLS 中断等瞬时 IOException 自动重试 3 次(退避 600/1200ms),HTTP 4xx/5xx 不重试。 |
|
||||
| `core/BarkSender.kt` | 多服务器容错推送:按列表顺序依次 `BarkClient.push`,首个成功即止(`pushToFirst`);NotifyListenerService / PhoneCallMonitor / RetryWorker 共用。 |
|
||||
| `core/EmailSender.kt` | SMTP 直连发送纯文本邮件(`send`)支持 465 SSL / 587 STARTTLS + AUTH LOGIN;`trySend` 便捷方法读取 SettingsStore 异步发(fire-and-forget)。 |
|
||||
| `core/RetryWorker.kt` | WorkManager 周期任务,每 15 分钟重发 `pending` 队列中的失败消息。 |
|
||||
| `core/LogStore.kt` | 最近 300 条日志 + 失败重发队列(≤100)。DataStore 持久化。 |
|
||||
| `core/IconExporter.kt` | 一键导出所有已安装 App 图标到用户选择的 SAF 目录(用于部署到 iOS Bark 图床)。 |
|
||||
@@ -86,7 +88,7 @@ NotifyListenerService (系统通知入口)
|
||||
| `core/CarrierBalanceQuery.kt` | 向运营商服务号发查询短信、解析回执余量、余额≤5 自动挂起。 |
|
||||
| `core/SmsFallbackForwarder.kt` | 断网时把紧要通知(验证码/来电)用短信发到 iPhone,5 分钟限频 + 余额检查。 |
|
||||
| `core/UpdateChecker.kt` | 查 Gitea Releases 最新版(`git.sunlunfan.com`,国内可达,24h 节流)→ 语义比较 → 下载 APK → FileProvider 调起系统安装器。 |
|
||||
| `store/SettingsStore.kt` | Bark 服务器列表(有序,`BarkServer.enabled` 勾选参与转发)、全局开关、广告关键词、图标前缀等。`MutableStateFlow` + DataStore。`moveServer` 调序、`setServerEnabled` 启停;转发按序依次试(见 `BarkSender`)。图标前缀默认 github raw,国内不稳时可手填自建 Gitea。 |
|
||||
| `store/SettingsStore.kt` | Bark 服务器列表(有序,`BarkServer.enabled` 勾选参与转发)、全局开关、广告关键词、图标前缀、电邮转发 SMTP 设置等。`MutableStateFlow` + DataStore。`moveServer` 调序、`setServerEnabled` 启停;转发按序依次试(见 `BarkSender`)。图标前缀默认 github raw,国内不稳时可手填自建 Gitea。 |
|
||||
| `store/AppRulesStore.kt` | 黑/白名单模式 + 默认黑名单(系统 App + 输入法 + 三星剪贴板/键盘 + GMS + 录音机/相册/查找/密码管理 + 通话管理/AI通话);默认黑名单带版本号 `bl_version`,升级时把新增噪音包合并进老用户黑名单(只增不删)。 |
|
||||
| `ui/nav/AppNav.kt` | 4 个底部 Tab + 日志页。 |
|
||||
| `ui/theme/*` | 固定品牌配色(`Color.kt`)、自定义 `Typography`(`Type.kt`),`A2iTheme` 关闭动态取色、统一深浅色方案(`Theme.kt`)。 |
|
||||
@@ -112,7 +114,7 @@ NotifyListenerService (系统通知入口)
|
||||
|
||||
## 版本与发布
|
||||
|
||||
- 当前版本:`versionCode = 10`、`versionName = "1.6.0"`(位于 `app/build.gradle.kts`)。**每次改动后同步递增 versionCode/versionName,并同步更新本节。**
|
||||
- 当前版本:`versionCode = 11`、`versionName = "1.6.1"`(位于 `app/build.gradle.kts`)。**每次改动后同步递增 versionCode/versionName,并同步更新本节。**
|
||||
- 远端仓库:`https://github.com/lsxf/a2i.git`,默认分支 `main`。
|
||||
- 提交策略:`.gitignore` 已排除 `app/build`、`.gradle`、`.kotlin`、`local.properties`、`.claude/`、`do.ps1`、`gh-token.txt`(发版用 token)、`*.token`、截图与临时文件,**不要**提交它们。
|
||||
- 发版流程(github + gitea 双发;UpdateChecker 查 Gitea 源,故 Gitea 必发):
|
||||
|
||||
Reference in New Issue
Block a user