一、需求
开发项目中很多场景需要使用邮箱发送验证码 和手机发送验证码功能。
二、代码功能
(0) 引入pom.xml依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.16</version>
</dependency>
<!--使用邮箱服务 -->
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
(1)UserController
package com.beiyou.controller;
import com.beiyou.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/user")
public class UserController {
@Autowired
private UserService userService;
/** 发送邮箱验证码 */
@GetMapping("/send/code")
public Integer sendCode(String email) {
return userService.sendCode(email);
}
/**发送手机验证码 */
@GetMapping("/send/tel/code")
public Integer sendTelCode(String tel){
return userService.sendTelCode(tel);
}
}
(2) UserService
package com.beiyou.service;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.extra.mail.MailAccount;
import cn.hutool.extra.mail.MailUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.smart.core.exception.BizException;
import com.beiyou.dao.UserDao;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
@Service
@Slf4j
public class UserService {
@Autowired
private UserDao userDao;
/**
* 目前暂时将发送的邮箱和验证码存到map中 真正做项目是存到redis里
*/
private static HashMap<String,Integer> emailMap=new HashMap();
/**
* 发送邮箱验证码
*/
public Integer sendCode(String email) {
/**定义四位随机数 */
int code = RandomUtil.randomInt(1000, 10000);
/**这个对象记录了邮箱服务器的记录的信息 */
MailAccount mailAccount = new MailAccount();
/** smtp 表示协议 aliyun 表示邮箱类型,可以换成qq等 */
mailAccount.setHost("smtp.aliyun.com");
/** 默认端口为25 */
mailAccount.setPort(25);
/**
* setAuth(boolean auth) 方法用于设置是否在进行邮件发送或接收时进行身份验证。
* 当设置为 true 时,表示需要进行身份验证,这通常意味着在连接邮件服务器时会使用提供的用户名和密码进行登录。
*/
mailAccount.setAuth(true);
/** 用户设置发送人的地址*/
mailAccount.setUser("814736551@aliyun.com");
/** 用户设置发送人的地址*/
mailAccount.setFrom("814736551@aliyun.com");
/** 用户设置发送人的密码*/
mailAccount.setPass("Huang814736551");
MailUtil.send(mailAccount,email,"WMS系统验证码","验证码:"+code,false);
emailMap.put(email,code);
log.info("发送验证码成功");
return 0;
}
/**
* 发送手机验证码
* @return
*/
public Integer sendTelCode(String tel) {
/**定义四位随机数 */
int code = RandomUtil.randomInt(1000, 10000);
String url = "https://dfsns.market.alicloudapi.com/data/send_sms";
/**阿里云短信接口 自己掏钱买别用我的 */
String appcode="8f8646c611914b5084c405a2671ddf49";
emailMap.put(tel,code);
String result = HttpRequest.post(url)
/**头信息 APPCODE必须要有一个空格 */
.header("Authorization", "APPCODE " + appcode)
.body("content=code:" + code + "&template_id=TPL_0000&phone_number=" + tel)
.execute().body();
JSONObject object = JSONUtil.parseObj(result);
if(!object.get("status").equals("OK")){
log.error("发送验证码错误:{}",object.get("reason"));
throw new BizException(404,"发送验证码错误");
}
return 0;
}
}
三、打开接口调试工具进行调试
3.1 调试邮箱
- 打开阿里云邮箱查看是否发送验证码
3.2 调试手机验证码