github.com/keysonzzz/kmg@v0.0.0-20151121023212-05317bfd7d39/kmgEmail/SmtpSendEmail.go (about) 1 package kmgEmail 2 3 import ( 4 "bytes" 5 "crypto/tls" 6 "net" 7 "net/smtp" 8 "strings" 9 "text/template" 10 11 "github.com/bronze1man/kmg/kmgLog" 12 "github.com/bronze1man/kmg/kmgNet" 13 "github.com/bronze1man/kmg/kmgNet/kmgProxy" 14 ) 15 16 func SmtpSendEmail(req *SmtpRequest) (err error) { 17 parameters := &struct { 18 From string 19 To string 20 Subject string 21 Message string 22 }{ 23 req.From, 24 strings.Join([]string(req.To), ","), 25 req.Subject, 26 req.Message, 27 } 28 buffer := new(bytes.Buffer) 29 t := template.Must(template.New("emailTemplate").Parse(_EmailScript())) 30 t.Execute(buffer, parameters) 31 auth := smtp.PlainAuth("", req.From, req.SmtpPassword, req.SmtpHost) 32 var conn net.Conn 33 if req.Socks4aProxyAddr != "" { 34 conn, err = kmgProxy.Socks4aDial(req.Socks4aProxyAddr, kmgNet.JoinHostPortInt(req.SmtpHost, req.SmtpPort)) 35 } else { 36 conn, err = net.Dial("tcp", kmgNet.JoinHostPortInt(req.SmtpHost, req.SmtpPort)) 37 } 38 if err != nil { 39 kmgLog.Log("Email", "1", err.Error()) 40 return 41 } 42 c, err := smtp.NewClient(conn, req.SmtpHost) 43 if err != nil { 44 kmgLog.Log("Email", err.Error()) 45 return 46 } 47 err = smtpSendMailPart2(c, 48 req.SmtpHost, 49 auth, 50 req.From, 51 req.To, 52 buffer.Bytes()) 53 return err 54 } 55 56 func smtpSendMailPart2(c *smtp.Client, smtpHost string, a smtp.Auth, from string, to []string, msg []byte) (err error) { 57 defer c.Close() 58 if err = c.Hello("localhost"); err != nil { 59 return err 60 } 61 if ok, _ := c.Extension("STARTTLS"); ok { 62 config := &tls.Config{ServerName: smtpHost} 63 if err = c.StartTLS(config); err != nil { 64 return err 65 } 66 } 67 if a != nil { 68 if ok, _ := c.Extension("AUTH"); ok { 69 if err = c.Auth(a); err != nil { 70 return err 71 } 72 } 73 } 74 if err = c.Mail(from); err != nil { 75 return err 76 } 77 for _, addr := range to { 78 if err = c.Rcpt(addr); err != nil { 79 return err 80 } 81 } 82 w, err := c.Data() 83 if err != nil { 84 return err 85 } 86 _, err = w.Write(msg) 87 if err != nil { 88 return err 89 } 90 err = w.Close() 91 if err != nil { 92 return err 93 } 94 return c.Quit() 95 } 96 97 // _EmailScript returns a template for the email message to be sent 98 func _EmailScript() (script string) { 99 return `From: {{.From}} 100 To: {{.To}} 101 Subject: {{.Subject}} 102 MIME-version: 1.0 103 Content-Type: text/html; charset="UTF-8" 104 105 {{.Message}}` 106 }