整合mail发送邮件,其实就是通过代码来操作发送邮件的步骤,编辑收件人、邮件内容、邮件附件等等。通过邮件可以拓展出短信验证码、消息通知等业务。

一、pom文件引入依赖

  1. <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>
    <!--freemarker模板引擎是为了后面发送模板邮件 不需要的可以不引入-->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
    </dependency>

二、application.yml文件中配置

  1.  
  1. spring:
    mail:
    host: smtp.qq.xyz #这里换成自己的邮箱类型 例如qq邮箱就写smtp.qq.com
    username: xx@qq.com #QQ邮箱
    password: xxxxxxxxxxx #邮箱密码或者授权码
    protocol: smtp #发送邮件协议
    properties.mail.smtp.auth: true
    properties.mail.smtp.port: 465 #端口号465或587
    properties.mail.smtp.starttls.enable: true
    properties.mail.smtp.starttls.required: true
    properties.mail.smtp.ssl.enable: true #开启SSL
    default-encoding: utf-8
  1. freemarker:
    cache: false # 缓存配置 开发阶段应该配置为false 因为经常会改
    suffix: .html # 模版后缀名 默认为ftl
    charset: UTF-8 # 文件编码
    template-loader-path: classpath:/templates/ # 存放模板的文件夹,以resource文件夹为相对路径

邮箱密码暴露在配置文件很不安全,一般都是采取授权码的形式。点开邮箱,然后在账户栏里面点击生成授权码:

三、编写MailUtils工具类

  1. @Component
  2. @Slf4j
  3. public class MailUtils{
  4.  
  5. /**
  6. * Spring官方提供的集成邮件服务的实现类,目前是Java后端发送邮件和集成邮件服务的主流工具。
  7. */
  8. @Resource
  9. private JavaMailSender mailSender;
  10.  
  11. /**
  12. * 从配置文件中注入发件人的姓名
  13. */
  14. @Value("${spring.mail.username}")
  15. private String fromEmail;
  16.  
  17. @Autowired
  18. private FreeMarkerConfigurer freeMarkerConfigurer;
  19.  
  20. /**
  21. * 发送文本邮件
  22. * @param to 收件人
  23. * @param subject 标题
  24. * @param content 正文
  25. */
  26. public void sendSimpleMail(String to, String subject, String content) {
  27. SimpleMailMessage message = new SimpleMailMessage();
  28. //发件人
  29. message.setFrom(fromEmail);
  30. message.setTo(to);
  31. message.setSubject(subject);
  32. message.setText(content);
  33. mailSender.send(message);
  34. }
  35.  
  36. /**
  37. * 发送html邮件
  38. */
  39. public void sendHtmlMail(String to, String subject, String content) {
  40. try {
  41. //注意这里使用的是MimeMessage
  42. MimeMessage message = mailSender.createMimeMessage();
  43. MimeMessageHelper helper = new MimeMessageHelper(message, true);
  44. helper.setFrom(fromEmail);
  45. helper.setTo(to);
  46. helper.setSubject(subject);
  47. //第二个参数:格式是否为html
  48. helper.setText(content, true);
  49. mailSender.send(message);
  50. }catch (MessagingException e){
  51. log.error("发送邮件时发生异常!", e);
  52. }
  53. }
  54.  
  55. /**
  56. * 发送模板邮件
  57. * @param to
  58. * @param subject
  59. * @param template
  60. */
  61. public void sendTemplateMail(String to, String subject, String template){
  62. try {
  63. // 获得模板
  64. Template template1 = freeMarkerConfigurer.getConfiguration().getTemplate(template);
  65. // 使用Map作为数据模型,定义属性和值
  66. Map<String,Object> model = new HashMap<>();
  67. model.put("myname","Ray。");
  68. // 传入数据模型到模板,替代模板中的占位符,并将模板转化为html字符串
  69. String templateHtml = FreeMarkerTemplateUtils.processTemplateIntoString(template1,model);
  70. // 该方法本质上还是发送html邮件,调用之前发送html邮件的方法
  71. this.sendHtmlMail(to, subject, templateHtml);
  72. } catch (TemplateException e) {
  73. log.error("发送邮件时发生异常!", e);
  74. } catch (IOException e) {
  75. log.error("发送邮件时发生异常!", e);
  76. }
  77. }
  78.  
  79. /**
  80. * 发送带附件的邮件
  81. * @param to
  82. * @param subject
  83. * @param content
  84. * @param filePath
  85. */
  86. public void sendAttachmentsMail(String to, String subject, String content, String filePath) {
  87. try {
  88. MimeMessage message = mailSender.createMimeMessage();
  89. //要带附件第二个参数设为true
  90. MimeMessageHelper helper = new MimeMessageHelper(message, true);
  91. helper.setFrom(fromEmail);
  92. helper.setTo(to);
  93. helper.setSubject(subject);
  94. helper.setText(content, true);
  95.  
  96. FileSystemResource file = new FileSystemResource(new File(filePath));
  97. String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
  98. helper.addAttachment(fileName, file);
  99. mailSender.send(message);
  100. }catch (MessagingException e){
  101. log.error("发送邮件时发生异常!", e);
  102. }
  103.  
  104. }
  105. }

