Эх сурвалжийг харах

Format From, To, Cc & Bcc for RFC1342 (#115)

* Format From, To, Cc & Bcc for RFC1342

* Fixed seperator & added tests
Florian Kinder 5 жил өмнө
parent
commit
fd8a762230
3 өөрчлөгдсөн 62 нэмэгдсэн , 0 устгасан
  1. 3 0
      .gitignore
  2. 12 0
      email.go
  3. 47 0
      email_test.go

+ 3 - 0
.gitignore

@@ -20,3 +20,6 @@ _cgo_export.*
 _testmain.go
 
 *.exe
+
+# IDEs
+.idea

+ 12 - 0
email.go

@@ -729,6 +729,18 @@ func headerToBytes(buff io.Writer, header textproto.MIMEHeader) {
 			switch {
 			case field == "Content-Type" || field == "Content-Disposition":
 				buff.Write([]byte(subval))
+			case field == "From" || field == "To" || field == "Cc" || field == "Bcc":
+				participants := strings.Split(subval, ",")
+				for i, v := range participants {
+					addr, err := mail.ParseAddress(v)
+					if err != nil {
+						continue
+					}
+					if addr.Name != "" {
+						participants[i] = fmt.Sprintf("%s <%s>", mime.QEncoding.Encode("UTF-8", addr.Name), addr.Address)
+					}
+				}
+				buff.Write([]byte(strings.Join(participants, ", ")))
 			default:
 				buff.Write([]byte(mime.QEncoding.Encode("UTF-8", subval)))
 			}

+ 47 - 0
email_test.go

@@ -1,6 +1,7 @@
 package email
 
 import (
+	"fmt"
 	"strings"
 	"testing"
 
@@ -317,6 +318,52 @@ func TestEmailAttachment(t *testing.T) {
 	}
 }
 
+func TestHeaderEncoding(t *testing.T) {
+	cases := []struct {
+		field string
+		have  string
+		want  string
+	}{
+		{
+			field: "From",
+			have:  "Needs Encóding <encoding@example.com>, Only ASCII <foo@example.com>",
+			want:  "=?UTF-8?q?Needs_Enc=C3=B3ding?= <encoding@example.com>, Only ASCII <foo@example.com>\r\n",
+		},
+		{
+			field: "To",
+			have:  "Keith Moore <moore@cs.utk.edu>, Keld Jørn Simonsen <keld@dkuug.dk>",
+			want:  "Keith Moore <moore@cs.utk.edu>, =?UTF-8?q?Keld_J=C3=B8rn_Simonsen?= <keld@dkuug.dk>\r\n",
+		},
+		{
+			field: "Cc",
+			have:  "Needs Encóding <encoding@example.com>",
+			want:  "=?UTF-8?q?Needs_Enc=C3=B3ding?= <encoding@example.com>\r\n",
+		},
+		{
+			field: "Subject",
+			have:  "Subject with a 🐟",
+			want:  "=?UTF-8?q?Subject_with_a_=F0=9F=90=9F?=\r\n",
+		},
+		{
+			field: "Subject",
+			have:  "Subject with only ASCII",
+			want:  "Subject with only ASCII\r\n",
+		},
+	}
+	buff := &bytes.Buffer{}
+	for _, c := range cases {
+		header := make(textproto.MIMEHeader)
+		header.Add(c.field, c.have)
+		buff.Reset()
+		headerToBytes(buff, header)
+		want := fmt.Sprintf("%s: %s", c.field, c.want)
+		got := buff.String()
+		if got != want {
+			t.Errorf("invalid utf-8 header encoding. \nwant:%#v\ngot: %#v", want, got)
+		}
+	}
+}
+
 func TestEmailFromReader(t *testing.T) {
 	ex := &Email{
 		Subject: "Test Subject",