登录功能中发送邮箱验证的简单使用

java开发中常用的邮箱相关的就是给邮箱发送验证码,发送验证码在java中使用javamail,它提供了一套发送和接收功能的标准,支持协议:smtp,pop3,imap。其中smtp负责发送邮件,pop3负责接收邮件


文章目录

  • 登录功能中发送邮箱验证的简单使用
  • 邮箱发送流程
  • 邮箱发送前的准备
  • 在代码中使用
    • 添加javamail的依赖
    • 配置javaMailSender
    • 编写代码发送邮件
      • 发送普通邮件
      • 发送邮件携带本地附件
      • 发送邮件之html格式
      • 发送邮件之内联格式
      • 发送html网页

邮箱发送流程

邮箱发送前的准备

以163邮箱为例

  • 进入邮箱设置

  • 勾选设置开启邮箱收发

  • 设置授权码并记录下来

在代码中使用

注意:发送邮件是个耗时的操作,建议使用异步任务

添加javamail的依赖

需要导入这两个包的依赖

<!-- 发送邮件需要--><dependency><groupId>com.sun.mail</groupId><artifactId>javax.mail</artifactId><version>1.6.2</version></dependency><!--发邮箱需要的支持包--><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>5.1.9.RELEASE</version></dependency>

配置javaMailSender

  • xml配置文件的方式
<bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"><!-- 用户名 发送邮件的邮箱 --><property name="username" value="xinbgongyishao@163.com"/><!-- 授权码 --><property name="password" value="xxxx"/><!-- smtp服务器地址 --><property name="host" value="smtp.163.com"/><property name="javaMailProperties"><props><!-- 设置认证开关 --><prop key="mail.smtp.auth">true</prop><!-- 启动调试开关 --><prop key="mail.debug">true</prop><!-- 设置发送延时 --><prop key="mail.smtp.timeout">0</prop></props></property></bean>
  • 注解配置类的方式
//配置的属性与xml的方式一样@Beanpublic JavaMailSender javaMailSender(){JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();javaMailSender.setHost("smtp.163.com");javaMailSender.setUsername("xinbgongyishao@163.com");javaMailSender.setPassword("xxxx");return javaMailSender;}

编写代码发送邮件

