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}}