zoukankan      html  css  js  c++  java
  • 后台提供邮件发送验证码服务

    需求

    1. 我的博客需要增加登录验证码,想通过邮件发送验证码
    2. 希望提供一个http服务,其他服务和编程语言不必再写一个发邮件的方法

    实现

    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) + "
    "))
    	if err != nil {
    		return err
    	}
    	n, err = c.Read(buf)
    	if err != nil {
    		return err
    	}
    
    	_, err = c.Write([]byte("AUTH LOGIN
    "))
    	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 + "
    "))
    	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 + "
    "))
    	if err != nil {
    		return err
    	}
    	n, err = c.Read(buf)
    	if err != nil {
    		return err
    	}
    
    	_, err = c.Write([]byte("MAIL FROM:<" + form + ">
    "))
    	if err != nil {
    		return err
    	}
    	n, err = c.Read(buf)
    	if err != nil {
    		return err
    	}
    
    	_, err = c.Write([]byte("RCPT TO:<" + to + ">
    "))
    	if err != nil {
    		return err
    	}
    	n, err = c.Read(buf)
    	if err != nil {
    		return err
    	}
    
    	_, err = c.Write([]byte("DATA
    "))
    	if err != nil {
    		return err
    	}
    	n, err = c.Read(buf)
    	if err != nil {
    		return err
    	}
    
    	_, err = c.Write([]byte("from:" + form + "
    to:" + to + "
    subject:Captcha
    MIMI-Version:1.0
    " +
    		"Content-Type: multipart/mixed; boundary="#BOUNDARY#"
    
    " +
    		"Content-Transfer-Encoding:7bit
    
    " +
    		"--#BOUNDARY#
    " +
    		"Content-Type: text/plain; charset=utf-8
    " +
    		"Content-Transfer-Encoding: printable
    
    "))
    	if err != nil {
    		return err
    	}
    
    	_, err = c.Write([]byte(code))
    	if err != nil {
    		return err
    	}
    
    	_, err = c.Write([]byte("
    --#BOUNDARY#
    
    --#BOUNDARY#--
    .
    QUIT
    "))
    	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]))
    }
    

    用法

    1. 编译运行上述go代码
    2. 测试一下curl http://127.0.0.1:8080/Captcha?code=321

    总结

    1. 之所以没有使用go自带的smtp是因为新版本go需要用tls连接,当然网上一大堆方案,但是我这里只是实现简单的发送邮件验证码而已,没必要搞那么复杂
    2. 我的这个服务是不会对外提供的,只是提供localhost的服务,这样比较安全,当然有需要的可以自己改
    3. 这样我的后台服务就能通过简单http get发送一个验证码邮件
    4. 特别注意的是现在邮箱的smtp密码都是授权码,不是登录的密码了
  • 相关阅读:
    记一个微信公众号个性化菜单的坑
    初学c# -- 学习笔记(六) winfrom组件圆角
    Swift中添加标记(MARK)和警告(TODO FIXME)
    iOS Xib布局某些控件显示或隐藏<约束的修改>
    [!] Unable to satisfy the following requirements:
    React Native使用NetInfo对当前系统网络的判断
    iOS自定义下拉列表
    [!] The version of CocoaPods used to generate the lockfile (1.4.0.beta.1) is higher than the version of the current executable (1.3.0.beta.1). Incompatibility issues may arise.
    iOS实现TextField光标居中
    iOS优秀第三方框架
  • 原文地址:https://www.cnblogs.com/janbar/p/13698971.html
Copyright © 2011-2022 走看看