发送普通邮件
//容器中拿到javaMailSender@Autowiredprivate JavaMailSender javaMailSender;public void sendSimpleEmail(String to,String subject,String content){//实例化simpleMailMessage SimpleMailMessage simpleMailMessage = new SimpleMailMessage();//设置发送邮件的邮箱 这个格式发件人显示的是阿飞后台并不是直接显示邮箱号simpleMailMessage.setFrom("阿飞后台<xingongyishao@163.com>");//发送到哪里simpleMailMessage.setTo(to);//主题simpleMailMessage.setSubject(subject);//发送邮件的具体内容simpleMailMessage.setText(content);//发送邮件javaMailSender.send(simpleMailMessage);}
发送邮件携带本地附件
public  void  sendMail1(@RequestPart Part file,String to,String subject,String text) {//获取mimeMessage MimeMessage mimeMessage = javaMailSender.createMimeMessage();//获取MimeMessageHelper 参数一:mimeMessage 参数二:multipart =true 参数三:指定字符编码utf-8MimeMessageHelper helper  = new MimeMessageHelper(mimeMessage,true,"utf-8");//设置发送邮件的邮箱helper.setFrom("阿飞后台<xingongyishao@163.com>");//发送到哪里helper.setTo(to);//主题helper.setSubject(subject);//发送邮件的具体内容helper.setText(text);//前端传参中的part获取文件流InputStream inputStream = file.getInputStream();byte[] buffer  = new byte[inputStream.available()];//获取文件流的byte数组inputStream.read(buffer);//参数一:文件名 ,参数二:ByteArrayResource可以传入一个byte数组helper.addAttachment(file.getSubmittedFileName(),new ByteArrayResource(buffer));//发送邮件javaMailSender.send(mimeMessage);}

注意:Post请求提交表单乱码需要使用filter解决乱码问题

发送邮件之html格式
public  void  sendMail1(String to,String subject) {//获取mimeMessage MimeMessage mimeMessage = javaMailSender.createMimeMessage();// 没有附件 构造方法第二个参数可以写false  也可以不写MimeMessageHelper helper  = new MimeMessageHelper(mimeMessage,true,"utf-8");//设置发送邮件的邮箱helper.setFrom("阿飞后台<xingongyishao@163.com>");//发送到哪里helper.setTo(to);//主题helper.setSubject(subject);//第二个参数为true表示这是一个htmlhelper.setText("<h1>这是一级标签</h1>",true);//发送邮件javaMailSender.send(mimeMessage);}
发送邮件之内联格式
public  void  sendMail1(String to,String subject) {//获取mimeMessage MimeMessage mimeMessage = javaMailSender.createMimeMessage();// 没有附件 构造方法第二个参数可以写false  也可以不写MimeMessageHelper helper  = new MimeMessageHelper(mimeMessage,true,"utf-8");//设置发送邮件的邮箱helper.setFrom("阿飞后台<xingongyishao@163.com>");//发送到哪里helper.setTo(to);//主题helper.setSubject(subject);//第二个参数为true表示这是一个htmlhelper.setText(" <html><body><h1>这是一级标签</h1><img src='cid:imageUrl'></body></html>",true);//给标签中的图片指定路径helper.addInline("imageUrl",new File("C:\\Users\\JAVASM\\Desktop\\photo1.png"));//发送邮件javaMailSender.send(mimeMessage);}
发送html网页

如果以上面的方式全在代码里面写html格式的字符串太不优雅了,所以我们需要用到spring的模板引擎来发送html页面

  • 添加依赖
        <dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.23</version></dependency>
  • 配置FreeMarkerConfigurer (xml配置文件一样)
@Beanpublic FreeMarkerConfigurer freeMarkerConfigurer(){FreeMarkerConfigurer freeMarkerConfigurer = new FreeMarkerConfigurer();//指定模板目录freeMarkerConfigurer.setTemplateLoaderPath("/WEB-INF/ftl/");//字符编码utf-8freeMarkerConfigurer.setDefaultEncoding("utf-8");return freeMarkerConfigurer;}
  • 在指定的位置放入模板(后缀名是.ftl)
  • 文件中的内容(防steam)
    文件中需要变化的值例如用户名,时间等,使用${属性名}取值
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<table width="780" border="0" cellspacing="0" cellpadding="0" class="m-shell"><tbody><tr><td class="td" bgcolor="#2c323b" style="width:780px; min-width:780px; font-size:0pt; line-height:0pt; padding:0; margin:0; font-weight:normal;"><table width="100%" border="0" cellspacing="0" cellpadding="0"><tbody><tr><td class="pt-80 px-85 mpt-40 mpx-20" style="padding-top: 80px; padding-left: 85px; padding-right: 85px;"><table width="100%" border="0" cellspacing="0" cellpadding="0"><tbody><tr><td class="img pb-25" style="font-size:0pt; line-height:0pt; text-align:left; padding-bottom: 25px;"><a href="javascript:void(0)" ><img src="https://cdn.akamai.steamstatic.com/store/email/general/logo.png" width="88" height="88" border="0"></a></td></tr></tbody></table></td></tr><tr><td class="px-85 mpt-40 mpx-20" style="padding-left: 85px; padding-right: 85px;"><table width="100%" border="0" cellspacing="0" cellpadding="0"><tbody><tr><td class="title-30 lh-130p c-white mfz-24 pb-55 pr-100 mpr-0 mpb-30" style="font-size:30px; font-family:Arial, sans-serif, 'Motiva Sans'; text-align:left; font-weight:normal; min-width:auto !important; line-height:130%; color:#ffffff; padding-bottom: 55px; padding-right: 100px;"><strong>欢迎使用阿飞后台管理系统!                                                                                                            </strong></td></tr><tr><td class="pb-60 mpb-40" style="padding-bottom: 60px;"><table width="100%" border="0" cellspacing="0" cellpadding="0"><tbody><tr><td class="fluid-img pb-10" style="font-size:0pt; line-height:0pt; text-align:left; padding-bottom: 10px;"><a href="javascript:java(0)" ><img src="https://cdn.akamai.steamstatic.com/steam/apps/413150/capsule_616x353.jpg?t=1608624324" width="610" height="348" border="0" title="Stardew Valley"></a></td></tr><tr><td class="pb-20" style="padding-bottom: 20px;"><table width="100%" border="0" cellspacing="0" cellpadding="0" dir="rtl" style="direction:rtl;"><tbody><tr><th class="column-dir-top" width="220" style="font-size:0pt; line-height:0pt; padding:0; margin:0; font-weight:normal; direction:ltr; vertical-align:top;"></th><th class="column mpb-10" width="25" style="font-size:0pt; line-height:0pt; padding:0; margin:0; font-weight:normal;"></th></tr></tbody></table></td></tr><tr><td class="text-18 lh-140p c-lgrey mfz-16 pr-10 mpr-0" style="font-size:18px; font-family:Arial, sans-serif, 'Motiva Sans'; text-align:left; min-width:auto !important; line-height:140%; color:#dedee1; padding-right: 10px;">欢迎尊敬的<strong>${employeeName}</strong> ,点击下方按钮进行激活!                      </td></tr></tbody></table></td></tr><tr><td class="px-30 pb-90 mpb-50" align="center" style="padding-left: 30px; padding-right: 30px; padding-bottom: 90px;"><table width="325" border="0" cellspacing="0" cellpadding="0" class="mw-100p"><tbody><tr><td><table width="100%" border="0" cellspacing="0" cellpadding="0" style="border-radius: 5px; background: #3a9bed; background: -moz-linear-gradient(left, #3a9bed 0%, #2f7edf 50%, #235ecf 100%); background: -webkit-linear-gradient(left, #3a9bed 0%,#2f7edf 50%,#235ecf 100%); background: linear-gradient(to right, #3a9bed 0%,#2f7edf 50%,#235ecf 100%);"><tbody><tr><td class="btn-18 l-white mfz-14 mlh-18" style="font-size:18px; line-height:22px; mso-padding-alt:13px 10px; color:#000001; font-family:Arial, sans-serif, 'Motiva Sans'; text-align:center; min-width:auto !important;"><a href="${activateUrl}" target="_blank" class="link c-white" style="display: block; padding: 13px 10px; text-decoration:none; color:#ffffff;" rel="noopener"><span class="link c-white" style="text-decoration:none; color:#ffffff;">点击激活</span></a></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table>
</body>
</html>
  • 编写代码
    1.获取模板的字符串
//从容器中获取FreeMarkerConfigurer @Autowiredprivate FreeMarkerConfigurer freeMarkerConfigurer;public String getTemplateStr(String templateName, Map<String,String> map){try {//获取configuration Configuration configuration = freeMarkerConfigurer.getConfiguration();//参数一:模板文件名称 参数二:字符编码集Template template = configuration.getTemplate(templateName, "utf-8");//需要一个string字符输出流StringWriter stringWriter = new StringWriter();//参数一:map中的key为模板中${属性名}的属性名,value为属性值 参数二:需要一个字符流template.process(map,stringWriter);//刷新字符流stringWriter.flush();//从流中获取模板的字符串String s = stringWriter.toString();//关闭流stringWriter.close();return s;} catch (IOException e) {e.printStackTrace();} catch (TemplateException e) {e.printStackTrace();}return "";}
@GetMapping("/getActivateEmail")public AxiosResult<Void> getActivateEmail(String email){Map<String,String> map =new HashMap<>();Employee employee = employeeService.selectByEmail(email);map.put("employeeName",employee.getEmployeeUsername());map.put("activateUrl","http://localhost:8080/employee/doActivate?email="+email);//参数一:模板名称 参数二:模板中需要的属性值放到map中传入String templateStr = freeMarkerUtils.getTemplateStr("activate.ftl", map);//发送html邮件emailUtils.sendHtml(email,templateStr);return AxiosResult.success();}

登录功能中发送邮箱验证的简单使用相关推荐

  1. spring java 发送邮箱验证

    使用spring API实现发送邮箱验证的功能 pom.xml文件 <dependency><groupId>org.springframework.integration&l ...

  2. 注册/找回密码等功能中发送手机验证码后倒计时效果的实现(基于vue)

    注册/找回密码等功能中发送手机验证码后倒计时效果的实现,基于vue.element-ui <template><el-button size="small" ty ...

  3. ASP.Net发送邮箱验证

    关于.net如何实现发送邮箱并获取验证码,具体操作如下: 首先是一个简单的前端界面:(本次测试只需用到一个文本框,两个按钮即可) (一)写代码前一定要先去QQ邮箱进行一个小操作 1.首先进入QQ邮箱后 ...

  4. 网站发送邮箱验证实现找回密码

    从上图可以看出,浏览器通过访问web站点中的邮件发送程序来提交邮件发送请求. 邮件发送程序将把邮件发送给自己网站的SMTP服务器,该SMTP服务器收到邮件后,将根据收件人的地址在将邮件的目的地,要么是 ...

  5. WEB:注册登录功能与Jquery唯一性验证

    前面是后台代码,分别为Bean用户实体类,模拟DB,Dao层类,Service层类,Servlet类(登录.注册.注销).还有两个过滤器(字符编码和拦截个人资料)没写上去,再写就太多了.当然,这是个练 ...

  6. QQ邮箱验证码登录(移动端邮箱验证登录)

    获取邮箱授权码 登录邮箱------->点击设置------->点击账户,下拉------->找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务-- ...

  7. JAVA项目中实现邮箱验证的方法

    本文只是讲一下大致思路,用个人的QQ邮箱举例,对于企业用户照此方法使用企业邮箱. 首先是需要配置一下邮箱,登录上邮箱找到设置-账户 在下面找到 POP3/IMAP/SMTP/Exchange/Card ...

  8. loopback修改密码功能(去掉邮箱验证了)

    本人自写接口,为了过滤掉loopback中登录是需要的eamil验证 正常的验证都是用邮箱来验证的,而且loopback自带的加密 Account.hashPassword(options.passw ...

  9. php 发送邮箱验证怎么做,PHP 实现 注册等的邮箱验证 (二)—— 使用 PHPMailer 发送邮件...

    PHPMailer 是一个很好的发送邮件的类 , 最近使用了它.因为还没有搭起来邮件服务器,先使用他的 SMTP 发送邮件,测试之前邮箱验证的链接是否有效. 谷歌了一下,发现关于这方面的资料还挺多,我 ...

最新文章

  1. 一个顽猴沿着一座小山的n级台阶向上跳,猴子上山一步可跳1级或3级,试求上山的n级台阶有多少种不同的爬法。...
  2. 2021全球抗体亲和力预测大赛来了!
  3. 美国发布《量子网络战略愿景》
  4. bootstrap学习笔记五(表单一)
  5. 怎样在vue单页面中引入其他组件
  6. ASP.Net缓存 1
  7. MATLAB 批量改文件名称
  8. 经典计算机实现量子逻辑门,量子计算机:对量子逻辑门的探讨
  9. python找到文件夹下指定文件_python实现在目录中查找指定文件的方法
  10. 测试人员代码走查基础要点
  11. 如何使用Python查找文本文件的Zipf分布
  12. 记录一次成功的EC、BIOS降级操作
  13. 百度地图高级实例2-如何利用自己的数据制作社交地图?只显示可视区域内的标注
  14. 花青素类荧光染料Sulfo-Cy3.5 NH2,Sulfo-Cyanine3.5 amine,磺酸基-花青素Cyanine3.5 氨基,可以用来标记蛋白
  15. 机器学习——Matplotlib入门教程
  16. 排序法学习之插入排序(python3实现)
  17. 简单的小青蛙跳一跳问题
  18. c#和python_Python3 与 C# 基础语法对比(就当Python和C#基础的普及吧)
  19. 天津计算机比赛,国际传媒学院学生在“‘中科曙光’杯第六届中国大学生计算机设计大赛天津市级赛”中屡创佳绩...
  20. url的post请求 Content-Type:application/json类型 Java后端接收(^_^)

热门文章

  1. Android:单位和尺寸(px、pt、dip、dp、sp、layoutparams)
  2. 光纤1310和1550的区别
  3. HTTP/1.1新建会话失败 解决方法
  4. 人际交往中,你的真诚相待一定会换来疏远
  5. 我找到了一个快速定位SpringBoot接口超时问题的神器!
  6. 近距离端详Android ART运行时库
  7. Kylin环境搭建(保姆级教程)
  8. mac抹掉磁盘重装系统未能与服务器取得联系_电脑重装系统时遇上的N个问题
  9. css3 —— 扑克牌旋转/盾牌飞入
  10. CSP 序列查询新解 202112-2