package mailx_test import ( "bytes" "errors" "fmt" "io" "mime" "net/mail" "net/textproto" "regexp" "strings" "testing" "unicode/utf8" "pkg.jfrech.com/brief/mailx" "pkg.jfrech.com/brief/text" ) // Q-encoded utf8.RuneError: // utf8.RuneError=='\uFFFD' // ==0b1111_1111_1111_1101 // ==0b1111_111111111101 // vvvv|||||||||||| // 0b1110_1111vvvvvv|||||| == 0b1110_1111 == 0xEF // 0b10_111111vvvvvv == 0b1011_1111 == 0xBF // 0b10_111101 == 0b1011_1101 == 0xBD const QEncodedRuneError = "=EF=BF=BD" func TestcasesDenormal() map[mailx.Field][]byte { return map[mailx.Field][]byte{ // improper fieldbody mailx.Field{"A", string([]byte{0b110_00000, 0b10_000000})}: []byte("A: =?UTF-8?Q?" + QEncodedRuneError + QEncodedRuneError + "?=\r\n"), // improper fieldname mailx.Field{" ", " "}: []byte("-: =?UTF-8?Q?_?=\r\n"), mailx.Field{"", "A"}: []byte("-: A\r\n"), mailx.Field{":", ":"}: []byte("-: :\r\n"), mailx.Field{":", "\r\n"}: []byte("-: =?UTF-8?Q?=0D=0A?=\r\n"), mailx.Field{":", "\n\r"}: []byte("-: =?UTF-8?Q?=0A=0D?=\r\n"), mailx.Field{"\r\n", "\r\n"}: []byte("--: =?UTF-8?Q?=0D=0A?=\r\n"), } } func TestFieldEncode(t *testing.T) { note := func(text []byte) { if !bytes.Contains(text, []byte(":")) { t.Errorf("note: %q does not contain a colon", text) } if !bytes.HasSuffix(text, []byte(mailx.CRLF)) { t.Errorf("note: %q does not contain end in CRLF", text) } } for _, testcases := range []map[mailx.Field][]byte{TestcasesRoundtrip(), TestcasesDenormal()} { for test, expect := range testcases { note(expect) folded := test.Encode() if !bytes.Equal(expect, folded) { t.Errorf("%#v.Encode() == %q != %q", test, folded, expect) } } } } func FuzzFieldEncode(f *testing.F) { for field := range TestcasesRoundtrip() { f.Add(field.Name, field.Body) } f.Fuzz(func(t *testing.T, fn, fb string) { if !regexp.MustCompile(`^[!-~]+$`).MatchString(fn) || strings.Contains(fn, ":") || !utf8.ValidString(fb) { t.Skip() } field := mailx.Field{fn, fb} assertemailaddresses := func(name string, field mailx.Field, encoded []byte) { emailaddresses := func(text string) (addrs []string) { //smatchss := regexp.MustCompile(`(?:^|[\t ])(?:[!-~]*)?(<[!-~]+@[!-~]+>)(?:[!-~]*)?(?:[\t ]|$)`).FindAllStringSubmatch(text, -1) smatchss := regexp.MustCompile(`(?:^|[\t ])((?:[!-~]*?)(<[!-~]*?@[!-~]*?>)(?:[!-~]*?))(?:$|[\t ])`).FindAllStringSubmatch(text, -1) for _, smatchs := range smatchss { if len(smatchs) != 1+2 { panic("unreachable") } addrWithContext, addr := smatchs[1], smatchs[2] if len(" ") + len(addrWithContext) + len(mailx.CRLF) > 1000 { continue } else if max(1, len(field.Name)) + len(": ") + len(addrWithContext) + len(mailx.CRLF) > 1000 { continue } // see field.Encode's isPlainAscii and qesc functions if strings.Contains(addrWithContext, "=?") || strings.Contains(addrWithContext, "?=") { continue } addrs = append(addrs, addr) } return } if fb := field.Body; len(fb) > 0 && (text.IsHTSP(fb[0]) || text.IsHTSP(fb[len(fb)-1])) { return } else if strings.Contains(strings.ReplaceAll(fb, "\t", " "), " ") { return } for _, addr := range emailaddresses(field.Body) { if !bytes.Contains(encoded, []byte(addr)) { t.Errorf("%s: %#v encoded as %q: e-mail address not found as subslice: %q", name, field, encoded, addr) } } } test := func(name string, decode func([]byte) (mailx.Field, error), equal func(mailx.Field, mailx.Field) bool, encoded []byte) { decoded, err := decode(encoded) if err != nil { t.Errorf("%s: %#v encoded as %q: no parse: %v", name, field, encoded, err) } else if !equal(field, decoded) { t.Errorf("%s: %#v encoded as %q: no roundtrip: became %#v", name, field, encoded, decoded) } assertemailaddresses(name, decoded, encoded) } if textproto.CanonicalMIMEHeaderKey(fn) == fn { equalModuloTabs := func(f, g mailx.Field) bool { return f.Name == g.Name && strings.ReplaceAll(f.Body, "\t", " ") == strings.ReplaceAll(g.Body, "\t", " ") } test("decodeNetMail(field.Encode())", decodeNetMail, equalModuloTabs, field.Encode()) } test("decodeXmail(field.Encode())", decodeXmail, mailx.Field.Equal, field.Encode()) func() { encoded := []byte(strings.ReplaceAll(string(field.Encode()), mailx.CRLF, "") + mailx.CRLF) text := encoded k := bytes.IndexByte(text, ':') if k == -1 || k <= 0 { t.Errorf("squash(%#v.Encode())==%q: invalid field name", field, encoded) } text = text[k+1:] if !bytes.HasSuffix(text, []byte(mailx.CRLF)) { t.Errorf("squash(%#v.Encode())==%q: no trailing CRLF", field, encoded) } text = bytes.TrimSuffix(text, []byte(mailx.CRLF)) if len(text) == 0 { return } if text[0] != '\t' && text[0] != ' ' { t.Errorf("squash(%#v.Encode())==%q: no trailing whitespace after colon", field, encoded) } text = text[1:] for _, c := range text { if c == '\t' || c == ' ' { continue } if c <= ' ' || c > '~' { t.Errorf("squash(%#v.Encode())==%q: non-ASCII character: %q", field, encoded, c) } } if len(text) > 0 && ((text[0] == '\t' || text[0] == ' ') || (text[len(text)-1] == '\t' || text[len(text)-1] == ' ')) { t.Errorf("squash(%#v.Encode())==%q: surrounding whitespace", field, encoded) } for j := 1; j < len(text); j++ { if (text[j-1] == '\t' || text[j-1] == ' ') && (text[j] == '\t' || text[j] == ' ') { t.Errorf("squash(%#v.Encode())==%q: doubled whitespace", field, encoded) } } for j := 2; j < len(text); j++ { if text[j-2] == '?' && text[j-1] == '=' && !(text[j] == '\t' || text[j] == ' ') && !bytes.HasSuffix(text[:j-1], []byte("=?UTF-8?Q?")) { t.Errorf("squash(%#v.Encode())==%q: \"?=\" followed by non-whitespace", field, encoded) } if !(text[j-2] == '\t' || text[j-2] == ' ') && text[j-1] == '=' && text[j] == '?' { t.Errorf("squash(%#v.Encode())==%q: non-whitespace followed by \"=?\"", field, encoded) } } }() }) } func decodeXmail(text []byte) (mailx.Field, error) { s := mailx.NewSplitter(bytes.NewReader(append(text, []byte(mailx.CRLF)...))) field, err := s.NextField() if err != nil { return mailx.Field{}, err } _, err = s.NextField() if !errors.Is(err, io.EOF) { return mailx.Field{}, fmt.Errorf("no header EOF: %w", err) } slurp, err := io.ReadAll(s) if err != nil { return mailx.Field{}, fmt.Errorf("body left: %w", err) } else if len(slurp) > 0 { return mailx.Field{}, fmt.Errorf("body left: %q", slurp) } return field, nil } func decodeNetMail(text []byte) (mailx.Field, error) { m, err := mail.ReadMessage(bytes.NewReader(append(text, []byte(mailx.CRLF)...))) if err != nil { return mailx.Field{}, err } slurp, err := io.ReadAll(m.Body) if err != nil { return mailx.Field{}, fmt.Errorf("body left: %w", err) } else if len(slurp) > 0 { return mailx.Field{}, fmt.Errorf("body left: %q", slurp) } dec := new(mime.WordDecoder) if len(m.Header) != 1 { return mailx.Field{}, fmt.Errorf("too many headers") } for k, vs := range m.Header { if len(vs) != 1 { return mailx.Field{}, fmt.Errorf("too many values") } for _, v := range vs { w, err := dec.DecodeHeader(v) if err != nil { return mailx.Field{}, err } return mailx.Field{k, w}, nil } } return mailx.Field{}, fmt.Errorf("no header") } func TestcasesRoundtrip() map[mailx.Field][]byte { return map[mailx.Field][]byte{ mailx.Field{"Subject", "Überzogene Zeile im Betreff wirklich, wirklich außerordentlich langer Länge)"}: []byte("Subject: =?UTF-8?Q?=C3=9Cberzogene?= Zeile im Betreff wirklich, wirklich\r\n =?UTF-8?Q?au=C3=9Ferordentlich?= langer =?UTF-8?Q?L=C3=A4nge)?=\r\n"), mailx.Field{"X-Imaptar-Body-Checksum", "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0b.sha-512sum"}: []byte("X-Imaptar-Body-Checksum: =?UTF-8?Q?00000000000000000000000000000000000000000?=\r\n =?UTF-8?Q?00000000000000000000000000000000000000000000000000000000000000000?=\r\n =?UTF-8?Q?0000000000000000000000.0b.sha-512sum?=\r\n"), // mailx.Field{"F", "012345678901234567890123456789012345678901234567890123456789012345678901234"}: []byte("F: 012345678901234567890123456789012345678901234567890123456789012345678901234\r\n"), mailx.Field{"F", "012345678901234567890123456789012345678901234567890123456789012345678901234*"}: []byte("F: =?UTF-8?Q?012345678901234567890123456789012345678901234567890123456789012?=\r\n =?UTF-8?Q?345678901234*?=\r\n"), mailx.Field{"F", "012345678901234567890123456789012345678901234567890123456789012345678901234**"}: []byte("F: =?UTF-8?Q?012345678901234567890123456789012345678901234567890123456789012?=\r\n =?UTF-8?Q?345678901234**?=\r\n"), mailx.Field{"F", "012345678901234567890123456789012345678901234567890123456789012345678901234***"}: []byte("F: =?UTF-8?Q?012345678901234567890123456789012345678901234567890123456789012?=\r\n =?UTF-8?Q?345678901234***?=\r\n"), mailx.Field{"F", "012345678901234567890123456789012345678901234567890123456789012345678901234***0123456789"}: []byte("F: =?UTF-8?Q?012345678901234567890123456789012345678901234567890123456789012?=\r\n =?UTF-8?Q?345678901234***0123456789?=\r\n"), mailx.Field{"F", "012345678901234567890123456789012345678901234567890123456789012345678901234***01234567890123456789"}: []byte("F: =?UTF-8?Q?012345678901234567890123456789012345678901234567890123456789012?=\r\n =?UTF-8?Q?345678901234***01234567890123456789?=\r\n"), mailx.Field{"F", "012345678901234567890123456789012345678901234567890123456789012345678901234***0123456789012345678901234567890123456789"}: []byte("F: =?UTF-8?Q?012345678901234567890123456789012345678901234567890123456789012?=\r\n =?UTF-8?Q?345678901234***0123456789012345678901234567890123456789?=\r\n"), mailx.Field{"F", "012345678901234567890123456789012345678901234567890123456789012345678901234***0123456789012345678901234567890123456789ABCDEFG"}: []byte("F: =?UTF-8?Q?012345678901234567890123456789012345678901234567890123456789012?=\r\n =?UTF-8?Q?345678901234***0123456789012345678901234567890123456789ABCDEFG?=\r\n"), mailx.Field{"F", "012345678901234567890123456789012345678901234567890123456789012345678901234***0123456789012345678901234567890123456789ABCDEFG+"}: []byte("F: =?UTF-8?Q?012345678901234567890123456789012345678901234567890123456789012?=\r\n =?UTF-8?Q?345678901234***0123456789012345678901234567890123456789ABCDEFG+?=\r\n"), mailx.Field{"F", "012345678901234567890123456789012345678901234567890123456789012345678901234***0123456789012345678901234567890123456789ABCDEFG++"}: []byte("F: =?UTF-8?Q?012345678901234567890123456789012345678901234567890123456789012?=\r\n =?UTF-8?Q?345678901234***0123456789012345678901234567890123456789ABCDEFG++?=\r\n"), mailx.Field{"F", "012345678901234567890123456789012345678901234567890123456789012345678901234***0123456789012345678901234567890123456789ABCDEFG+++"}: []byte("F: =?UTF-8?Q?012345678901234567890123456789012345678901234567890123456789012?=\r\n =?UTF-8?Q?345678901234***0123456789012345678901234567890123456789ABCDEFG+++?=\r\n"), mailx.Field{"F", "012345678901234567890123456789012345678901234567890123456789012345678901234***0123456789012345678901234567890123456789ABCDEFG++++"}: []byte("F: =?UTF-8?Q?012345678901234567890123456789012345678901234567890123456789012?=\r\n =?UTF-8?Q?345678901234***0123456789012345678901234567890123456789ABCDEFG+++?=\r\n =?UTF-8?Q?+?=\r\n"), mailx.Field{"F", "012345678901234567890123456789012345678901234567890123456789012345678901234***0123456789012345678901234567890123456789ABCDEFG+++++"}: []byte("F: =?UTF-8?Q?012345678901234567890123456789012345678901234567890123456789012?=\r\n =?UTF-8?Q?345678901234***0123456789012345678901234567890123456789ABCDEFG+++?=\r\n =?UTF-8?Q?++?=\r\n"), mailx.Field{"0", " 0 0000000000000000000000000000000000000000000000000000000000000000000000000000"}: []byte("0: =?UTF-8?Q?_0_000000000000000000000000000000000000000000000000000000000000?=\r\n =?UTF-8?Q?0000000000000000?=\r\n"), mailx.Field{"Subject", "1L: Encode doch \"Ä\" nicht als =?iso-8859-1?q?=C4?= sondern als =?utf-8?q?=C3=84?=. Oder würde das zu viel Aufwand bedeuten?"}: []byte("Subject: 1L: Encode doch =?UTF-8?Q?\"=C3=84\"?= nicht als =?UTF-8?Q?=3D=3Fiso-?=\r\n =?UTF-8?Q?8859-1=3Fq=3F=3DC4=3F=3D?= sondern als =?UTF-8?Q?=3D=3Futf-8=3Fq?=\r\n =?UTF-8?Q?=3F=3DC3=3D84=3F=3D.?= Oder =?UTF-8?Q?w=C3=BCrde?= das zu viel\r\n Aufwand bedeuten?\r\n"), mailx.Field{"0", "00000000000000000000000000000000000000000000000000000000000000000000000000 "}: []byte("0: 00000000000000000000000000000000000000000000000000000000000000000000000000\r\n =?UTF-8?Q?_?=\r\n"), mailx.Field{"Subject", "Überzogene Zeile im Betreff wirklich außerordentlich langer Länge"}: []byte("Subject: =?UTF-8?Q?=C3=9Cberzogene?= Zeile im Betreff wirklich =?UTF-8?Q?au?=\r\n =?UTF-8?Q?=C3=9Ferordentlich?= langer =?UTF-8?Q?L=C3=A4nge?=\r\n"), mailx.Field{"0", "00000000000 \t\t\t000000000000000000000000000000000000000000000"}: []byte("0: 00000000000 =?UTF-8?Q?=09=09?=\r\n\t000000000000000000000000000000000000000000000\r\n"), mailx.Field{"L", "01234567890123456789012345678901234567890123456789012345678901234567890123"}: []byte("L: 01234567890123456789012345678901234567890123456789012345678901234567890123\r\n"), /* TODO write tests mailx.Field{"L", "012345678901234567890123456789012345678901234567890123456789012345678901234"}: Expect{ OneLongLine: []byte("L: 012345678901234567890123456789012345678901234567890123456789012345678901234\r\n"), Folded: []byte("L: =?UTF-8?Q?012345678901234567890123456789012345678901234567890123456789012?=\r\n =?UTF-8?Q?345678901234?=\r\n"), }, mailx.Field{"L", "0123456789012345678901234567890123456789012345678901234567890123456789012345"}: Expect{ OneLongLine: []byte("L: 0123456789012345678901234567890123456789012345678901234567890123456789012345\r\n"), Folded: []byte("L: =?UTF-8?Q?012345678901234567890123456789012345678901234567890123456789012?=\r\n =?UTF-8?Q?3456789012345?=\r\n"), }, mailx.Field{"L", "012345678901234567890123 4567890123456789012345678901234567890123456789012345"}: Expect{ OneLongLine: []byte("L: 012345678901234567890123 4567890123456789012345678901234567890123456789012345\r\n"), Folded: []byte("L: 012345678901234567890123\r\n 4567890123456789012345678901234567890123456789012345\r\n"), }, mailx.Field{"L", "012345678901234567890123\t4567890123456789012345678901234567890123456789012345"}: Expect{ OneLongLine: []byte("L: 012345678901234567890123\t4567890123456789012345678901234567890123456789012345\r\n"), Folded: []byte("L: 012345678901234567890123\r\n\t4567890123456789012345678901234567890123456789012345\r\n"), }, */ // mailx.Field{"-", " - _ - "}: []byte("-: =?UTF-8?Q?____-_?= _ =?UTF-8?Q?-_?=\r\n"), mailx.Field{"-", " - _ - "}: []byte("-: =?UTF-8?Q?___?= - _ =?UTF-8?Q?-_?=\r\n"), mailx.Field{"-", " - _ _ "}: []byte("-: =?UTF-8?Q?___?= - _ =?UTF-8?Q?=5F_?=\r\n"), mailx.Field{"---", "\t \t.\t. :"}: []byte("---: =?UTF-8?Q?=09_?=\t.\t. :\r\n"), mailx.Field{".", ". . ."}: []byte(".: =?UTF-8?Q?._?= . .\r\n"), mailx.Field{".", ". . ."}: []byte(".: . . .\r\n"), mailx.Field{".", "..."}: []byte(".: ...\r\n"), mailx.Field{"0", " "}: []byte("0: =?UTF-8?Q?__?=\r\n"), mailx.Field{"0", " 0 "}: []byte("0: =?UTF-8?Q?_0__?=\r\n"), mailx.Field{"0", " 0 \x18"}: []byte("0: =?UTF-8?Q?_0_=18?=\r\n"), mailx.Field{"0", " <0@0>"}: []byte("0: =?UTF-8?Q?_=3C0=400=3E?=\r\n"), mailx.Field{"0", " \x01"}: []byte("0: =?UTF-8?Q?_=01?=\r\n"), mailx.Field{"0", "0 0"}: []byte("0: 0 =?UTF-8?Q?_?= 0\r\n"), mailx.Field{"0", "0 0"}: []byte("0: 0 =?UTF-8?Q?_?= 0\r\n"), mailx.Field{"0", "0 0"}: []byte("0: =?UTF-8?Q?0_?= 0\r\n"), mailx.Field{"0", "0 \x01"}: []byte("0: 0 =?UTF-8?Q?_=01?=\r\n"), mailx.Field{"0", "0 0"}: []byte("0: 0 0\r\n"), mailx.Field{"0", "0000000 "}: []byte("0: =?UTF-8?Q?0000000_?=\r\n"), mailx.Field{"0", "000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000<@>000000000000000000000000000000000000000000000000000000000"}: []byte("0: 000000000000000000000000000000000000000000000000000000000000000000000000000\r\n 000000000000000000<@>000000000000000000000000000000000000000000000000000000000\r\n"), mailx.Field{"0", "0< @>0"}: []byte("0: =?UTF-8?Q?0=3C_?= @>0\r\n"), mailx.Field{"0", "0<@> 0"}: []byte("0: 0<@> =?UTF-8?Q?_0?=\r\n"), mailx.Field{"0", "0=? "}: []byte("0: =?UTF-8?Q?0=3D=3F_?=\r\n"), mailx.Field{"0", "=?<@>"}: []byte("0: =?UTF-8?Q?=3D=3F=3C=40=3E?=\r\n"), mailx.Field{"0", "\t\t\x01"}: []byte("0: =?UTF-8?Q?=09=09=01?=\r\n"), mailx.Field{"0", "\v 0 "}: []byte("0: =?UTF-8?Q?=0B_0_?=\r\n"), mailx.Field{"0", "\x01 "}: []byte("0: =?UTF-8?Q?=01_?=\r\n"), mailx.Field{"0", "\x01"}: []byte("0: =?UTF-8?Q?=01?=\r\n"), mailx.Field{"0", "\x04 2"}: []byte("0: =?UTF-8?Q?=04_?= 2\r\n"), mailx.Field{"00000000000000000000000000000000000000000000000000000000000000", "\x1b"}: []byte("00000000000000000000000000000000000000000000000000000000000000: =?UTF-8?Q?=1B?=\r\n"), mailx.Field{"1", "0 0"}: []byte("1: 0 =?UTF-8?Q?_?= 0\r\n"), mailx.Field{"<", "<@0> <@>"}: []byte("<: =?UTF-8?Q?=3C=400=3E_?= <@>\r\n"), mailx.Field{"=?UTF-8?Q?_?=", " :"}: []byte("=?UTF-8?Q?_?=: =?UTF-8?Q?__?= :\r\n"), mailx.Field{"=?UTF-8?Q?_?=", " :"}: []byte("=?UTF-8?Q?_?=: =?UTF-8?Q?_?= :\r\n"), mailx.Field{"=?UTF-8?Q?_?=", " "}: []byte("=?UTF-8?Q?_?=: =?UTF-8?Q?_?=\r\n"), mailx.Field{"=?UTF-8?Q?_?=", ": "}: []byte("=?UTF-8?Q?_?=: : =?UTF-8?Q?__?=\r\n"), mailx.Field{"=?UTF-8?Q?_?=", ": "}: []byte("=?UTF-8?Q?_?=: : =?UTF-8?Q?_?=\r\n"), mailx.Field{"E", "�"}: []byte("E: =?UTF-8?Q?"+QEncodedRuneError+"?=\r\n"), mailx.Field{"From", "\"Jonathan Frech\" "}: []byte("From: \"Jonathan Frech\" \r\n"), mailx.Field{"From", "\"Marius Müller\" "}: []byte("From: \"Marius =?UTF-8?Q?M=C3=BCller\"?= \r\n"), mailx.Field{"From", "\"Marius Müller\" , \"Jonathan Frech\" , "}: []byte("From: \"Marius =?UTF-8?Q?M=C3=BCller\"?= , \"Jonathan Frech\"\r\n , \r\n"), mailx.Field{"K", ""}: []byte("K:\r\n"), mailx.Field{"K", "v"}: []byte("K: v\r\n"), mailx.Field{"Long-Mail-Header-01234567890123456789012345678901234567890123456789012345678901234567890123456789", "0123456789ab"}: []byte("Long-Mail-Header-01234567890123456789012345678901234567890123456789012345678901234567890123456789: 0123456789ab\r\n"), mailx.Field{"Long-Mail-Header-01234567890123456789012345678901234567890123456789012345678901234567890123456789", "0123456789abc"}: []byte("Long-Mail-Header-01234567890123456789012345678901234567890123456789012345678901234567890123456789: 0123456789abc\r\n"), mailx.Field{"Long-Mail-Header-01234567890123456789012345678901234567890123456789012345678901234567890123456789", "0123456789abcd"}: []byte("Long-Mail-Header-01234567890123456789012345678901234567890123456789012345678901234567890123456789: 0123456789abcd\r\n"), mailx.Field{"Long-Mail-Header-01234567890123456789012345678901234567890123456789012345678901234567890123456789", "fb"}: []byte("Long-Mail-Header-01234567890123456789012345678901234567890123456789012345678901234567890123456789: fb\r\n"), mailx.Field{"Subject", ""}: []byte("Subject:\r\n"), mailx.Field{"Subject", "1L: Der Aktienausschuss (=AA) berät sich um 4 Uhr morgens. (WAS: Wann genau berät sich der Aktienausschuss?)"}: []byte("Subject: 1L: Der Aktienausschuss (=AA) =?UTF-8?Q?ber=C3=A4t?= sich um 4 Uhr\r\n morgens. (WAS: Wann genau =?UTF-8?Q?ber=C3=A4t?= sich der Aktienausschuss?)\r\n"), mailx.Field{"Subject", "1L: Es ist nicht \" \", sondern \" \". (RE: Tabularungstiefe?)"}: []byte("Subject: 1L: Es ist nicht =?UTF-8?Q?\"_?= \", sondern \" =?UTF-8?Q?__?= \". (RE:\r\n Tabularungstiefe?)\r\n"), mailx.Field{"Subject", "1L: Je ne suis pas fou ! Vous êtes folle. (RE: Tabularungstiefe?)"}: []byte("Subject: 1L: Je ne suis pas fou ! Vous =?UTF-8?Q?=C3=AAtes?= folle. (RE:\r\n Tabularungstiefe?)\r\n"), mailx.Field{"Subject", "1L: Mit Verrückten code ich nicht. (RE: Tabularungstiefe?)"}: []byte("Subject: 1L: Mit =?UTF-8?Q?Verr=C3=BCckten?= code ich nicht. (RE:\r\n Tabularungstiefe?)\r\n"), mailx.Field{"Subject", "1L: Wann genau berät sich der Aktienausschuss?"}: []byte("Subject: 1L: Wann genau =?UTF-8?Q?ber=C3=A4t?= sich der Aktienausschuss?\r\n"), mailx.Field{"Subject", "1L: `(== 'A') . map toUpper` funzt net."}: []byte("Subject: 1L: `(== 'A') . map toUpper` funzt net.\r\n"), mailx.Field{"Subject", "1L: `import Data.Char`."}: []byte("Subject: 1L: `import Data.Char`.\r\n"), mailx.Field{"Subject", "Länge=??"}: []byte("Subject: =?UTF-8?Q?L=C3=A4nge=3D=3F=3F?=\r\n"), mailx.Field{"Subject", "Länge?="}: []byte("Subject: =?UTF-8?Q?L=C3=A4nge=3F=3D?=\r\n"), mailx.Field{"To", ""}: []byte("To: \r\n"), mailx.Field{"To", ", "}: []byte("To: ,\r\n \r\n"), mailx.Field{"X-Imaptar-Mailbox-0-Flag", "\\Seen"}: []byte("X-Imaptar-Mailbox-0-Flag: \\Seen\r\n"), mailx.Field{"a", "0ü <@>"}: []byte("a: =?UTF-8?Q?0=C3=BC_?= <@>\r\n"), mailx.Field{"cAmEl", "CaSe"}: []byte("cAmEl: CaSe\r\n"), mailx.Field{"calc", "It holds \x04+\x02 == \x06. Ou pas ?"}: []byte("calc: It holds =?UTF-8?Q?=04+=02?= == =?UTF-8?Q?=06.?= Ou pas ?\r\n"), mailx.Field{"uE", "ü ue"}: []byte("uE: =?UTF-8?Q?=C3=BC=3C=3F=40=3E?= ue\r\n"), mailx.Field{"uE", "ü"}: []byte("uE: =?UTF-8?Q?=C3=BC=3C=3F=40=3E?=\r\n"), // mailx.Field{"0", "<@>0000000000000000000000000666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666660000000"}: []byte("0: =?UTF-8?Q?=3C=40=3E000000000000000000000000066666666666666666666666666666?=\r\n =?UTF-8?Q?66666666666666666666666666666666666666666666666666666666666666666?=\r\n =?UTF-8?Q?66666666666666666666666666666666666666666666666666666666666666666?=\r\n =?UTF-8?Q?66666666666666666666666666666666666666666666666666666666666666666?=\r\n =?UTF-8?Q?66666666666666666666666666666666666666666666666666666666666666666?=\r\n =?UTF-8?Q?66666666666666666666666666666666666666666666666666666666666666666?=\r\n =?UTF-8?Q?66666666666666666666666666666666666666666666666666666666666666666?=\r\n =?UTF-8?Q?66666666666666666666666666666666666666666666666666666666666666666?=\r\n =?UTF-8?Q?66666666666666666666666666666666666666666666666666666666666666666?=\r\n =?UTF-8?Q?66666666666666666666666666666666666666666666666666666666666666666?=\r\n =?UTF-8?Q?66666666666666666666666666666666666666666666666666666666666666666?=\r\n =?UTF-8?Q?66666666666666666666666666666666666666666666666666666666666666666?=\r\n =?UTF-8?Q?66666666666666666666666666666666666666666666666666666666666666666?=\r\n =?UTF-8?Q?66666666666666666666666666666666666666666666666666666666666666666?=\r\n =?UTF-8?Q?66666666666666666666666666666666666666666666666666666666666666666?=\r\n =?UTF-8?Q?66666666666666666666666666666666666666666666666666666666666666666?=\r\n =?UTF-8?Q?66666666666666666666666666666666666666666666666666666666666666666?=\r\n =?UTF-8?Q?66666666666666666666666666666666666666666666666666666666666666666?=\r\n =?UTF-8?Q?66666666666666666666666666666666666666666666666666666666666666666?=\r\n =?UTF-8?Q?66666666666666666666666666666666666666666666666666666666666666666?=\r\n =?UTF-8?Q?66666666666666666666666666666666666666666666666666666666666666666?=\r\n =?UTF-8?Q?66666666666666666666666666666666666666666666666666666666666666666?=\r\n =?UTF-8?Q?66666666666666666666666666666666666666666666666666666666666666666?=\r\n =?UTF-8?Q?66666666666666666666666666666666666666666666666666666666666666666?=\r\n =?UTF-8?Q?666666666666666666666666666666666660000000?=\r\n"), mailx.Field{"-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------To", ""}: []byte("-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------To: =?UTF-8?Q?=3C?=\r\n =?UTF-8?Q?loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo?=\r\n =?UTF-8?Q?oooongboy=40kurz.de=3E?=\r\n"), } }