SpringBoot整合freemarker、email实现邮件发送


一、准备

目前国内大部分的邮件服务商都不允许直接使用用户名/密码的方式来在代码中发送邮件,都是要先申请授权码,这里以 QQ 邮箱为例,向大家演示授权码的申请流程:首先我们需要先登录 QQ 邮箱网页版,点击上方的设置按钮:
在这里插入图片描述

然后点击账户选项卡,在账户选项卡中找到开启POP3/SMTP选项,点击开启,开启相关功能,开启过程需要手机号码验证,按照步骤操作即可,不赘述。开启成功之后,即可获取一个授权码

p267

二、使用步骤

1.导入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

2.在ymal配置文件中写入配置

代码如下(示例):

spring:
    mail:
      username: 749888745@qq.com
      password: pcuvzfecwkozbbdh
      host: smtp.qq.com

配置参数含义:
username:邮箱名称
password:第一步申请到的授权码
host:SMTP 服务器地址

3.ftl模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style type="text/css">
        html {
      
      
            font-family: sans-serif;
            -ms-text-size-adjust: 100%;
            -webkit-text-size-adjust: 100%;
        }

        body {
      
      
            margin: 10px;
        }

        table {
      
      
            border-collapse: collapse;
            border-spacing: 0;
        }

        td, th {
      
      
            padding: 0;
            word-break: break-all;
        }

        .pure-table {
      
      
            border-collapse: collapse;
            border-spacing: 0;
            empty-cells: show;
            border: 1px solid #cbcbcb;
        }

        .pure-table caption {
      
      
            color: #000;
            font: italic 85%/1 arial, sans-serif;
            padding: 1em 0;
            text-align: center;
        }

        .pure-table td, .pure-table th {
      
      
            border-left: 1px solid #cbcbcb;
            border-width: 0 0 0 1px;
            font-size: inherit;
            margin: 0;
            overflow: visible;
            padding: .5em 1em;
        }

        .pure-table thead {
      
      
            background-color: #40a0cc;
            color: #000;
            text-align: center;
            vertical-align: bottom;
        }

        .pure-table td {
      
      
            background-color: transparent;

        }

        .pure-table-bordered td {
      
      

            border-bottom: 1px solid #cbcbcb;
        }

        .pure-table-bordered tbody > tr:last-child > td {
      
      
            border-bottom-width: 0;
        }
    </style>
</head>
<body>

<p>你好!</p>

<p>你已经成功订阅如下信息,若信息发生变更时会及时通知您~</p>


<#if scheduleType==1>
    <table class="pure-table pure-table-bordered">
        <thead>
        <tr>
            <td>排期ID</td>
            <td>排期名称</td>
            <td>当前节点</td>
            <td>节目日期</td>
            <td>节目开始时间</td>
            <td>节目结束时间</td>
            <td>授权产品</td>
            <td>授权地区</td>
            <td>水印</td>
            <td>合作方</td>
            <td>主路接入方式</td>
            <td>主路信源地址</td>
            <td>备路接入方式</td>
            <td>备路信源地址</td>
            <td>收费策略</td>
        </tr>
        </thead>


        <#list schedules as schedule>
            <tr>
                <td><#if (schedule.id)??>${schedule.id}<#else>${(schedule.id)!}</#if></td>
                <td><#if (schedule.scheduleName)??>${schedule.scheduleName}<#else>${(schedule.scheduleName)!}</#if></td>
                <td><#if (schedule.scheduleNode)??>${schedule.scheduleNode}<#else>${(schedule.scheduleNode)!}</#if></td>
                <td><#if (schedule.playingDate)??>${schedule.playingDate}<#else>${(schedule.playingDate)!}</#if></td>
                <td><#if (schedule.liveStartTime)??>${schedule.liveStartTime}<#else>${(schedule.liveStartTime)!}</#if></td>
                <td><#if (schedule.liveEndTime)??>${schedule.liveEndTime}<#else>${(schedule.liveEndTime)!}</#if></td>
                <td><#if (schedule.authProduct)??>${schedule.authProduct}<#else>${(schedule.authProduct)!}</#if></td>
                <td><#if (schedule.authArea)??>${schedule.authArea}<#else>${(schedule.authArea)!}</#if></td>
                <td><#if (schedule.waterMarker)??>${schedule.waterMarker}<#else>${(schedule.waterMarker)!}</#if></td>
                <td><#if (schedule.collaborator)??>${schedule.collaborator}<#else>${(schedule.collaborator)!}</#if></td>
                <td><#if (schedule.mainUrlType)??>${schedule.mainUrlType}<#else>${(schedule.mainUrlType)!}</#if></td>
                <td><#if (schedule.mainUrl)??>${schedule.mainUrl}<#else>${(schedule.mainUrl)!}</#if></td>
                <td><#if (schedule.backupUrlType)??>${schedule.backupUrlType}<#else>${(schedule.backupUrlType)!}</#if></td>
                <td><#if (schedule.backupUrl)??>${schedule.backupUrl}<#else>${(schedule.backupUrl)!}</#if></td>
                <td><#if (schedule.chargeStrategy)??>${schedule.chargeStrategy}<#else>${(schedule.chargeStrategy)!}</#if></td>
            </tr>
        </#list>
    </table>
