使用 springboot+freemarker+mail 定时发送系统邮件

本贴最后更新于 2002 天前,其中的信息可能已经时移世易

1.引入架包

这里我使用的springboot版本是2.1.4 <!-- 邮件发送--> <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>

2.准备好邮件发送通用模板,我把模板命名为:message.ftl

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>邮件通知</title> <style> .gridtable{width:96%;margin:5px auto}table{font-family:"Trebuchet MS",Arial,Helvetica,sans-serif;width:100%;border-collapse:collapse}td,th{border-width:1px;border-style:solid;border-color:#e6e6e6;position:relative;padding:9px 15px;min-height:30px;line-height:30px;font-size:14px}th{padding-top:5px;padding-bottom:4px;background-color:#f2f2f2;color:#000} </style> </head> <body> <div> <#if title?exists > <h2>${(title)!""}</h2> </#if> <table id="customers"> <tr> <#if trs?exists > <#list trs as tr> <th>${(tr)!""}</th> </#list> </#if> </tr> <#if dataOverviews?exists > <#list dataOverviews as params> <tr> <td>${(params.date)!""}</td> <td>${(params.customChannelId)!""}</td> <td>${(params.pageViews)!""}</td> <td>${(params.individualAdImpressions)!""}</td> <td>${(params.adRequestsCoverage)!""}</td> <td>${(params.impressionsCtr)!""}</td> <td>${(params.impressionsRpm)!""}</td> <td>${(params.earnings)!""}</td> <td>${(params.channelRevenue)!""}</td> </tr> </#list> </#if> </table> </div> </body> </html>

模板预览

微信图片 20190904161057.png

3.在 application-pro.yml 文件,这里有多重环境的配置环境,根据自己的环境配置 mail 参数

spring: mail: host: smtp.***.qq.com username: 你要发送的邮箱 password: 发送邮箱授权码 default-encoding: UTF-8 port: 465 #这里的端口原本是25,但是厂商把25端口给疯了,我们采用ssl的465端口 properties: mail: smtp: ssl: enable: true #这里启用ssl,开启加密传输;这里很重要,不配置会出现如下问题
  • 注意:ssl 没有开启会出现如下问题

自己的项目在本地发邮件没任何问题。但部署到服务器,发送邮件显示连接异常

4.编写邮件发送工具方法

/** * 发送邮箱 * @param mails 接收邮箱 * @param subject 邮箱标题 * @param title 表格标题 * @param trs tr 数据展示列 * @param objects 需要发送的表格数据 * @param templateName 模板文件名称 */ private void sendMail(String[] mails, String subject, String title, List<String> trs, List<GameReportChannelVo> objects, String templateName){ try { MimeMessage mimeMessage = javaMailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true); helper.setFrom(from); //发送到摸个邮箱上去,可以多个邮箱中间用 , 分割 helper.setTo(mails); //设置邮件标题 helper.setSubject(subject); //设置邮件数据 Map<String, Object> model = new HashMap<>(16); model.put("title",title); model.put("trs", trs); model.put("dataOverviews", objects); //获取模板 Template template = configurer.getConfiguration().getTemplate(templateName); //设置邮件模板 String text = FreeMarkerTemplateUtils.processTemplateIntoString(template, model); helper.setText(text,true); //邮件发送 javaMailSender.send(mimeMessage); } catch (Exception e) { e.printStackTrace(); } }

5.总结

代码基本都没有问题;这里的 GameReportChannelVo 实体要自己建;

在 messages.ftl 中把 params 后面应用的属性替换成自己创建的实体属性

记录这篇文章,主要是怕自己在次采坑;在本地发送邮件好好的,但在线上就不行;原因是 ssl 没有开启,端口也要改成 465

  • mail
    1 引用 • 1 回帖
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    943 引用 • 1460 回帖
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 460 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 410 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...