@@ -3,8 +3,8 @@ package email
33import (
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+
5467func (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
6278func (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
7188func (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