package util import ( "crypto/tls" "fmt" "net/mail" "net/smtp" ) const EMAIL_ADMIN_NAME = "郭晓舟" const EMAIL_ADMIN_ADDRESS = "guoxz@xniao.com.cn" const EMAIL_ADMIN_PASSWORD = "hanbing540" const EMAIL_ADMIN_SMTP_SERVER = "smtp.exmail.qq.com" const EMAIL_ADMIN_SMTP_PORT = 465 type MailList []mail.Address func (ml MailList) String() string { s := "" for _, v := range ml { s += v.String() + ";" } return s[0 : len(s)-1] } func SendMail(to MailList, body string, subject string) (bool, error) { header := make(map[string]string) from := mail.Address{Name: EMAIL_ADMIN_NAME, Address: EMAIL_ADMIN_ADDRESS} header["From"] = from.String() header["To"] = to.String() header["Subject"] = subject header["Content-Type"] = "text/plain; charset=UTF-8" toEmails := []string{} for _, addr := range to { toEmails = append(toEmails, addr.Address) } // setup the message message := "" for k, v := range header { message += fmt.Sprintf("%s: %s\r\n", k, v) } message += "\r\n" + body conn, err := tls.Dial("tcp", fmt.Sprintf("%s:%d", EMAIL_ADMIN_SMTP_SERVER, EMAIL_ADMIN_SMTP_PORT), nil) if err != nil { return false, err } smtpClient, err := smtp.NewClient(conn, EMAIL_ADMIN_SMTP_SERVER) if err != nil { return false, err } auth := smtp.PlainAuth("", EMAIL_ADMIN_ADDRESS, EMAIL_ADMIN_PASSWORD, EMAIL_ADMIN_SMTP_SERVER) err = smtpClient.Auth(auth) if err != nil { return false, err } if err = smtpClient.Mail(from.Address); err != nil { return false, err } for _, addr := range to { if err = smtpClient.Rcpt(addr.Address); err != nil { return false, err } } w, err := smtpClient.Data() if err != nil { return false, err } _, err = w.Write([]byte(message)) if err != nil { return false, err } err = w.Close() if err != nil { return false, err } smtpClient.Quit() //err := smtp.SendMail(fmt.Sprintf("%s:%d", EMAIL_ADMIN_SMTP_SERVER, EMAIL_ADMIN_SMTP_PORT), auth, EMAIL_ADMIN_ADDRESS, toEmails, []byte(message)) return true, nil }