MailUtils其实就是进一步封装Mail提供的JavaMailSender类,根据业务场景可以在工具类里面添加对应的方法,这里提供了发送文本邮件、html邮件、模板邮件、附件邮件的方法。

四、Controller层的实现

  1. @Api(tags = "邮件管理")
  2. @RestController
  3. @RequestMapping("/mail")
  4. public class MailController {
  5.  
  6. @Autowired
  7. private MailUtils mailUtils;
  8.  
  9. /**
  10. * 发送注册验证码
  11. * @return 验证码
  12. * @throws Exception
  13. */
  14. @ApiOperation("发送注册验证码")
  15. @GetMapping("/test")
  16. public String send(){
  17. mailUtils.sendSimpleMail("ruiyeclub@foxmail.com","普通文本邮件","普通文本邮件内容");
  18. return "OK";
  19. }
  20.  
  21. /**
  22. * 发送注册验证码
  23. * @return 验证码
  24. * @throws Exception
  25. */
  26. @ApiOperation("发送注册验证码")
  27. @PostMapping("/sendHtml")
  28. public String sendTemplateMail(){
  29. mailUtils.sendHtmlMail("ruiyeclub@foxmail.com","一封html测试邮件",
  30. "<div style=\"text-align: center;position: absolute;\" >\n"
  31. +"<h3>\"一封html测试邮件\"</h3>\n"
  32. + "<div>一封html测试邮件</div>\n"
  33. + "</div>");
  34. return "OK";
  35. }
  36.  
  37. @ApiOperation("发送html模板邮件")
  38. @PostMapping("/sendTemplate")
  39. public String sendTemplate(){
  40. mailUtils.sendTemplateMail("ruiyeclub@foxmail.com", "基于模板的html邮件", "hello.html");
  41. return "OK";
  42. }
  43.  
  44. @ApiOperation("发送带附件的邮件")
  45. @GetMapping("sendAttachmentsMail")
  46. public String sendAttachmentsMail(){
  47. String filePath = "D:\\projects\\springboot\\template.png";
  48. mailUtils.sendAttachmentsMail("xxxx@xx.com", "带附件的邮件", "邮件中有附件", filePath);
  49. return "OK";
  50. }
  51. }

为了方便测试,这里使用了swagger3,详情可以查看SpringBoot整合Swagger3生成接口文档

四、测试结果

如果需要达到通过邮件发送验证码的功能,可以使用redis。后台随机生成验证码,然后把用户的主键设为key,验证码的内容设为value,还可以设置个60s过期存储,发送成功后,用户登录通过主键从redis拿到对应的验证码,然后再进行登录验证就好了。

GitHub地址:https://github.com/ruiyeclub/SpringBoot-Hello

