开启SMTP服务:

QQ邮箱参考下面连接:

QQ邮箱如何开通SMTP服务

https://jingyan.baidu.com/article/00a07f389eea7dc3d128dc36.html

发邮件测试

package test

import (
"core/define"
"crypto/tls"
"net/smtp"
"testing" "github.com/jordan-wright/email"
) func TestSendMail(t *testing.T) {
e := email.NewEmail() mailUserName := "whm2416@163.com" //邮箱账号
mailPassword := define.MailPassword //邮箱授权码
code := "12345678" //发送的验证码
Subject := "验证码发送测试" //发送的主题 e.From = "Get <whm2416@163.com>"
e.To = []string{"228654416@qq.com"}
e.Subject = Subject
e.HTML = []byte("你的验证码为:<h1>" + code + "</h1>")
err := e.SendWithTLS("smtp.163.com:465", smtp.PlainAuth("", mailUserName, mailPassword, "smtp.163.com"),
&tls.Config{InsecureSkipVerify: true, ServerName: "smtp.163.com"})
if err != nil {
t.Fatal(err)
}
} func TestSendMailQQ(t *testing.T) { mailUserName := "whm2416@qq.com" //邮箱账号
mailPassword := define.MailPassword //邮箱授权码
addr := "smtp.qq.com:465" //TLS地址
host := "smtp.qq.com" //邮件服务器地址
code := "12345678" //发送的验证码
Subject := "验证码发送测试" //发送的主题 e := email.NewEmail()
e.From = "Get <whm2416@qq.com>"
e.To = []string{"228654416@qq.com"}
e.Subject = Subject
e.HTML = []byte("你的验证码为:<h1>" + code + "</h1>")
err := e.SendWithTLS(addr, smtp.PlainAuth("", mailUserName, mailPassword, host),
&tls.Config{InsecureSkipVerify: true, ServerName: "smtp.qq.com"})
if err != nil {
t.Fatal(err)
}
}

效果:

业务实现

逻辑层:

func (l *MailCodeSendRegisterLogic) MailCodeSendRegister(req *types.MailCodeSendRequest) (resp *types.MailCodeSendReply, err error) {
// 该邮箱未被注册
cnt, err := models.Engine.Where("email = ?", req.Email).Count(new(models.UserBasic))
if err != nil {
return
}
if cnt > 0 {
err = errors.New("该邮箱已被注册")
return
}
// 获取验证码
code := helper.RandCode()
// 存储验证码
models.RDB.Set(l.ctx, req.Email, code, time.Second*time.Duration(define.CodeExpire))
// 发送验证码
err = helper.MailSendCode(req.Email, code)
return
}

封装包:

// MailSendCode
// 邮箱验证码发送
func MailSendCode(mail, code string) error {
e := email.NewEmail()
e.From = "Get <getcharzhaopan@163.com>"
e.To = []string{"getcharzp@qq.com"}
e.Subject = "验证码发送测试"
e.HTML = []byte("你的验证码为:<h1>" + code + "</h1>")
err := e.SendWithTLS("smtp.163.com:465", smtp.PlainAuth("", "getcharzhaopan@163.com", define.MailPassword, "smtp.163.com"),
&tls.Config{InsecureSkipVerify: true, ServerName: "smtp.163.com"})
if err != nil {
return err
}
return nil
} func RandCode() string {
s := "1234567890"
code := ""
rand.Seed(time.Now().UnixNano())
for i := 0; i < define.CodeLength; i++ {
code += string(s[rand.Intn(len(s))])
}
return code
}

