当前位置: 首页 > wzjs >正文

武汉外贸网站制作关键词查询的分析网站

武汉外贸网站制作,关键词查询的分析网站,wordpress音乐主题pulse,镇江网站建设多少钱一.需求 需要实现通过飞书邮件服务API发送邮件验证码功能:用户输入邮箱, 点击发送邮件,然后发送邮件验证码, 这里验证码有过期时间, 保存到redis缓存中 二.实现 实现的部分代码如下: 控制器部分代码 // 发送邮件控制器 func EmailSendController(userId uint64, m proto.Messa…

一.需求

需要实现通过飞书邮件服务API发送邮件验证码功能:用户输入邮箱, 点击发送邮件,然后发送邮件验证码, 这里验证码有过期时间, 保存到redis缓存中

二.实现

实现的部分代码如下:

控制器部分代码

// 发送邮件控制器
func EmailSendController(userId uint64, m proto.Message, ctx *gin.Context) (proto.Message, error) {var err errorres := CommonRes(ctx)// 获取请求,将请求转换为具体的类型req, ok := m.(*common.SendEmailCodeReq)if !ok {res.ErrCode = uint64(CodeInvalidRequestType)res.ErrDesc = CodeMap[CodeInvalidRequestType]return res, err}if req.Email == "" {res.ErrCode = uint64(CodeReqDataNotEmpty)res.ErrDesc = CodeMap[CodeReqDataNotEmpty]return res, err}// 实例化飞书结构体emailSender, err := mailer.NewFeishuEmailSender()if err != nil {return res, err}// 发送邮件err = emailSender.SendEmail(req.Email)if err != nil {return res, err}return res, nil
}

 mailer包下feishuEmail.go部分代码

package mailerimport ("bytes""encoding/json""fmt""redisCore""net/http"
)var redisClient redisCore.RedisCoreconst (appID     = "your_app_id"     // 替换为您的飞书应用 IDappSecret = "your_app_secret" // 替换为您的飞书应用 Secret
)// EmailSender 用于发送邮件的结构体
type EmailSender struct {AccessToken string
}// NewEmailSender 创建一个新的 EmailSender 实例
func NewFeishuEmailSender() (*EmailSender, error) {token, err := getAccessToken()if err != nil {return nil, NewError(uint64(CodeSendMsgAccessTokenCheckError), fmt.Errorf("%s: %s", CodeMap[CodeSendMsgAccessTokenCheckError], err.Error()))}return &EmailSender{AccessToken: token}, nil
}// getAccessToken 获取飞书 API 访问令牌
func getAccessToken() (string, error) {url := "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal/"payload := map[string]string{"app_id":     appID,"app_secret": appSecret,}data, err := json.Marshal(payload)if err != nil {return "", err}resp, err := http.Post(url, "application/json", bytes.NewBuffer(data))if err != nil {return "", err}defer resp.Body.Close()if resp.StatusCode != http.StatusOK {return "", fmt.Errorf("获取访问令牌失败: %s", resp.Status)}var result map[string]interface{}if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {return "", err}accessToken, ok := result["tenant_access_token"].(string)if !ok {return "", fmt.Errorf("未找到访问令牌")}return accessToken, nil
}// SendEmail 发送邮件
func (es *EmailSender) SendEmail(email string) error {code := GetRandomNum()  // 验证码url := "https://open.feishu.cn/open-apis/email/v1/send/"emailData := map[string]interface{}{"email":      email,"subject":    "您的验证码","content":    fmt.Sprintf("您的验证码是: %s", code),"from_email": "system@test.com", // 替换为您的发件邮箱}data, err := json.Marshal(emailData)if err != nil {return NewError(uint64(CodeSendMsgCheckError), fmt.Errorf("%s: json转换错误: %s", CodeMap[CodeSendMsgCheckError], err.Error()))}req, err := http.NewRequest(http.MethodPost, url, bytes.NewBuffer(data))if err != nil {return NewError(uint64(CodeSendMsgCheckError), fmt.Errorf("%s: 发送请求错误: %s", CodeMap[CodeSendMsgCheckError], err.Error()))}req.Header.Set("Authorization", "Bearer "+es.AccessToken)req.Header.Set("Content-Type", "application/json")client := &http.Client{}resp, err := client.Do(req)if err != nil {return NewError(uint64(CodeSendMsgCheckError), fmt.Errorf("%s: 发送响应错误: %s", CodeMap[CodeSendMsgCheckError], err.Error()))}defer resp.Body.Close()if resp.StatusCode != http.StatusOK {return NewError(uint64(CodeSendMsgCheckError), fmt.Errorf("%s: 发送邮件失败: %s", CodeMap[CodeSendMsgCheckError], resp.Status))}// 将验证码保存到 Redis,有效期 5 分钟err = redisClient.SaveEmailCode(email, code)if err != nil {return NewError(uint64(CodeSendMsgCheckError), fmt.Errorf("%s: 保存验证码到redis错误: %s", CodeMap[CodeSendMsgCheckError], err.Error()))}return nil
}