<#else>
    <table class="pure-table pure-table-bordered">
        <thead>
        <tr>
            <td>排期ID</td>
            <td>排期名称</td>
            <td>当前节点</td>
            <td>节目日期</td>
            <td>节目开始时间</td>
            <td>比赛时间</td>
            <td>节目结束时间</td>
            <td>赛事</td>
            <td>轮次/项目</td>
            <td>演播室</td>
            <td>解说/嘉宾</td>
            <td>收费策略</td>
        </tr>
        </thead>


        <#list schedules as schedule>
            <tr>
                <td><#if (schedule.id)??>${schedule.id}<#else>${(schedule.id)!}</#if></td>
                <td><#if (schedule.scheduleName)??>${schedule.scheduleName}<#else>${(schedule.scheduleName)!}</#if></td>
                <td><#if (schedule.scheduleNode)??>${schedule.scheduleNode}<#else>${(schedule.scheduleNode)!}</#if></td>
                <td><#if (schedule.playingDate)??>${schedule.playingDate}<#else>${(schedule.playingDate)!}</#if></td>
                <td><#if (schedule.liveStartTime)??>${schedule.liveStartTime}<#else>${(schedule.liveStartTime)!}</#if></td>
                <td><#if (schedule.playingTime)??>${schedule.playingTime}<#else>${(schedule.playingTime)!}</#if></td>
                <td><#if (schedule.liveEndTime)??>${schedule.liveEndTime}<#else>${(schedule.liveEndTime)!}</#if></td>
                <td><#if (schedule.liveBusiness)??>${schedule.liveBusiness}<#else>${(schedule.liveBusiness)!}</#if></td>
                <td><#if (schedule.round)??>${schedule.round}<#else>${(schedule.round)!}</#if></td>
                <td><#if (schedule.studio)??>${schedule.studio}<#else>${(schedule.studio)!}</#if></td>
                <td><#if (schedule.narrator)??>${schedule.narrator}<#else>${(schedule.narrator)!}</#if></td>
                <td><#if (schedule.chargeStrategy)??>${schedule.chargeStrategy}<#else>${(schedule.chargeStrategy)!}</#if></td>
            </tr>
        </#list>
    </table>
</#if>

<br>
<p>- - - - - - - - - - - - - - - - - - - - - -</p>
<b>订阅通知</b>
</body>
</html>

4.发送邮件方法


 public void sendMail(List<ScheduleInfo> scheduleInfos, String emails, Integer emailType, Integer node, JavaMailSender javaMailSender) {
    
    
        try {
    
    
            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);

            //发件人,邮箱地址,别名
            helper.setFrom("[email protected]", "小王");
            helper.setTo(emails.split(","));
            helper.setSentDate(new Date());
            //构建 Freemarker 的基本配置
            // 配置模板位置
            Map<String, Object> map = new HashMap<>();
			//此处的scheduleTemplateVos对应模板中的集合参数
            map.put("schedules", scheduleTemplateVos);
            map.put("node", node);
            Configuration configuration = new Configuration(Configuration.VERSION_2_3_28);
            configuration.setClassForTemplateLoading(this.getClass(), "/static");
            //设置参数不让数值化
            configuration.setNumberFormat("#");
            String ftl;
            String subject;
            switch (emailType) {
    
    
                case 1:
                    ftl = "subscribe.ftl";
                    //主题
                    subject = "订阅成功通知";
                    break;
                case 2:
                    ftl = "change.ftl";
                    subject = "订阅信息变更通知";
                    break;
                case 3:
                    ftl = "nodeflow.ftl";
                    subject = "节点流转通知";
                    break;
                default:
                    ftl = "";
                    subject = "";
                    break;
            }
            String emailContent = FreeMarkerTemplateUtils.processTemplateIntoString(configuration.getTemplate(ftl), map);
            helper.setSubject(subject);
            helper.setText(emailContent, true);
            javaMailSender.send(mimeMessage);
        } catch (Exception e) {
    
    
            log.error("---------->error:{}", e.getMessage(), e);
        }
    }

5.结果展示

在这里插入图片描述


猜你喜欢

转载自blog.csdn.net/hurtseverywhere/article/details/121373583
今日推荐