开启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. 无法进去wordpress后台,也不能修改密码怎么办?wordpress无需下载插件修改代码配置SMTP发送邮件(网易邮箱)

    (解决不能进入wordpress后台,忘记密码,找回密码时提示站点邮件配置失败的问题,配置好之后即可通过邮件重置wordpress密码) 使用ssh工具远程连接自己的服务器(Xshell或者服务器自带 ...

  2. python整理1992、2009国家标准学科分类及代码数据并存入MySQL数据库

    文件内容 处理结果 代码 1 import pandas as pd 2 import pymysql 3 4 5 def get_subject_1992(): 6 res={} 7 the_for ...

  3. vue前后端分离项目,使用宝塔面板解决跨域问题,设置Nginx反向代理

    开发环境解决跨域问题: 使用教程 跨域解决本地跨域问题 非唯一方法 生成环境解决跨域问题: 1.创建站点 2.把打包的vue项目dist发送解压到站点里面 ,选择静态模式 3.然后设置反向代理 目标u ...

  4. 【直播回顾】战码先锋第五期:深入理解OpenHarmony系统启动,轻松踏上设备软件开发之旅

    6月14日晚上19点,战"码"先锋第五期直播 <深入理解OpenHarmony系统启动,轻松踏上设备软件开发之旅> ,在OpenHarmony社群内成功举行.   本期 ...

  5. winrt新dx截图最小实现

    转自:https://stackoverflow.co/questions/11283015 效果还是很不错的 #include <iostream> #include <Windo ...

  6. 深入理解 Java 方法重载与递归应用

    Java 方法重载 方法重载 允许在同一个类中定义多个具有相同名称的方法,但 参数列表 必须不同. 语法: returnType methodName(parameter1, parameter2, ...

  7. openGauss升级脚本撰写

    概述 重要提示: 升级过程通过执行升级 sql 脚本实现系统表变更,这些脚本必须由开发人员在修改系统表的同时一并提供升级 sql 脚本,请将这些脚本代码提交至 openGauss-server/src ...

  8. openGauss共享存储对接Ceph-单机openGauss-Ceph zhangxb2023-02-18

    openGauss + DSS + Ceph 部署操作步骤 本文档介绍单机版 openGauss+DSS+Ceph 集群部署方式.后续提供主备下的步骤. 服务器: Hostname IP 系统 规格 ...

  9. 第十八篇:Django进级

    一.Django工程创建 二.Django 的 CBV和FBV 三.模板语言循环字典 四.Django基于正则表达式的URL 五.Django对应的路由名称 六.Django路由分发 七.Django ...

  10. unity 3d导出安卓包时报错:A failure occurred while executing com.android.build.gradle.internal.tasks.workers$actionfacade see the console for details

    unity 3d导出安卓包时报错:A failure occurred while executing com.android.build.gradle.internal.tasks.workers$ ...