redis部分代码


type RedisCore struct {
}var RedisClient *redis.Client// 保存数据到redis
func SetEx(key string, value interface{}, expiration time.Duration) error {err := RedisClient.SetEx(ctxRedis, key, value, expiration).Err()if err != nil {return err}return nil
}// 保存邮件验证码
func (RedisCore) SaveEmailCode(email, code string) error {// 获取邮件验证码keysendEmailTokenKey := pkg.SEND_EMAIL_KEY_PREFIX + ":" + emailerr := SetEx(sendEmailTokenKey, code, 60*time.Second)if err != nil {return err}return nil
}

其他公共方法代码

// 生成随机数
func GetRandomNum() string {var str stringfor i := 0; i < 4; i++ {current := rand.Intn(10)str += strconv.Itoa(current)}return str
}// 自定义错误
func NewError(errCode uint64, err error) error {return New(int32(errCode), err.Error())
}func New(code int32, reason string) error {return &MyError{Code: code, Reason: reason}
}type MyError struct {Code   int32Reason string 
}

好了, 发送邮件操作完成了,上面还有可优化的空间: 比如: 把飞书相关的配置以及邮件模块等放到yml文件中, 通过从yml获取配置信息

http://www.dtcms.com/wzjs/46520.html

相关文章:

  • 兴化网站建设竞价托管是啥意思
  • 忻州集团网站建设windows优化大师的作用
  • 小程序免费制作网站2345网址导航浏览器下载
  • 培训校园网站建设简报网络推广员是干嘛的
  • bl做h视频网站长沙seo网络公司
  • 新手学做网站vs餐饮最有效的营销方案
  • 外贸网站建设.cover如何制作一个网页网站
  • wordpress添加rssseo优化多久能上排名
  • 深圳网站建设找哪家好天津seo博客
  • 青岛市住房和城乡建设局官方网站志鸿优化网官网
  • 网站模版 源码之家优化设计数学
  • 青浦网站建设公司长春百度推广电话
  • 网站建设罒金手指下拉壹陆推广项目
  • 山东省建设备案在哪个网站东莞网站制作公司联系方式
  • 公司网站建设佛山哪家好重庆森林电影高清在线观看
  • 建一个所在区域网站需要多少资金优化大师怎么卸载
  • 网站建设相关技术自媒体人15种赚钱方法
  • 做cpa网站竞价排名软件
  • 普陀区建设局网站优化推广方案
  • 南宁网站建设服务建立网站的主要步骤
  • 网站制作 成功案例买转发链接
  • 2b的网站运营怎么做个人网页生成器
  • 小贷网站需要多少钱可以做中国工商业联合会
  • 自己做网站怎么修改语言班级优化大师下载
  • 免费网站技术站长统计app下载
  • 贸易公司做网站有优势吗河南网站排名优化
  • 带数据库的网站模板下载爱链接网如何使用
  • 自己做网站编程福州网络营销推广公司
  • 做公司网站流程站长收录
  • 网站开发及app开发报价单营销渠道策略