<!-- 邮件start -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
<!-- 邮件end -->
<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>
<!--quartz定时-->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
-------------------------------------------------------------------
# JavaMailSender 邮件发送的配置s
spring.mail.host=smtp.qq.com
spring.mail.username=98@qq.com
spring.mail.password=klfrwbbhd
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
# JavaMailSender 邮件发送的配置e
#每60执行一次
scheduled.cron=0/60 * * * * ?
#初次执行任务之前需要等待的时间(5秒)
scheduled.initialDelay=60000
#每次执行任务之后间隔多久再次执行该任务(60秒)执行频率
scheduled.fixedDelay=60000
#执行频率,每隔多少时间就启动任务,不管该任务是否启动完成
scheduled.fixedRate=60000
----------------------------------------------------------------
package com.manage.util;

import com.w3china.mingjing3.model.MailLog;
import freemarker.template.Template;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer; import javax.mail.internet.MimeMessage;
import java.util.HashMap;
import java.util.Map; public class Singleton { //双检锁/双重校验锁(单例模式)
private static final Logger LOGGER = LoggerFactory.getLogger(Singleton.class); private static class SingletonHolder {
public final static Singleton instance = new Singleton();
} public static Singleton getInstance() {
return SingletonHolder.instance;
} public static Map<Object, Object> sendmail(MailLog mailLog, JavaMailSender mailSender, String mailFrom, String password, FreeMarkerConfigurer freeMarkerConfigurer) {
Map<Object, Object> map = new HashMap<Object, Object>();
// 发邮件
MimeMessage message = null;
try {
message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(mailFrom);
helper.setTo(mailLog.getMailTo());
helper.setSubject(mailLog.getRefAction());
Map<String, Object> model = new HashMap<>();
String mailtemplatsPath = "";
if (103 == mailLog.getResType()) {
model.put("resTypeName", "服务资源");
} else if (102 == mailLog.getResType()) {
model.put("resTypeName", "云资源");
} else if (101 == mailLog.getResType()) {
model.put("resTypeName", "广告资源");
}
model.put("refName", mailLog.getRefName());
model.put("refQuota", mailLog.getRefQuota());
if ((mailLog.getRefAction()).equals("额度发放")) {
mailtemplatsPath = "mailtemplats/sendQuota.ftl";
} else if ((mailLog.getRefAction()).equals("额度使用")) {
mailtemplatsPath = "mailtemplats/useQuota.ftl";
} else if ((mailLog.getRefAction()).equals("额度返还")) {
mailtemplatsPath = "mailtemplats/backQuota.ftl";
}
//读取 ftl 模板
Template template = freeMarkerConfigurer.getConfiguration().getTemplate(mailtemplatsPath);
String html = FreeMarkerTemplateUtils.processTemplateIntoString(template, model);
helper.setText(html, true);
map.put("id", mailLog.getId());
map.put("mailState", true);
map.put("mailResCode", 1);
map.put("mailResMsg", "发送成功");
map.put("mailCount", null);
LOGGER.info("发送成功");
} catch (Exception e) {
e.printStackTrace();
map.put("id", mailLog.getId());
map.put("mailState", false);
map.put("mailResCode", 0);
map.put("mailResMsg", e.toString());
map.put("mailCount", 1); LOGGER.info("发送失败");
LOGGER.info(e.toString());
}
mailSender.send(message);
LOGGER.info("邮件已经发送-----");
return map;
} }-------------
package com.manage.util;

import com.alibaba.fastjson.JSON;
import com.w3china.mingjing3.manage.service.MailLogService;
import com.w3china.mingjing3.model.MailLog;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import java.util.*; import org.slf4j.Logger;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer; @Component
@Configurable
@EnableScheduling
public class ScheduledTasks {
private static final Logger LOGGER = LoggerFactory.getLogger(ScheduledTasks.class);
@Autowired
private JavaMailSender mailSender; //自动注入的Bean
@Value("${spring.mail.username}")
private String mailFrom; //读取配置文件中的参数
@Value("${spring.mail.password}")
private String password; //读取配置文件中的参数
@Autowired
private FreeMarkerConfigurer freeMarkerConfigurer; //自动注入
@Autowired
private MailLogService mailLogService; // fixedRate 每次任务结束后会从任务编排表中找下一次该执行的任务,判断是否到时机执行。
// fixedRate 的任务某次执行时间再长也不会造成两次任务实例同时执行,除非用了 @Async 注解。
// fixedDelay 总是前一次任务完成后,延时固定时间然后执行一次任务 @Scheduled(cron = "${scheduled.cron}")
public void reportCurrentByCron() {
LOGGER.info("ScheduledTasks开始定时执行");
List<MailLog> mailLogList = mailLogService.selectByMailState(100); //
Queue<MailLog> queue = new LinkedList<MailLog>();
if (queue.isEmpty()) {
for (int i = 0; i < mailLogList.size(); i++) { // 队列为空的话,就将集合放到队列里
queue.offer(mailLogList.get(i));
}
}
LOGGER.info(JSON.toJSONStringWithDateFormat("queque==" + queue, "yyyy-MM-dd HH:mm:ss"));
Singleton singleton = Singleton.getInstance();
// queue.poll(); //返回第一个元素,并在队列中删除
Map<Object, Object> sendmail = singleton.sendmail(queue.poll(), mailSender, mailFrom, password, freeMarkerConfigurer); mailLogService.updateMailLogById( // 更新数据库邮件记录表
(Integer) sendmail.get("id"),
(Boolean) sendmail.get("mailState"),
(Integer) sendmail.get("mailResCode"),
(String) sendmail.get("mailResMsg"),
(Integer) sendmail.get("mailCount")
); } }
----------------
manage\src\main\resources\templates\mailtemplats\sendQuota.ftl
<html>

