@@ -3,8 +3,8 @@ package email
3
3
import (
4
4
"bytes"
5
5
"crypto/tls"
6
- "fmt"
7
6
"html/template"
7
+ "mime/quotedprintable"
8
8
"net/mail"
9
9
"net/smtp"
10
10
@@ -51,43 +51,61 @@ func New(smtpAddress string) *Email {
51
51
}
52
52
}
53
53
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
+
54
67
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 ))
58
75
m .buffer .WriteString ("\r \n " )
59
- m .buffer .WriteString (content + "\r \n " )
60
76
}
61
77
62
78
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 )
67
85
m .buffer .WriteString ("\r \n " )
68
- m .buffer .WriteString (f .Content + "\r \n " )
69
86
}
70
87
71
88
func (e * Email ) Send (m * Message ) (err error ) {
72
89
// Message header
73
- m .buffer = new (bytes.Buffer )
90
+ m .buffer = bytes .NewBuffer (make ([]byte , 256 ))
91
+ m .buffer .Reset ()
74
92
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 )
80
98
if m .CC != "" {
81
- m .buffer . WriteString ( fmt . Sprintf ( "CC: %s \r \n " , m .CC ) )
99
+ m .writeHeader ( "CC" , m .CC )
82
100
}
83
101
if m .Subject != "" {
84
- m .buffer . WriteString ( fmt . Sprintf ( "Subject: %s \r \n " , m .Subject ) )
102
+ m .writeHeader ( "Subject" , m .Subject )
85
103
}
86
104
// Extra
87
105
for k , v := range e .Header {
88
- m .buffer . WriteString ( fmt . Sprintf ( "%s: %s \r \n " , k , v ) )
106
+ m .writeHeader ( k , v )
89
107
}
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 )
91
109
m .buffer .WriteString ("\r \n " )
92
110
93
111
// Message body
@@ -106,8 +124,9 @@ func (e *Email) Send(m *Message) (err error) {
106
124
for _ , f := range m .Attachments {
107
125
m .writeFile (f , "disposition" )
108
126
}
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 ("--" )
111
130
112
131
// Dial
113
132
c , err := smtp .Dial (e .smtpAddress )
0 commit comments