github.com/ngocphuongnb/tetua@v0.0.7-alpha/app/mail/mail.go (about) 1 package mail 2 3 import ( 4 "crypto/tls" 5 "fmt" 6 "mime" 7 "net/mail" 8 "net/smtp" 9 10 "github.com/ngocphuongnb/tetua/app/config" 11 ) 12 13 func Send(receiverName, receiverAddress, subject, body string) error { 14 if config.Mail == nil || 15 config.Mail.Sender == "" || 16 config.Mail.Smtp == nil || 17 config.Mail.Smtp.Host == "" || 18 config.Mail.Smtp.Port == 0 || 19 config.Mail.Smtp.User == "" || 20 config.Mail.Smtp.Pass == "" { 21 return fmt.Errorf("Mail config is not set") 22 } 23 24 from := mail.Address{ 25 Name: config.Setting("app_name"), 26 Address: config.Mail.Sender, 27 } 28 to := mail.Address{ 29 Name: receiverName, 30 Address: receiverAddress, 31 } 32 tlsconfig := &tls.Config{ 33 InsecureSkipVerify: config.DEVELOPMENT, 34 ServerName: config.Mail.Smtp.Host, 35 } 36 37 message := fmt.Sprintf("%s: %s\r\n", "From", from.String()) 38 message += fmt.Sprintf("%s: %s\r\n", "To", to.String()) 39 message += fmt.Sprintf("%s: %s\r\n", "Subject", mime.QEncoding.Encode("UTF-8", subject)) 40 message += "MIME-version: 1.0;\nContent-Type: text/html; charset=\"UTF-8\";\r\n" 41 message += "\r\n" + body 42 auth := smtp.PlainAuth("", config.Mail.Smtp.User, config.Mail.Smtp.Pass, config.Mail.Smtp.Host) 43 address := fmt.Sprintf("%s:%d", config.Mail.Smtp.Host, config.Mail.Smtp.Port) 44 45 tlsConn, err := tls.Dial("tcp", address, tlsconfig) 46 if err != nil { 47 return err 48 } 49 50 client, err := smtp.NewClient(tlsConn, config.Mail.Smtp.Host) 51 if err != nil { 52 return err 53 } 54 55 if err = client.Auth(auth); err != nil { 56 return err 57 } 58 59 if err = client.Mail(from.Address); err != nil { 60 return err 61 } 62 63 if err = client.Rcpt(to.Address); err != nil { 64 return err 65 } 66 67 w, err := client.Data() 68 if err != nil { 69 return err 70 } 71 72 if _, err = w.Write([]byte(message)); err != nil { 73 return err 74 } 75 76 if err = w.Close(); err != nil { 77 return err 78 } 79 80 client.Quit() 81 82 return nil 83 }