From c7f466c99be826ac8013ddd9a92c09b211f93320 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=96=87=E5=B3=B0?= Date: Tue, 2 Jun 2026 20:46:59 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BD=91=E9=A1=B5=E7=AB=AF?= =?UTF-8?q?=E7=BC=96=E7=A0=81=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/mailutil/codec.go | 24 +++++++++++++++++++-- internal/web/server.go | 4 ++++ internal/web/templates/admin/mail_view.html | 2 +- internal/web/templates/admin/mails.html | 2 +- internal/web/templates/inbox.html | 2 +- internal/web/templates/view.html | 4 ++-- 6 files changed, 31 insertions(+), 7 deletions(-) diff --git a/internal/mailutil/codec.go b/internal/mailutil/codec.go index d590148..b29cd6f 100644 --- a/internal/mailutil/codec.go +++ b/internal/mailutil/codec.go @@ -4,6 +4,8 @@ package mailutil import ( "fmt" + "io" + "mime" "strings" "unicode/utf8" @@ -40,13 +42,31 @@ func DecodeCharset(buf []byte, charset string) string { return string(decoded) } +// DecodeRFC2047 解码邮件头中的 RFC 2047 encoded-word。 +func DecodeRFC2047(value string) string { + decoder := mime.WordDecoder{ + CharsetReader: func(charset string, input io.Reader) (io.Reader, error) { + data, err := io.ReadAll(input) + if err != nil { + return nil, err + } + return strings.NewReader(DecodeCharset(data, charset)), nil + }, + } + decoded, err := decoder.DecodeHeader(value) + if err != nil { + return value + } + return decoded +} + // FormatAddressList 解析 RFC 2047 编码的地址列表头并格式化为可读字符串。 // 例如: "=?gb2312?B?zuIgzsS35Q==?= " → "吴文锋 " func FormatAddressList(header *asgomail.Header, key string) string { addrs, err := header.AddressList(key) if err != nil || len(addrs) == 0 { - // 降级:返回原始值 - return header.Get(key) + // 降级:返回解码后的原始值 + return DecodeRFC2047(header.Get(key)) } var parts []string diff --git a/internal/web/server.go b/internal/web/server.go index 37f98c3..d5f19bf 100644 --- a/internal/web/server.go +++ b/internal/web/server.go @@ -10,6 +10,7 @@ import ( "strings" "mail_go/config" + "mail_go/internal/mailutil" "mail_go/internal/storage" "mail_go/internal/store" "mail_go/internal/web/handlers" @@ -73,6 +74,9 @@ func templateFuncs() template.FuncMap { "formatBytes": func(b int64) string { return formatBytes(b) }, + "decodeHeader": func(s string) string { + return mailutil.DecodeRFC2047(s) + }, } } diff --git a/internal/web/templates/admin/mail_view.html b/internal/web/templates/admin/mail_view.html index f8d8314..c0faab3 100644 --- a/internal/web/templates/admin/mail_view.html +++ b/internal/web/templates/admin/mail_view.html @@ -35,7 +35,7 @@

{{if .message.Subject}}{{.message.Subject}}{{else}}(无主题){{end}}

-

发件人: {{.message.FromAddr}}

+

发件人: {{decodeHeader .message.FromAddr}}

收件人: {{.message.ToAddr}}

{{if .message.CcAddr}}

抄送: {{.message.CcAddr}}

{{end}}

所属用户: {{if .message.User.ID}}{{.message.User.Username}}{{else}}—{{end}}

diff --git a/internal/web/templates/admin/mails.html b/internal/web/templates/admin/mails.html index 8dedfa1..9d360ae 100644 --- a/internal/web/templates/admin/mails.html +++ b/internal/web/templates/admin/mails.html @@ -46,7 +46,7 @@ {{range .messages}} - {{.FromAddr}} + {{decodeHeader .FromAddr}} {{.ToAddr}} {{.Subject}} {{if .User.ID}}{{.User.Username}}{{else}}—{{end}} diff --git a/internal/web/templates/inbox.html b/internal/web/templates/inbox.html index f337acb..0d83ef0 100644 --- a/internal/web/templates/inbox.html +++ b/internal/web/templates/inbox.html @@ -36,7 +36,7 @@ {{range .messages}} - {{.FromAddr}} + {{decodeHeader .FromAddr}} {{if .Subject}}{{.Subject}}{{else}}(无主题){{end}} diff --git a/internal/web/templates/view.html b/internal/web/templates/view.html index 3d3d803..a46ab9c 100644 --- a/internal/web/templates/view.html +++ b/internal/web/templates/view.html @@ -34,7 +34,7 @@

{{if .message.Subject}}{{.message.Subject}}{{else}}(无主题){{end}}