开启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. KingbaseES date 数据类型的两种格式

    关于date 数据类型,Oracle 与 PostgreSQL 格式是不同的,Oracle 是 日期 + 时间的类型,而PG 则只有日期.KingbaseES Oracle 模式则同时实现了二者类型, ...

  2. 【已解决】git push send-pack: unexpected disconnect while reading sideband packet

    解决办法:修改缓存大小 打开项目所在路径下的git目录 找到config文件,用记事本打开编辑. 添加如下内容并保存即可 [http] postBuffer = 1048576000

  3. 【已解决】Windows环境下redis启动失败

    在redis安装目录下打开cmd窗口: 依次输入: redis-cli.exe shutdown exit redis-server.exe redis.windows.conf ps:启动失败可能是 ...

  4. 掌握 C++ 编译过程:面试中常见问题解析

    C++是一种高级编程语言,但是计算机并不能直接理解它.因此,需要将C++代码翻译成计算机可以理解的机器语言.这个过程就是编译过程,是C++程序从源代码到可执行文件的转换过程,包括预处理.编译.汇编和链 ...

  5. 自动编号工具类:NumAutoUtils详解

    在软件开发中,经常需要生成唯一的编号,例如订单号.发票号.实验编号等.为了简化这一过程,本文将介绍一个Java工具类NumAutoUtils,它可以帮助我们生成带有前缀和日期的自动编号. 概述 Num ...

  6. 生成 MFC ActiveX (OCX)时,报错:MSB801:未能注册输出

    我们在生成 ocx 控件时,报错:MSB801:未能注册输出,如下图: 解决方法: 1.打开 项目属性 -> 链接器 -> 常规  :  逐用户重定向 改为  是 2. 重新生成 如果此时 ...

  7. Mac OS 中JDK 环境(jdk 1.8.0_831)安装配置、环境变量配置及卸载操作

    前言: 摊牌了,本来就有点喜新厌旧的我,特意把系统和开发环境都拉到比较高,想试验一下兼容性和某些新特性,探索了一下新大陆,也见识了各种光怪陆离的妖魔鬼怪. 因为要着手云平台项目的重构改版和新系统的架构 ...

  8. 第 6章 Python 应对反爬虫策略

    第 6章 Python 应对反爬虫策略 爬取一个网站的基本步骤 (1)分析请求:URL 规则.请求头规则.请求参数规则. (2)模拟请求:通过 Requests 库或 urllib 库来模拟请求. ( ...

  9. 龙湖千丁基于 ACK@Edge 的云原生智慧停车系统架构实践

    简介: 结合龙湖千丁自研的新版停车云系统以及 ACK@Edge 提供的标准 Kubernetes 服务以及云边一体化协同解决方案,整体来着,边缘部署时间成本由 1 天缩短到 3 小时,将之前的手动升级 ...

  10. 迁移 Nacos 和 ZooKeeper,有了新工具

    简介: 注册中心迁移在行业中主要有两个方案,一个是双注册双订阅模式(类似数据库双写),一个是 Sync 模式(类似于数据库 DTS):MSE 同时支持了两种模式,对于开通 MSE 服务治理客户,MSE ...