spingboot 邮件模板发送;
<!-- 邮件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 邮件模板发送;的更多相关文章
- flask 电子邮件进阶实践-用模板发送163邮件
电子邮件进阶实践 下面来学习构建邮件的HTML正文,并使用模板组织内容. 一封电子邮件的正文可以是纯文本(text/plain),也可以是HTML格式的文本(text/html).处于全面的考虑,一封 ...
- U-Mail邮件营销可视化编辑设计邮件模板so easy
相信每位看过军事演习的朋友都知道,现代战争越来越就像一场沙盘演练,真正做到了“运筹帷幄之中决战千里之外”,后方坐镇指挥战斗的能够将前线战场变得透明,这就叫“可视化战争”,做到了<孙子兵法> ...
- 2017U-Mail邮件营销平台新邮件模板功能
据U-Mail调查表明,企业用户中普遍最关心群发邮件会不会被列入垃圾箱?的确,哪怕你最用功,一旦邮件进了垃圾箱,意味着全盘尽废.业界知名服务商U-Mail一直想用户之所想,急用户之所急,十几年如一日, ...
- 后台根据html邮件模板发送邮件
HTML邮件模板: xxxxxxx 在线模板的方式: String fileName = "http://localhost:8080/xxxxxxx.html"; URL url ...
- (转载)JavaWeb学习总结(五十一)——邮件的发送与接收原理
博客源地址:http://www.cnblogs.com/xdp-gacl/p/4209586.html 一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 要在Internet上提供电 ...
- zabbix监控系列(4)之zabbix报警邮件无法发送
情况介绍 首先确保邮箱规则没有把报警邮件作为垃圾邮件拉黑了. 服务器断电重启后,发现zabbix报警邮件无法发送,断电之前是好好的,但是重启后不行了,于是查看maillog日志,发现这个错误: Hos ...
- JavaWeb学习总结(五十一)——邮件的发送与接收原理
一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器.例如现在Internet很多提供邮件服务的厂商:sina.sohu ...
- PHP 错误与异常 笔记与总结(7)将错误日志以邮件方式发送
当系统发生了很严重的问题,需要立刻发送给管理员.可以通过 error_log() 将错误以邮件形式发送到邮箱. 在 php.ini 中设置: sendmail_from = 472323087@qq. ...
- Magento修改邮件模板内容
Magento 默认邮件模板 都是带着官方的标志和一些官方的基本信息.为了建立品牌形象我们需要把邮件模板中的所有官方信息换成自己的信息.修改步骤如下: 1.找到Magento的邮件模板文件(这里以 e ...
随机推荐
- tcl之string操作
- tp3.2框架中使用volist输出混乱的一点发现
在tp框架中,volist真的是一样很好用的东西,但是要是不注意,用起来也会有问题的 在Controller层中,将数据assign到页面 $this->assign('vo',$news); ...
- 03.VUE学习之动态绑定值
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- 关于json数据中的多反斜杆转译--StringEscapeUtils.unescapeJava(踩过的坑)
一.需求 现有一个字符串str String str = "{\\\"name\\\":\\\"spy\\\",\\\"id\\\\&quo ...
- day14之模块
一.列表生成式与生成表达式 1.列表生成式(数据量小) 要求:在列表内造100个元素 示例: l=[] for i in range(100): l.append('egg%s'%i) print(l ...
- dp专练
dp练习. codevs 1048 石子归并 区间dp #include<cstdio> #include<algorithm> #include<cstring> ...
- Redis实现之AOF持久化
AOF持久化 除了RDB持久化功能之外,Redis还提供了AOF(Append Only File)持久化功能,与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Red ...
- 42、通过ontouch检测expandableListview的单击、长按、列表滚动
一.在model定义变量: public boolean isExpandableListviewScroll = false;//这个是 首先监听expandableListview的滚动: Exp ...
- Python-S9-Day89_stark总结
01 Stark总结 02 ORM总结 03 上节作业 04 Stark组件之查看页面表头 05 list_display_links 06 stark组件之添加页面 07 编辑删除页面 01 Sta ...
- javascript计算两个时间的差
function GetDateDiff(startTime, endTime, diffType) { //将xxxx-xx-xx的时间格式,转换为 xxxx/xx/xx的格式 startTime ...