Skip to content

Commit 1121fd3

Browse files
committed
Fixed email quoted-printable encoding
Signed-off-by: Vishal Rana <vr@labstack.com>
1 parent 9298d71 commit 1121fd3

File tree

1 file changed

+41
-22
lines changed

1 file changed

+41
-22
lines changed

email/email.go

Lines changed: 41 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ package email
33
import (
44
"bytes"
55
"crypto/tls"
6-
"fmt"
76
"html/template"
7+
"mime/quotedprintable"
88
"net/mail"
99
"net/smtp"
1010

@@ -51,43 +51,61 @@ func New(smtpAddress string) *Email {
5151
}
5252
}
5353

54+
func (m *Message) writeHeader(key, value string) {
55+
m.buffer.WriteString(key)
56+
m.buffer.WriteString(": ")
57+
m.buffer.WriteString(value)
58+
m.buffer.WriteString("\r\n")
59+
}
60+
61+
func (m *Message) writeBoundary() {
62+
m.buffer.WriteString("--")
63+
m.buffer.WriteString(m.boundary)
64+
m.buffer.WriteString("\r\n")
65+
}
66+
5467
func (m *Message) writeText(content string, contentType string) {
55-
m.buffer.WriteString(fmt.Sprintf("--%s\r\n", m.boundary))
56-
m.buffer.WriteString(fmt.Sprintf("Content-Type: %s; charset=UTF-8\r\n", contentType))
57-
m.buffer.WriteString("Content-Transfer-Encoding: quoted-printable\r\n")
68+
m.writeBoundary()
69+
m.writeHeader("Content-Type", contentType+"; charset=UTF-8")
70+
m.writeHeader("Content-Transfer-Encoding", "quoted-printable")
71+
m.buffer.WriteString("\r\n")
72+
qp := quotedprintable.NewWriter(m.buffer)
73+
defer qp.Close()
74+
qp.Write([]byte(content))
5875
m.buffer.WriteString("\r\n")
59-
m.buffer.WriteString(content + "\r\n")
6076
}
6177

6278
func (m *Message) writeFile(f *File, disposition string) {
63-
m.buffer.WriteString(fmt.Sprintf("--%s\r\n", m.boundary))
64-
m.buffer.WriteString(fmt.Sprintf("Content-Type: %s; name=%s\r\n", f.Type, f.Name))
65-
m.buffer.WriteString(fmt.Sprintf("Content-Disposition: %s; filename=%s\r\n", disposition, f.Name))
66-
m.buffer.WriteString("Content-Transfer-Encoding: base64\r\n")
79+
m.writeBoundary()
80+
m.writeHeader("Content-Type", f.Type+"; name="+f.Name)
81+
m.writeHeader("Content-Disposition", disposition+"; filename="+f.Name)
82+
m.writeHeader("Content-Transfer-Encoding", "base64")
83+
m.buffer.WriteString("\r\n")
84+
m.buffer.WriteString(f.Content)
6785
m.buffer.WriteString("\r\n")
68-
m.buffer.WriteString(f.Content + "\r\n")
6986
}
7087

7188
func (e *Email) Send(m *Message) (err error) {
7289
// Message header
73-
m.buffer = new(bytes.Buffer)
90+
m.buffer = bytes.NewBuffer(make([]byte, 256))
91+
m.buffer.Reset()
7492
m.boundary = random.String(16)
75-
m.buffer.WriteString("MIME-Version: 1.0\r\n")
76-
m.buffer.WriteString(fmt.Sprintf("Message-ID: %s\r\n", m.ID))
77-
m.buffer.WriteString(fmt.Sprintf("Date: %s\r\n", time.Now().Format(time.RFC1123Z)))
78-
m.buffer.WriteString(fmt.Sprintf("From: %s\r\n", m.From))
79-
m.buffer.WriteString(fmt.Sprintf("To: %s\r\n", m.To))
93+
m.writeHeader("MIME-Version", "1.0")
94+
m.writeHeader("Message-ID", m.ID)
95+
m.writeHeader("Date", time.Now().Format(time.RFC1123Z))
96+
m.writeHeader("From", m.From)
97+
m.writeHeader("To", m.To)
8098
if m.CC != "" {
81-
m.buffer.WriteString(fmt.Sprintf("CC: %s\r\n", m.CC))
99+
m.writeHeader("CC", m.CC)
82100
}
83101
if m.Subject != "" {
84-
m.buffer.WriteString(fmt.Sprintf("Subject: %s\r\n", m.Subject))
102+
m.writeHeader("Subject", m.Subject)
85103
}
86104
// Extra
87105
for k, v := range e.Header {
88-
m.buffer.WriteString(fmt.Sprintf("%s: %s\r\n", k, v))
106+
m.writeHeader(k, v)
89107
}
90-
m.buffer.WriteString(fmt.Sprintf("Content-Type: multipart/mixed; boundary=%s\r\n", m.boundary))
108+
m.writeHeader("Content-Type", "multipart/mixed; boundary="+m.boundary)
91109
m.buffer.WriteString("\r\n")
92110

93111
// Message body
@@ -106,8 +124,9 @@ func (e *Email) Send(m *Message) (err error) {
106124
for _, f := range m.Attachments {
107125
m.writeFile(f, "disposition")
108126
}
109-
m.buffer.WriteString("\r\n")
110-
m.buffer.WriteString("--" + m.boundary + "--")
127+
m.buffer.WriteString("\r\n\r\n--")
128+
m.buffer.WriteString(m.boundary)
129+
m.buffer.WriteString("--")
111130

112131
// Dial
113132
c, err := smtp.Dial(e.smtpAddress)

0 commit comments

Comments
 (0)