From cd71eca8f0f30d59b1a8cd83d491a8ad30a8fa1b Mon Sep 17 00:00:00 2001 From: Sherlock Yin Date: Sat, 28 Feb 2026 12:10:07 +0800 Subject: [PATCH 1/3] feat(ui): always show email button but disable until pipeline completes --- Sources/VoiceMemo/Views/ResultView.swift | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Sources/VoiceMemo/Views/ResultView.swift b/Sources/VoiceMemo/Views/ResultView.swift index cf86192..42f0808 100644 --- a/Sources/VoiceMemo/Views/ResultView.swift +++ b/Sources/VoiceMemo/Views/ResultView.swift @@ -46,7 +46,8 @@ struct ResultView: View { Spacer() - if settings.enableEmailNotification && task.status == .completed { + if settings.enableEmailNotification { + let isCompleted = task.status == .completed Button(action: { Task { await sendEmail() } }) { @@ -59,8 +60,8 @@ struct ResultView: View { Text(emailStatus ?? "Email") } } - .disabled(isSendingEmail) - .help("Send meeting summary via email") + .disabled(isSendingEmail || !isCompleted) + .help(isCompleted ? "Send meeting summary via email" : "Please wait for the pipeline to complete") } Button(action: exportMarkdown) { From b0417a6da74976ab5efdef2501ea87efb8aeb679 Mon Sep 17 00:00:00 2001 From: Sherlock Yin Date: Sat, 28 Feb 2026 12:18:44 +0800 Subject: [PATCH 2/3] fix(ui): clarify email button help text --- Sources/VoiceMemo/Views/ResultView.swift | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Sources/VoiceMemo/Views/ResultView.swift b/Sources/VoiceMemo/Views/ResultView.swift index 42f0808..1c0490b 100644 --- a/Sources/VoiceMemo/Views/ResultView.swift +++ b/Sources/VoiceMemo/Views/ResultView.swift @@ -61,7 +61,15 @@ struct ResultView: View { } } .disabled(isSendingEmail || !isCompleted) - .help(isCompleted ? "Send meeting summary via email" : "Please wait for the pipeline to complete") + .help({ + if isCompleted { + return "Send meeting summary via email" + } + if task.status == .failed { + return "Pipeline failed — email can only be sent after completion" + } + return "Please wait for the pipeline to complete" + }()) } Button(action: exportMarkdown) { From d27f82ed4696b355a4db87272497fd5495b64e50 Mon Sep 17 00:00:00 2001 From: Sherlock Yin Date: Sat, 28 Feb 2026 17:02:26 +0800 Subject: [PATCH 3/3] docs(email): update documentation and changelog for email notification feature - Add Email Notification to feature list and roadmap in README - Update CHANGELOG with Email Notification feature - Add Email documentation to index in doc/README - Ensure consistency between English and Chinese versions~ --- CHANGELOG.md | 1 + README.md | 16 +++++++++++++--- README_CN.md | 16 +++++++++++++--- doc/README.md | 1 + doc/README.zh-CN.md | 1 + 5 files changed, 29 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d3195cf..33f857e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Settings UI for configuring Volcengine App ID, Resource ID, and Access Token. - **Theme Mode**: Support for System (Auto) / Light / Dark appearance in Settings. - **Security and Audit Documentation**: Added comprehensive security and audit notes (doc/09-security-and-audit.md). +- **Email Notifications**: Added email notification feature to send meeting summaries via configured FastMail gateway. Includes Settings UI for Gateway URL, API Token, and Recipient configuration. ### Changed - **Task Info UI**: Redesigned the Task Info section in Result View with a grid layout, status indicators, and copy functionality for Task Key. diff --git a/README.md b/README.md index 61b786b..08b54cf 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ Read this in Chinese: [README_CN.md](README_CN.md) - **Privacy-First**: Operates locally on your machine with clear permission handling. - **Meeting Minutes (Multi-Provider ASR)**: Support for **Alibaba Cloud Tingwu** and **Volcengine** (ByteDance) to transcribe audio and generate structured minutes (summary, key points, action items), with Markdown export. - **Storage Backends (SQLite/MySQL)**: Store history locally or in MySQL, with optional local-to-MySQL sync. +- **Email Notifications**: Send meeting summaries directly to your email via a configured gateway. ## Changelog @@ -108,7 +109,15 @@ Open Settings in the app and configure: - **Alibaba Tingwu**: AppKey - **Volcengine**: AppId, AccessToken, ResourceId (supports auto format inference) -### 4. Audio Outputs +### 4. Configure Email (optional) + +In **Settings > Email**, you can enable email notifications to receive meeting summaries: + +- **Gateway URL**: The endpoint of your email sending service (e.g., FastMail gateway). +- **API Token**: The authentication token for the gateway. +- **Recipient**: The email address to receive the summaries. + +### 5. Audio Outputs Recorded audio files are saved to: @@ -125,13 +134,13 @@ Imported audio files are copied into the app sandbox: - `~/Library/Application Support/VoiceMemo/recordings/` (filename: `.`) -### 5. Generate minutes +### 6. Generate minutes After a recording completes, the latest task appears in the pipeline UI. Trigger the steps manually: - Transcode → Upload → Create Task → Refresh Status - View Result → Export Markdown -### 6. Import audio (optional) +### 7. Import audio (optional) Use the sidebar action **Import Audio** to create a meeting task from an existing audio file, then run the same pipeline steps as above. @@ -161,6 +170,7 @@ Ensure you configure **Signing & Capabilities** with your Development Team to ru - [x] Manual pipeline UI (transcode/upload/create/poll) - [x] MySQL storage backend with local-to-remote sync - [x] Unified error handling for ASR services +- [x] Email notifications for meeting summaries ### Planned - [ ] Speaker diarization (cloud-based) diff --git a/README_CN.md b/README_CN.md index ea0ef27..702ccde 100644 --- a/README_CN.md +++ b/README_CN.md @@ -18,6 +18,7 @@ English version: [README.md](README.md) - **隐私优先**:所有处理均在本地完成,具有清晰的权限管理机制。 - **会议纪要(多供应商 ASR)**:支持 **阿里云听悟** 和 **火山引擎** (字节跳动) 进行音频转写和结构化纪要生成(摘要 / 要点 / 待办),并支持导出 Markdown。 - **存储(SQLite/MySQL)**:历史记录可保存到本地或 MySQL,并支持本地同步到 MySQL。 +- **邮件通知**:支持通过配置网关将会议纪要直接发送到指定邮箱。 ## 更新日志 @@ -108,7 +109,15 @@ open VoiceMemo.app - **阿里云听悟**:AppKey(需配合 AK/SK) - **火山引擎**:AppId、AccessToken、Cluster ID(V3 BigModel 接口,支持说话人自动分离) -### 4. 音频输出 +### 4. 配置邮件通知(可选) + +在 **设置 > Email** 中,您可以开启邮件通知功能,以便接收会议纪要: + +- **网关地址 (Gateway URL)**:邮件发送服务的接口地址(如 FastMail 网关)。 +- **API Token**:网关的认证令牌。 +- **接收人 (Recipient)**:接收纪要的电子邮箱地址。 + +### 5. 音频输出 录制输出将保存至: @@ -124,13 +133,13 @@ open VoiceMemo.app - `~/Library/Application Support/VoiceMemo/recordings/`(文件名:`.`) -### 5. 生成会议纪要 +### 6. 生成会议纪要 录音完成后,界面会出现最新任务的流水线节点,按顺序手动触发: - 转码 → 上传 → 创建任务 → 刷新状态 - 查看结果 → 导出 Markdown -### 6. 导入音频(可选) +### 7. 导入音频(可选) 使用左侧栏的 **Import Audio** 从已有音频文件创建任务,然后按上述相同步骤运行流水线。 @@ -160,6 +169,7 @@ xed VoiceMemo.xcodeproj - [x] 手动触发流水线 UI(转码/上传/创建/轮询) - [x] MySQL 存储后端,支持本地同步到远程 - [x] ASR 服务统一错误处理 +- [x] 邮件通知功能(支持发送会议纪要) ### 计划中 - [ ] 实时转写 UI 界面 diff --git a/doc/README.md b/doc/README.md index e447a9d..33ffa0a 100644 --- a/doc/README.md +++ b/doc/README.md @@ -23,3 +23,4 @@ See [01-architecture-overview.md](01-architecture-overview.md) for detailed arch - 06-testing.md - 08-import-guide.md - 09-security-and-audit.md +- 10-email-notification.md diff --git a/doc/README.zh-CN.md b/doc/README.zh-CN.md index 4d7f8b9..627ade7 100644 --- a/doc/README.zh-CN.md +++ b/doc/README.zh-CN.md @@ -23,3 +23,4 @@ VoiceMemo 采用**多提供商 ASR 架构**,通过 `TranscriptionService` 协 - 06-testing.zh-CN.md - 08-import-guide.zh-CN.md - 09-security-and-audit.zh-CN.md +- 10-email-notification.zh-CN.md