package mail import ( "crypto/tls" "fmt" "net/mail" "net/smtp" "git.acooldomain.co/server-manager/backend-kubernetes-go/models" ) type MailClient struct { auth *smtp.Auth mailConfig *models.EmailConfig } func NewMailClient(config models.EmailConfig) *MailClient { simpleAuth := smtp.PlainAuth("", config.Username, config.Password, config.Server) return &MailClient{ auth: &simpleAuth, mailConfig: &config, } } func (self *MailClient) SendMail( recipient string, subject string, content string, ) error { from := mail.Address{Name: "", Address: self.mailConfig.FromEmail} to := mail.Address{Name: "", Address: recipient} headers := make(map[string]string) headers["From"] = from.String() headers["To"] = to.String() headers["Subject"] = subject message := "" for k, v := range headers { message += fmt.Sprintf("%s: %s\r\n", k, v) } message += "\r\n" + content conn, err := tls.Dial("tcp", self.mailConfig.Server+":465", &tls.Config{ServerName: self.mailConfig.Server}) if err != nil { return err } client, err := smtp.NewClient(conn, self.mailConfig.Server) if err != nil { return err } if err = client.Auth(*self.auth); err != nil { return err } if err = client.Mail(self.mailConfig.FromEmail); err != nil { return err } if err = client.Rcpt(recipient); err != nil { return err } writer, err := client.Data() if err != nil { return err } _, err = writer.Write([]byte(message)) if err != nil { return err } if err = writer.Close(); err != nil { return err } return client.Quit() }