go mail发邮件.md

package service

import (
    "crypto/tls"
    "fmt"
    "net"
    "net/smtp"
    "strings"
)

func (this *Service) SendMail(body string) (err error) {
    toEmailList := []string{"1034455262@qq.com"}

    host := "smtp.mxhichina.com"
    port := 465
    email := "发送的邮箱"                     // 发送邮箱
    pwd := "密码"                             // 邮箱密码
    toEmail := strings.Join(toEmailList, ";") // 目标地址
    header := make(map[string]string)
    header["From"] = "自动化" + "<" + email + ">"
    header["To"] = strings.Join(toEmailList, "")
    header["Subject"] = "自动化申请通知"
    header["Content-Type"] = "text/html;charset=UTF-8"
    message := ""
    for k, v := range header {
        message += fmt.Sprintf("%s:%s\r\n", k, v)
    }
    message += "\r\n" + body
    auth := smtp.PlainAuth(
        "",
        email,
        pwd,
        host,
    )
    err = SendMailUsingTLS(
        fmt.Sprintf("%s:%d", host, port),
        auth,
        email,
        toEmail,
        []byte(message),
    )
    if err != nil {
        this.Log.Info("发送邮件失败!")
        this.Log.Info(err)
    } else {
        fmt.Println("发送邮件成功!")
    }
    return
}
func SendMailUsingTLS(addr string, auth smtp.Auth, from string, to string, msg []byte) (err error) {
    c, err := Dial(addr)
    if err != nil {
        return err
    }
    defer c.Close()
    if auth != nil {
        if ok, _ := c.Extension("AUTH"); ok {
            if err = c.Auth(auth); err != nil {
                return err
            }
        }
    }
    if err = c.Mail(from); err != nil {
        return err
    }
    tos := strings.Split(to, ";")
    for _, addr := range tos {
        if err = c.Rcpt(addr); err != nil {
            fmt.Print(err)
            return err
        }
    }
    w, err := c.Data()
    if err != nil {
        return err
    }
    _, err = w.Write(msg)
    if err != nil {
        return err
    }
    err = w.Close()
    if err != nil {
        return err
    }
    return c.Quit()
}
func Dial(addr string) (*smtp.Client, error) {
    //conn, err := tls.Dial("tcp", addr, nil)
    conn, err := tls.Dial("tcp", addr, &tls.Config{InsecureSkipVerify: true})
    if err != nil {
        return nil, err
    }
    //分解主机端口字符串
    host, _, _ := net.SplitHostPort(addr)
    return smtp.NewClient(conn, host)
}

仅供参考
目录