Browse Source

Fixed email quoted-printable encoding

Signed-off-by: Vishal Rana <vr@labstack.com>
Vishal Rana 8 năm trước cách đây
mục cha
commit
1121fd3e24
1 tập tin đã thay đổi với 41 bổ sung22 xóa
  1. 41 22
      email/email.go

+ 41 - 22
email/email.go

@@ -3,8 +3,8 @@ package email
 import (
 import (
 	"bytes"
 	"bytes"
 	"crypto/tls"
 	"crypto/tls"
-	"fmt"
 	"html/template"
 	"html/template"
+	"mime/quotedprintable"
 	"net/mail"
 	"net/mail"
 	"net/smtp"
 	"net/smtp"
 
 
@@ -51,43 +51,61 @@ func New(smtpAddress string) *Email {
 	}
 	}
 }
 }
 
 
+func (m *Message) writeHeader(key, value string) {
+	m.buffer.WriteString(key)
+	m.buffer.WriteString(": ")
+	m.buffer.WriteString(value)
+	m.buffer.WriteString("\r\n")
+}
+
+func (m *Message) writeBoundary() {
+	m.buffer.WriteString("--")
+	m.buffer.WriteString(m.boundary)
+	m.buffer.WriteString("\r\n")
+}
+
 func (m *Message) writeText(content string, contentType string) {
 func (m *Message) writeText(content string, contentType string) {
-	m.buffer.WriteString(fmt.Sprintf("--%s\r\n", m.boundary))
-	m.buffer.WriteString(fmt.Sprintf("Content-Type: %s; charset=UTF-8\r\n", contentType))
-	m.buffer.WriteString("Content-Transfer-Encoding: quoted-printable\r\n")
+	m.writeBoundary()
+	m.writeHeader("Content-Type", contentType+"; charset=UTF-8")
+	m.writeHeader("Content-Transfer-Encoding", "quoted-printable")
+	m.buffer.WriteString("\r\n")
+	qp := quotedprintable.NewWriter(m.buffer)
+	defer qp.Close()
+	qp.Write([]byte(content))
 	m.buffer.WriteString("\r\n")
 	m.buffer.WriteString("\r\n")
-	m.buffer.WriteString(content + "\r\n")
 }
 }
 
 
 func (m *Message) writeFile(f *File, disposition string) {
 func (m *Message) writeFile(f *File, disposition string) {
-	m.buffer.WriteString(fmt.Sprintf("--%s\r\n", m.boundary))
-	m.buffer.WriteString(fmt.Sprintf("Content-Type: %s; name=%s\r\n", f.Type, f.Name))
-	m.buffer.WriteString(fmt.Sprintf("Content-Disposition: %s; filename=%s\r\n", disposition, f.Name))
-	m.buffer.WriteString("Content-Transfer-Encoding: base64\r\n")
+	m.writeBoundary()
+	m.writeHeader("Content-Type", f.Type+"; name="+f.Name)
+	m.writeHeader("Content-Disposition", disposition+"; filename="+f.Name)
+	m.writeHeader("Content-Transfer-Encoding", "base64")
+	m.buffer.WriteString("\r\n")
+	m.buffer.WriteString(f.Content)
 	m.buffer.WriteString("\r\n")
 	m.buffer.WriteString("\r\n")
-	m.buffer.WriteString(f.Content + "\r\n")
 }
 }
 
 
 func (e *Email) Send(m *Message) (err error) {
 func (e *Email) Send(m *Message) (err error) {
 	// Message header
 	// Message header
-	m.buffer = new(bytes.Buffer)
+	m.buffer = bytes.NewBuffer(make([]byte, 256))
+	m.buffer.Reset()
 	m.boundary = random.String(16)
 	m.boundary = random.String(16)
-	m.buffer.WriteString("MIME-Version: 1.0\r\n")
-	m.buffer.WriteString(fmt.Sprintf("Message-ID: %s\r\n", m.ID))
-	m.buffer.WriteString(fmt.Sprintf("Date: %s\r\n", time.Now().Format(time.RFC1123Z)))
-	m.buffer.WriteString(fmt.Sprintf("From: %s\r\n", m.From))
-	m.buffer.WriteString(fmt.Sprintf("To: %s\r\n", m.To))
+	m.writeHeader("MIME-Version", "1.0")
+	m.writeHeader("Message-ID", m.ID)
+	m.writeHeader("Date", time.Now().Format(time.RFC1123Z))
+	m.writeHeader("From", m.From)
+	m.writeHeader("To", m.To)
 	if m.CC != "" {
 	if m.CC != "" {
-		m.buffer.WriteString(fmt.Sprintf("CC: %s\r\n", m.CC))
+		m.writeHeader("CC", m.CC)
 	}
 	}
 	if m.Subject != "" {
 	if m.Subject != "" {
-		m.buffer.WriteString(fmt.Sprintf("Subject: %s\r\n", m.Subject))
+		m.writeHeader("Subject", m.Subject)
 	}
 	}
 	// Extra
 	// Extra
 	for k, v := range e.Header {
 	for k, v := range e.Header {
-		m.buffer.WriteString(fmt.Sprintf("%s: %s\r\n", k, v))
+		m.writeHeader(k, v)
 	}
 	}
-	m.buffer.WriteString(fmt.Sprintf("Content-Type: multipart/mixed; boundary=%s\r\n", m.boundary))
+	m.writeHeader("Content-Type", "multipart/mixed; boundary="+m.boundary)
 	m.buffer.WriteString("\r\n")
 	m.buffer.WriteString("\r\n")
 
 
 	// Message body
 	// Message body
@@ -106,8 +124,9 @@ func (e *Email) Send(m *Message) (err error) {
 	for _, f := range m.Attachments {
 	for _, f := range m.Attachments {
 		m.writeFile(f, "disposition")
 		m.writeFile(f, "disposition")
 	}
 	}
-	m.buffer.WriteString("\r\n")
-	m.buffer.WriteString("--" + m.boundary + "--")
+	m.buffer.WriteString("\r\n\r\n--")
+	m.buffer.WriteString(m.boundary)
+	m.buffer.WriteString("--")
 
 
 	// Dial
 	// Dial
 	c, err := smtp.Dial(e.smtpAddress)
 	c, err := smtp.Dial(e.smtpAddress)