邮件发送
温馨提示:这篇文章已超过847天没有更新,请注意相关的内容是否还可用!
发送邮件的过程
(图片来源网络,侵删)
(图片来源网络,侵删)
1、添加依赖,说明:添加完依赖以后记得刷新dependency,防止没有及时更新
!--发送邮件--><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-mailartifactId>dependency>
2、在application.xml中配置邮件信息(和application同级)
说明:对应的邮件服务器如网易邮箱要开启POP3 / SMTP服务
mail:host: smtp.163.comusername: merlinssea@163.compassword: PIJCHLGOSQAPDVFNfrom: merlinssea@163.comproperties.mail.smtp.starttls.enable: trueproperties.mail.smtp.starttls.required: trueproperties.mail.smtp.ssl.enable: truedefault-encoding: utf-8
3、编写业务类MailServicceImpl
public class MailServiceImpl implements MailService {/*** springboot 提供的一个发送邮件的简单抽象,直接注入即可*/private JavaMailSender mailSender;/*** 从application.yml中读取 merlinssea@163.com*/("${spring.mail.from}")private String from;/*** 发送邮件* @param to 收件人* @param subject 主题* @param content 内容*/public void sendMail(String to, String subject, String content) {//创建一个邮箱消息对象SimpleMailMessage message = new SimpleMailMessage();//配置邮箱发送人message.setFrom(from);//邮件的收件人message.setTo(to);//邮件的主题message.setSubject(subject);//邮件的内容message.setText(content);mailSender.send(message);log.info("邮件发送成功:{}",message.toString());}}
4、编写NotifyServiceImpl类,只负责发送邮件验证码服务器 发邮件服务器 发邮件,如果上一次发送的验证码在60s内,那么就是重复发送,拒绝本次发送。方法:value拼接时间戳
public class NotifyServiceImpl implements NotifyService {private MailService mailService;private RedisTemplate redisTemplate;/*** 验证码的标题*/private static final String SUBJECT= "lianglin 验证码";/*** 验证码的内容*/private static final String CONTENT= "您的验证码是%s,有效时间是60秒";/*** 如果用户重复发送验证码,那么先判别之前60s没是否发送过验证码,发送过则拒绝发送,否则发送* 方法:在把验证码存入redis之前拼接时间戳 即:code_时间戳* @param sendCodeEnum* @param to* @return*/public JsonData sendCode(SendCodeEnum sendCodeEnum, String to) {String cacheKey = String.format(CacheKey.CHECK_CODE_KEY,sendCodeEnum.name(),to);String cacheValue = (String) redisTemplate.opsForValue().get(cacheKey);//如果不为空,则判断是否60秒内重复发送if(StringUtils.isNotBlank(cacheValue)){long ttl = Long.parseLong(cacheValue.split("_")[1]);//当前时间戳-验证码发送时间戳,如果小于60秒,则不给重复发送if(CommonUtil.getCurrentTimestamp() - ttl < 1000*60){log.info("重复发送验证码,时间间隔:{} 秒",(CommonUtil.getCurrentTimestamp()-ttl)/1000);return JsonData.buildResult(BizCodeEnum.CODE_LIMITED);}}String code = CommonUtil.getRandomCode(6);//通过对value拼接时间戳的f方法,可以避免在小范围时间内重复发送String value = code+"_"+CommonUtil.getCurrentTimestamp();if(CheckUtil.isEmail(to)){/*** 这里的code是自己生成的,和之前的图形验证码无关,只有图形验证码通过了,才会调用这个验证码*///后续这个code验证码还得存redis中mailService.sendMail(to,SUBJECT, String.format(CONTENT, value));return JsonData.buildSuccess();}else if(CheckUtil.isPhone(to)){//手机号发送手机验证码//TODO}return JsonData.buildResult(BizCodeEnum.CODE_TO_ERROR);}}
3、编写NotifyController对外api接口[通过第一步可以提高被薅羊毛的成本]
1、先匹配用户发来的图形验证码和redis中存的图形验证码是否一致
2、再调用发送邮件验证码服务
/*** 发送邮箱验证码* 1、首先匹配图形验证码是否正常* 2、再发送邮箱验证码** @param to 接收方邮箱* @param captcha 接收方输入的图形验证码* @param request* @return*/public JsonData sendRegisterCode( String to,String captcha,HttpServletRequest request) {String cacheKey = getCaptchaKey(request);//根据用户的request获取缓存keyString cacheCaptcha = redisTemplate.opsForValue().get(cacheKey);if (captcha != null && cacheCaptcha != null && captcha.equalsIgnoreCase(cacheCaptcha)) {//图形验证码通过,发送邮件redisTemplate.delete(cacheKey);JsonData jsonData = notifyService.sendCode(SendCodeEnum.USER_REGISTER, to);return jsonData;} else {//图形验证码没通过return JsonData.buildResult(BizCodeEnum.CODE_CAPTCHA_ERROR);}}
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