<body>
<#--额度发放 邮箱模板-->
<h3>
您好,您提交的${resTypeName!}资源中${refName!}项目的资源申请已通过审核,发放额度${refQuota!}元,请登录系统使用。
</h3>
<#--注意:只给公司业务联系人的邮箱发送-->
</body> </html>
												

spingboot 邮件模板发送;的更多相关文章

  1. flask 电子邮件进阶实践-用模板发送163邮件

    电子邮件进阶实践 下面来学习构建邮件的HTML正文,并使用模板组织内容. 一封电子邮件的正文可以是纯文本(text/plain),也可以是HTML格式的文本(text/html).处于全面的考虑,一封 ...

  2. U-Mail邮件营销可视化编辑设计邮件模板so easy

    相信每位看过军事演习的朋友都知道,现代战争越来越就像一场沙盘演练,真正做到了“运筹帷幄之中决战千里之外”,后方坐镇指挥战斗的能够将前线战场变得透明,这就叫“可视化战争”,做到了<孙子兵法> ...

  3. 2017U-Mail邮件营销平台新邮件模板功能

    据U-Mail调查表明,企业用户中普遍最关心群发邮件会不会被列入垃圾箱?的确,哪怕你最用功,一旦邮件进了垃圾箱,意味着全盘尽废.业界知名服务商U-Mail一直想用户之所想,急用户之所急,十几年如一日, ...

  4. 后台根据html邮件模板发送邮件

    HTML邮件模板: xxxxxxx 在线模板的方式: String fileName = "http://localhost:8080/xxxxxxx.html"; URL url ...

  5. (转载)JavaWeb学习总结(五十一)——邮件的发送与接收原理

    博客源地址:http://www.cnblogs.com/xdp-gacl/p/4209586.html 一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 要在Internet上提供电 ...

  6. zabbix监控系列(4)之zabbix报警邮件无法发送

    情况介绍 首先确保邮箱规则没有把报警邮件作为垃圾邮件拉黑了. 服务器断电重启后,发现zabbix报警邮件无法发送,断电之前是好好的,但是重启后不行了,于是查看maillog日志,发现这个错误: Hos ...

  7. JavaWeb学习总结(五十一)——邮件的发送与接收原理

    一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器.例如现在Internet很多提供邮件服务的厂商:sina.sohu ...

  8. PHP 错误与异常 笔记与总结(7)将错误日志以邮件方式发送

    当系统发生了很严重的问题,需要立刻发送给管理员.可以通过 error_log() 将错误以邮件形式发送到邮箱. 在 php.ini 中设置: sendmail_from = 472323087@qq. ...

  9. Magento修改邮件模板内容

    Magento 默认邮件模板 都是带着官方的标志和一些官方的基本信息.为了建立品牌形象我们需要把邮件模板中的所有官方信息换成自己的信息.修改步骤如下: 1.找到Magento的邮件模板文件(这里以 e ...

随机推荐

  1. php 获取 今天、昨天、这周、上周、这月、上月、近30天

    <?php //今天 $today = date("Y-m-d"); //昨天 $yesterday = date("Y-m-d", strtotime( ...

  2. javascript简易日历制作

    学习记录 01.练习数组的用法 02.理解this.index的用法 03.绑定事件深入练习理解 html代码 <div id="date"> <ul id=&q ...

  3. JZOJ 5793. 【NOIP2008模拟】小S练跑步

    5793. [NOIP2008模拟]小S练跑步 (File IO): input:run.in output:run.out Time Limits: 2000 ms  Memory Limits:  ...

  4. libevent 信号事件实现方式

    学会使用libevent,才能真正的掌握其是实现原理,我们先从一个简短的测试用例开始: #include <sys/types.h> #include <sys/stat.h> ...

  5. git初次建立远程仓库问题

    git "Could not read from remote repository.Please make sure you have the correct access rights. ...

  6. 用 Tensorflow 建立 CNN

    稍稍乱入的CNN,本文依然是学习周莫烦视频的笔记. 还有 google 在 udacity 上的 CNN 教程. CNN(Convolutional Neural Networks) 卷积神经网络简单 ...

  7. P2065 贪心的果农

    P2065 贪心的果农 题目描述 果农的花园里种着N棵果树.收获的季节终于来到了,果农决定,在接下来的M天时间里完成自己的收获工作.他的收获方式极其暴力——他将会将某棵果树砍倒来获取上面的果实.然而如 ...

  8. mybatis特殊字符处理

    在mybatis 的mapper.xml文件中特殊字符处理方式  仅供参考 出处:http://yaobenzhang.blog.163.com/blog/static/214395113201561 ...

  9. STL学习笔记6 -- 栈stack 、队列queue 和优先级priority_queue 三者比较

    栈stack  .队列queue  和优先级priority_queue 三者比较 默认下stack 和queue 基于deque 容器实现,priority_queue 则基于vector 容器实现 ...

  10. python 冒泡排序,快排

    一.冒泡排序 1.1.冒泡的原理 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有的 ...