feat(mail): 支持发件人名称展示与存储

- 为邮件消息新增 `fromName` 字段,并同步扩展数据库迁移、API 类型与前后端查询/入库逻辑。
- 解析入站邮件时提取并保存发件人名称,发信时将邮箱显示名写入 MIME `From` 头。
- 邮件列表、详情、通知与引用内容改为优先展示发件人名称,提升可读性。
This commit is contained in:
LanQin
2026-06-16 23:29:23 +08:00
parent 045132146b
commit 5821d9aa30
10 changed files with 135 additions and 37 deletions
+8 -6
View File
@@ -354,7 +354,7 @@ func (a *App) parseMaildirMessage(raw []byte, fallbackTo string) (storedMessage,
if strings.TrimSpace(subject) == "" {
subject = "(no subject)"
}
from := firstAddress(m.Header.Get("From"))
from, fromName := firstAddressParts(m.Header.Get("From"))
to := addressList(m.Header.Get("To"))
cc := addressList(m.Header.Get("Cc"))
if len(to) == 0 {
@@ -382,6 +382,7 @@ func (a *App) parseMaildirMessage(raw []byte, fallbackTo string) (storedMessage,
MessageID: strings.TrimSpace(m.Header.Get("Message-Id")),
Subject: subject,
From: from,
FromName: fromName,
To: to,
CC: cc,
SentAt: sentAt,
@@ -480,12 +481,13 @@ func partFilename(header textproto.MIMEHeader) string {
return ""
}
func firstAddress(value string) string {
items := addressList(value)
if len(items) == 0 {
return strings.TrimSpace(value)
func firstAddressParts(value string) (string, string) {
items, err := netmail.ParseAddressList(value)
if err != nil || len(items) == 0 {
return strings.TrimSpace(value), ""
}
return items[0]
item := items[0]
return normalizeEmail(item.Address), strings.TrimSpace(item.Name)
}
func addressList(value string) []string {