当前位置 博文首页 > Janbar:后台提供邮件发送验证码服务
package main
import (
"encoding/base64"
"errors"
"net"
"net/http"
"strconv"
"time"
)
func main() {
http.HandleFunc("/Captcha", Captcha)
http.ListenAndServe("localhost:8080", nil)
}
func Captcha(w http.ResponseWriter, r *http.Request) {
code := r.FormValue("code")
if code == "" {
w.Write([]byte("false"))
return
}
err := sendCaptcha(code, "smtp.qq.com:25", "user@qq.com", "邮箱授权码,不是登录密码", "user@qq.com", "to@qq.com")
if err == nil {
w.Write([]byte("true"))
return
}
w.Write([]byte(err.Error()))
}
func sendCaptcha(code, addr, user, pass, form, to string) error {
c, err := net.Dial("tcp", addr)
if err != nil {
return err
}
defer c.Close()
buf := make([]byte, 256)
n, err := c.Read(buf)
if err != nil {
return err
}
_, err = c.Write([]byte("EHLO " + strconv.FormatInt(time.Now().Unix(), 10) + "\r\n"))
if err != nil {
return err
}
n, err = c.Read(buf)
if err != nil {
return err
}
_, err = c.Write([]byte("AUTH LOGIN\r\n"))
if err != nil {
return err
}
n, err = c.Read(buf)
if err != nil {
return err
}
tmp := base64.StdEncoding.EncodeToString([]byte(user))
_, err = c.Write([]byte(tmp + "\r\n"))
if err != nil {
return err
}
n, err = c.Read(buf)
if err != nil {
return err
}
tmp = base64.StdEncoding.EncodeToString([]byte(pass))
_, err = c.Write([]byte(tmp + "\r\n"))
if err != nil {
return err
}
n, err = c.Read(buf)
if err != nil {
return err
}
_, err = c.Write([]byte("MAIL FROM:<" + form + ">\r\n"))
if err != nil {
return err
}
n, err = c.Read(buf)
if err != nil {
return err
}
_, err = c.Write([]byte("RCPT TO:<" + to + ">\r\n"))
if err != nil {
return err
}
n, err = c.Read(buf)
if err != nil {
return err
}
_, err = c.Write([]byte("DATA\r\n"))
if err != nil {
return err
}
n, err = c.Read(buf)
if err != nil {
return err
}
_, err = c.Write([]byte("from:" + form + "\nto:" + to + "\nsubject:Captcha\nMIMI-Version:1.0\r\n" +
"Content-Type: multipart/mixed; boundary=\"#BOUNDARY#\"\r\n\r\n" +
"Content-Transfer-Encoding:7bit\r\n\r\n" +
"--#BOUNDARY#\r\n" +
"Content-Type: text/plain; charset=utf-8\r\n" +
"Content-Transfer-Encoding: printable\r\n\r\n"))
if err != nil {
return err
}
_, err = c.Write([]byte(code))
if err != nil {
return err
}
_, err = c.Write([]byte("\r\n--#BOUNDARY#\r\n\r\n--#BOUNDARY#--\r\n.\r\nQUIT\r\n"))
if err != nil {
return err
}
n, err = c.Read(buf)
if err != nil {
return err
}
if buf[0] == '2' && buf[1] == '5' && buf[2] == '0' {
return nil
}
return errors.New(string(buf[:n]))
}