go实现发送邮件验证码的更多相关文章

  1. node.js 模拟自动发送邮件验证码

    node.js 模拟自动发送邮件验证码 引言 正文 1. QQ邮箱设置 2. 安装nodemailer 3.配置信息 4.综合 5.讲解 结束语 引言 先点赞,再看博客,顺手可以点个关注. 微信公众号 ...

  2. aspx页面调用发送邮件验证码(结合前两篇)

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default3.aspx.cs ...

  3. C# Winfrom 发送邮件验证码&Timer控件

    邮件发送: //定义一个全局的string类型的验证码: string yzm = ""; //定义一个字符串,这里面包含所有需要的验证码的元素: string a = " ...

  4. .net 发送邮件验证码

    using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Net.Ma ...

  5. Thinkphp3.2版本使用163邮箱发(验证码)邮件

    今天忽然想写一个用户修改密码的功能,又没有短信接口,只能选择用邮箱发送验证码啦,穷啊,没办法,哈哈,以下为正文. ------------------------------------------- ...

  6. 发送邮箱验证码、session校验

    本篇主要描述“发送邮箱验证码.session校验”相关前(html\js)后(java)台代码,业务逻辑示例,闲话少诉,直接上代码. 1.引入的jar包是mail-1.4.jar 2.java底层发送 ...

  7. C# WinForm 使用SMTP协议发送QQ邮箱验证码

    文章来自:https://blog.csdn.net/IT_xiao_guang_guang/article/details/104336604 前言   在程序设计中,发送验证码是常见的一个功能,用 ...

  8. 使用shell发送邮件,方便快捷

    目录 前言 鉴赏代码 总结 前言 很多时候我们需要发送邮件,比如定时任务,比如邮件验证码等等. 各大编程语言都可以实现发送邮件功能,但还是太麻烦了,所以通过tcpdump抓包发现smtp发送邮件原理还 ...

  9. 6、发送验证码功能(Redis)

    一.业务需求: 1.后端随机生成短信验证码,并在服务器端保存一定时间(redis): 2.将短信验证码发给用户: 3.用户输入短信验证码提交后,在后端与之前生成的短信验证码作比较,如果相同说明验证成功 ...

  10. Java/Kotlin 使用Redis模拟发送验证码

    原文地址: Java/Kotlin 使用Redis模拟发送邮件验证码 - Stars-One的杂货小窝 Java中常用语连接Redis的库有lettuce和jredis,一般是推荐lettuce,其具 ...

随机推荐

  1. RepPointsV2:更多的监督任务,更强的性能 | NIPS 2020

    RepPointsV2的整体思想类似与Mask R-CNN,加入更多的任务来监督目标检测算法的学习.虽然在创新性上可能不够新颖,但论文的通用性还是很不错的,而且将角点任务的输出用于联合推理,从对比实验 ...

  2. archlinux xfce 修改用户主目录名称

    操作有风险,修改用户主目录名称后一些链接了旧主目录的的链接可能仍未修改.导致链接用不了,需要手动指定链接 1.删除指定用户保存的会话,未删除应该会导致修改用户主目录名称后进不去会话 2.切换到其它用户 ...

  3. vim-plus install

    1.输入:git clone https://github.com/chxuan/vimplus.git ~/.vimplus 2.输入:cd ~/.vimplus 3.输入:./install.sh ...

  4. 汇编语言-int指令

    int 指令 int 指令的格式为:int n,n为中断类型码,它的功能是引发终端过程. CPU执行int n指令,相当于引发一个n号中断的中断过程,执行过程如下. 取中断类型码n: 标志寄存器入栈, ...

  5. #树形依赖背包,点分治#BZOJ 4182 Shopping

    题目 给定一棵大小为 \(n\) 的树,每个点代表一种物品,其具有体积.价值和数量的属性, 现在选择一个连通块,使得里面所有点都被选中且体积不超过 \(m\),问最大价值. \(n\leq 500,m ...

  6. #高斯消元,概率期望,动态规划#洛谷 3211 [HNOI2011]XOR和路径

    题目 分析 由于不同二进制位互不影响,所以考虑按位处理 设\(dp[i]\)表示第\(i\)个点某一位为1的概率,那么 \[dp[i]=\frac{1}{deg[i]}(\sum_{(i,u)=0}d ...

  7. JDK 14的新特性:switch表达式

    目录 简介 写在前面 连写case switch返回值 yield 总结 简介 switch的新特性可是源远流长,早在JDK 12就以预览功能被引入了,最终在JDK 14成为了正式版本的功能:JEP ...

  8. Java 构造函数与修饰符详解:初始化对象与控制权限

    Java 构造函数 Java 构造函数 是一种特殊的类方法,用于在创建对象时初始化对象的属性.它与类名相同,并且没有返回值类型. 构造函数的作用: 为对象的属性设置初始值 执行必要的初始化操作 提供创 ...

  9. 1. Vectors and Linear Combinations

    1.1 Vectors We have n separate numbers \(v_1.v_2.v_3,...,v_n\),that produces a n-dimensional vector ...

  10. 深入了解图片Base64编码

    title: 深入了解图片Base64编码 date: 2024/4/8 10:03:22 updated: 2024/4/8 10:03:22 tags: Base64编码 图片转换 HTTP请求 ...