SpringBoot integrates freemarker and email to send emails


1. Preparation

At present, most domestic email service providers do not allow the direct use of username/password to send emails in the code. They all need to apply for an authorization code first. Here, we take QQ mailbox as an example to demonstrate the authorization code application process: First We need to log in to the QQ mailbox web version first and click the settings button above:
Insert image description here

Then click the Account tab, find the Enable POP3/SMTP option in the Account tab, click Enable to enable related functions, the opening process requires mobile phone number verification, just follow the steps, no details will be given. After successful activation, you can obtain an authorization code

p267

2. Usage steps

1. Import dependencies

<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. Write the configuration in the ymal configuration file

The code is as follows (example):

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

Meaning of configuration parameters:
username: email name
password: authorization code applied for in the first step
host: SMTP server address

3.ftl template

<!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. How to send email


 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.Result display

Insert image description here


Guess you like

Origin blog.csdn.net/hurtseverywhere/article/details/121373583