SpringBoot整合Mail发送邮件&发送模板邮件的更多相关文章

  1. SpringBoot 整合 Shiro 密码登录与邮件验证码登录(多 Realm 认证)

    导入依赖(pom.xml)  <!--整合Shiro安全框架--> <dependency> <groupId>org.apache.shiro</group ...

  2. SpringBoot整合Mail

    前言 SpringBoot实现邮件功能是非常的方便快捷的,因为SpringBoot默认有starter实现了Mail. 发送邮件应该是网站的必备功能之一,什么注册验证,忘记密码或者是给用户发送营销信息 ...

  3. SpringBoot整合ActiveMQ发送邮件

    虽然ActiveMQ以被其他MQ所替代,但仍有学习的意义,本文采用邮件发送的例子展示ActiveMQ 1. 生产者1.1 引入maven依赖1.2 application.yml配置1.3 创建配置类 ...

  4. 使用javaMail和velocity来发送模板邮件

    之前在ssh项目中有用过javaMail和velocity来发送邮件,实现的效果如下所示. 这类邮件主要用于公司的推广宣传,比如商城的促销等场景. 今天打算将邮件模块也集成到ssm项目,也算是对之前做 ...

  5. .Net Mail SMTP 发送网络邮件

    刚刚迈入"开发"的行列 一直有一个想法 我什么时候能给我庞大的用户信息数据库给每一位用户邮箱发送推荐信息呢? 刚迈入"编程两个月的时间" 我采用 SMTP 发送 ...

  6. SpringBoot 整合Mail发送功能问题与解决

    SpringBootLean 是对springboot学习与研究项目,是根据实际项目的形式对进行配置与处理,欢迎star与fork. [oschina 地址] http://git.oschina.n ...

  7. SpringBoot整合JavaMail发送邮件

    JavaMail是SUN提供给广大Java开发人员的一款邮件发送和接受的一款开源类库,支持常用的邮件协议,如:SMTP.POP3.IMAP,开发人员使用JavaMail编写邮件程序时,不再需要考虑底层 ...

  8. JavaEE开发之SpringBoot整合MyBatis以及Thymeleaf模板引擎

    上篇博客我们聊了<JavaEE开发之SpringBoot工程的创建.运行与配置>,从上篇博客的内容我们不难看出SpringBoot的便捷.本篇博客我们继续在上篇博客的基础上来看一下Spri ...

  9. spring 5.x 系列第19篇 ——spring简单邮件、附件邮件、内嵌资源邮件、模板邮件发送 (xml配置方式)

    源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.说明 1.1 项目结构说明 邮件发送配置文件为springApplic ...

随机推荐

  1. 聊聊Java中的异常及处理

    前言 在编程中异常报错是不可避免的.特别是在学习某个语言初期,看到异常报错就抓耳挠腮,常常开玩笑说编程1分钟,改bug1小时.今天就让我们来看看什么是异常和怎么合理的处理异常吧! 异常与error介绍 ...

  2. Linux必须要掌握的命令

    Linux必须要掌握的命令 文件目录操作命令 ls 命令格式:ls [选项] [目录名] 命令功能:列出目标目录中所有的子目录和文件 常用参数:-a,-l,-R, 例1:列出/home/peidach ...

  3. Netty 源码解析(三): Netty 的 Future 和 Promise

    今天是猿灯塔“365篇原创计划”第三篇. 接下来的时间灯塔君持续更新Netty系列一共九篇 Netty 源码解析(一): 开始 Netty 源码解析(二): Netty 的 Channel 当前:Ne ...

  4. 如何使用CSS创建巧妙的动画提示框

    当你的用户需要一些额外的上下文来放置图标,或者当他们需要一些保证来点击按钮,或者可能是一个复活节彩蛋的标题来搭配一个图片时,工具提示是一个很好的方法来增强用户界面.现在让我们来制作一些动画工具提示,只 ...

  5. 深入理解letter-spacing,word-spacing的对比区别

    letter-spacing lletter-spacing 属性增加或减少字符间的空白(字符间距). 该属性定义了在文本字符框之间插入多少空间.由于字符字形通常比其字符框要窄,指定长度值时,会调整字 ...

  6. 前端分页(js)

    //前端分页 var limit = 10; //每页显示数据条数 var total = $('#host_table').find('tr').length; var allPage = tota ...

  7. Vue---day05

    目录 2. 客户端项目搭建 2.1 创建项目目录 2.2 初始化项目 2.3 安装路由vue-router 2.3.1 下载安装路由组件 2.3.2 配置路由 2.3.2.1 初始化路由对象 2.3. ...

  8. Install-Package : 找不到程序包

    将程序包源链接地址改为https://www.nuget.org/api/v2/即可.

  9. 浏览器常见攻击方式(XSS和CSRF)

    常见的浏览器攻击分为两种,一种为XSS(跨站脚本攻击),另一种则为CSRF(跨站请求伪造). XSS(跨站脚本攻击) 定义 XSS 全称是 Cross Site Scripting,为了与“CSS”区 ...

  10. spring security简单登录的认证

    一.思路 1.先导入相关配置(使用spring security校验之后,登录拦截的配置) 2.创建一个 WebSecurityConfig 继承 WebSecurityConfigurerAdapt ...