fix: SMTP 收件邮件的附件未保存(Web 邮箱看不到附件) #2

Merged
kevin merged 1 commits from dsh/mailgo:fix/smtp-received-attachments into main 2026-08-16 11:55:10 +08:00
Contributor

问题

通过 SMTP 收到的邮件(外部服务器发往本地用户,或 Outlook 客户端提交),附件只解析了元数据,从未落盘、也没有写 attachments 表

  • Web 邮箱打开邮件时看不到附件,无法下载
  • 附件不计入用户配额(used_bytes)

parseSMTPMessage 收集的 attachmentssaveMessage 里被直接丢弃。

修复

  • parsedSMTPMessage.attachments 改为携带原始字节的 parsedAttachment(解析时保留 MIME 解码后的内容)
  • saveMessage 创建邮件后:
    1. storage.Save 落盘附件文件
    2. attachments 记录(关联 message_id)
    3. UpdateUsedBytes 计入用户配额
  • INBOX 副本与 Sent 副本(认证提交)均生效

测试

  • 新增 internal/smtp_server/server_test.go
    • TestParseSMTPMessageExtractsAttachmentData:multipart/mixed + base64 附件解析出正确文件名与字节
    • TestSaveMessagePersistsAttachments:内存 SQLite + 临时目录,校验附件记录、磁盘文件内容、与解析结果一致
  • 生产环境实测:带 32 字节附件(application/octet-stream)的邮件经 :25 入站投递到本地用户后,附件文件落盘、记录写入、配额 +32、Web 界面正常显示并下载(/attachment/:id 返回正确内容)

备注

此前 PR #1(外发投递)未涉及此路径;该缺陷在 SMTP 入站路径长期存在,本次一并修复。

## 问题 通过 SMTP 收到的邮件(外部服务器发往本地用户,或 Outlook 客户端提交),附件只解析了元数据,**从未落盘、也没有写 attachments 表**: - Web 邮箱打开邮件时看不到附件,无法下载 - 附件不计入用户配额(used_bytes) `parseSMTPMessage` 收集的 `attachments` 在 `saveMessage` 里被直接丢弃。 ## 修复 - `parsedSMTPMessage.attachments` 改为携带原始字节的 `parsedAttachment`(解析时保留 MIME 解码后的内容) - `saveMessage` 创建邮件后: 1. `storage.Save` 落盘附件文件 2. 写 `attachments` 记录(关联 message_id) 3. `UpdateUsedBytes` 计入用户配额 - INBOX 副本与 Sent 副本(认证提交)均生效 ## 测试 - 新增 `internal/smtp_server/server_test.go`: - `TestParseSMTPMessageExtractsAttachmentData`:multipart/mixed + base64 附件解析出正确文件名与字节 - `TestSaveMessagePersistsAttachments`:内存 SQLite + 临时目录,校验附件记录、磁盘文件内容、与解析结果一致 - 生产环境实测:带 32 字节附件(application/octet-stream)的邮件经 :25 入站投递到本地用户后,附件文件落盘、记录写入、配额 +32、Web 界面正常显示并下载(`/attachment/:id` 返回正确内容) ## 备注 此前 PR #1(外发投递)未涉及此路径;该缺陷在 SMTP 入站路径长期存在,本次一并修复。
dsh added 1 commit 2026-08-16 11:54:19 +08:00
- parseSMTPMessage 之前只提取附件元数据、丢弃内容;现在保留原始字节
- saveMessage 创建邮件后落盘附件文件(storage.Save)、写 attachments 记录
  并计入用户配额 used_bytes,Web 邮箱可正常列表/下载
- 新增单元测试:附件字节提取 + 附件落盘/记录/配额校验
- 已在生产环境实测:带附件邮件经 :25 入站后,附件文件、记录、配额、
  Web 下载(/attachment/:id)全部正确
kevin merged commit c40113d3bf into main 2026-08-16 11:55:10 +08:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: kevin/mailgo#2