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

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

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 回帖 • 1 关注
  • FreeMarker

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

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

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

    70 引用 • 193 回帖 • 417 关注

相关帖子

欢迎来到这里!

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

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