12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- 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
- }
|