From 31d71138c908f350f0ba971c400ea008e568621f Mon Sep 17 00:00:00 2001 From: sysops Date: Thu, 6 Aug 2026 19:22:19 +0200 Subject: [PATCH] fix: MIME-Encoded-Word-Betreffs mit Windows-1252 werden nicht dekodiert MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit decodeMIMEHeader() nutzte mime.WordDecoder ohne CharsetReader. Go kennt dort nativ nur UTF-8/US-ASCII/ISO-8859-1, alles andere (z.B. Windows-1252) ließ DecodeHeader() scheitern, Betreff blieb roh ("=?Windows-1252?Q?...?="). CharsetReader ergänzt, nutzt dieselbe htmlindex-Logik wie decodeCharset() für den Body (vgl. PROJ-57). Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01WapWkrQusDuBMhaN8WyuXB --- pkg/mailparser/parser.go | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/pkg/mailparser/parser.go b/pkg/mailparser/parser.go index f40e84a..49fe6a1 100644 --- a/pkg/mailparser/parser.go +++ b/pkg/mailparser/parser.go @@ -324,9 +324,20 @@ func decodeBody(data []byte, cte string) []byte { return data } -// decodeMIMEHeader decodes RFC 2047 encoded-word headers. +// decodeMIMEHeader decodes RFC 2047 encoded-word headers. Go's mime package +// only knows UTF-8/US-ASCII/ISO-8859-1 natively; CharsetReader closes that +// gap for charsets like Windows-1252 using the same htmlindex lookup as +// decodeCharset for the body. func decodeMIMEHeader(s string) string { - dec := new(mime.WordDecoder) + dec := &mime.WordDecoder{ + CharsetReader: func(charset string, input io.Reader) (io.Reader, error) { + data, err := io.ReadAll(input) + if err != nil { + return nil, err + } + return bytes.NewReader(decodeCharset(data, charset)), nil + }, + } decoded, err := dec.DecodeHeader(s) if err != nil { return s