golang发邮件

由于go默认tls.Config{ServerName: host, InsecureSkipVerify: false},

func TestHtmlEmail(t *testing.T) {
	opt := &EmailOptions{
		User:     "",
		Password: "",
		To:       []string{""},
		From:     "",
		Addr:     "smtp.xxx.com:25",
	}

	auth := NewLoginAuth(opt.User, opt.Password)

	pic, err := ioutil.ReadFile(`C:\Pictures\example.png`)
	if err != nil {
		t.Log(err)
	}
	dest := make([]byte, base64.StdEncoding.EncodedLen(len(pic)))
	base64.StdEncoding.Encode(dest, pic)

	buf := bytes.Buffer{}
	fmt.Fprint(&buf, "<html><head></head><body><p>Test png</p><p><img src=\"data:image/png;base64,")
	_, err = buf.Write(dest)
	fmt.Fprint(&buf, "\"></p><body></html>")

	err = sendMail(opt.Addr, auth, opt.From, opt.To, buf.Bytes(), "subject")
	if err != nil {
		t.Log(err)
	}

}

type LoginAuth struct {
	username, password string
}

func NewLoginAuth(username, password string) smtp.Auth {
	return &LoginAuth{username, password}
}

func (a *LoginAuth) Start(server *smtp.ServerInfo) (string, []byte, error) {
	return "LOGIN", []byte{}, nil
}

func (a *LoginAuth) Next(fromServer []byte, more bool) ([]byte, error) {
	if more {
		switch string(fromServer) {
		case "Username:":
			return []byte(a.username), nil
		case "Password:":
			return []byte(a.password), nil
		default:
			return nil, errors.New("Unknown fromServer")
		}
	}
	return nil, nil
}

func sendMail(addr string, auth smtp.Auth, from string, to []string, msg []byte, subject string) error {
	conn, err := smtp.Dial(addr)
	host, _, _ := net.SplitHostPort(addr)
	if err != nil {
		return err
	}
	defer conn.Close()

	if ok, _ := conn.Extension("STARTTLS"); ok {
		config := &tls.Config{ServerName: host, InsecureSkipVerify: true}
		if err = conn.StartTLS(config); err != nil {
			return err
		}
	}

	if auth != nil {
		if ok, _ := conn.Extension("AUTH"); ok {
			if err = conn.Auth(auth); err != nil {
				return err
			}
		}
	}
	if err = conn.Mail(from); err != nil {
		return err
	}
	for _, addr := range to {
		if err = conn.Rcpt(addr); err != nil {
			return err
		}
	}
	w, err := conn.Data()
	if err != nil {
		return err
	}
	header := make(map[string]string)
	header["Subject"] = subject
	header["MIME-Version"] = "1.0"
	header["To"] = strings.Join(to, ",")
	header["From"] = from
	header["Content-Type"] = "text/HTML; charset=\"utf-8\""
	header["Content-Transfer-Encoding"] = "base64"
	message := ""
	for k, v := range header {
		message += fmt.Sprintf("%s: %s\r\n", k, v)
	}
	message += "\r\n" + base64.StdEncoding.EncodeToString(msg)
	_, err = w.Write([]byte(message))
	if err != nil {
		return err
	}
	err = w.Close()
	if err != nil {
		return err
	}
	return conn.Quit()
}

 

转载于:https://my.oschina.net/3cwYg4/blog/855600

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值