dsh/mailgo:fix/smtp-received-attachments
main
通过 SMTP 收到的邮件(外部服务器发往本地用户,或 Outlook 客户端提交),附件只解析了元数据,从未落盘、也没有写 attachments 表:
parseSMTPMessage 收集的 attachments 在 saveMessage 里被直接丢弃。
parseSMTPMessage
attachments
saveMessage
parsedSMTPMessage.attachments
parsedAttachment
storage.Save
UpdateUsedBytes
internal/smtp_server/server_test.go
TestParseSMTPMessageExtractsAttachmentData
TestSaveMessagePersistsAttachments
/attachment/:id
此前 PR #1(外发投递)未涉及此路径;该缺陷在 SMTP 入站路径长期存在,本次一并修复。
- parseSMTPMessage 之前只提取附件元数据、丢弃内容;现在保留原始字节 - saveMessage 创建邮件后落盘附件文件(storage.Save)、写 attachments 记录 并计入用户配额 used_bytes,Web 邮箱可正常列表/下载 - 新增单元测试:附件字节提取 + 附件落盘/记录/配额校验 - 已在生产环境实测:带附件邮件经 :25 入站后,附件文件、记录、配额、 Web 下载(/attachment/:id)全部正确
No dependencies set.
The note is not visible to the blocked user.
问题
通过 SMTP 收到的邮件(外部服务器发往本地用户,或 Outlook 客户端提交),附件只解析了元数据,从未落盘、也没有写 attachments 表:
parseSMTPMessage收集的attachments在saveMessage里被直接丢弃。修复
parsedSMTPMessage.attachments改为携带原始字节的parsedAttachment(解析时保留 MIME 解码后的内容)saveMessage创建邮件后:storage.Save落盘附件文件attachments记录(关联 message_id)UpdateUsedBytes计入用户配额测试
internal/smtp_server/server_test.go:TestParseSMTPMessageExtractsAttachmentData:multipart/mixed + base64 附件解析出正确文件名与字节TestSaveMessagePersistsAttachments:内存 SQLite + 临时目录,校验附件记录、磁盘文件内容、与解析结果一致/attachment/:id返回正确内容)备注
此前 PR #1(外发投递)未涉及此路径;该缺陷在 SMTP 入站路径长期存在,本次一并修复。