spring boot + activeMq 邮件服务
引入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency> <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>
配置文件:
spring:
activemq:
broker-url: tcp://127.0.0.1:61616
in-memory: true
pool:
enabled: false
mail:
host: smtp.163.com
username: 你的邮箱
password: 你的密码
properties:
mail:
smtp: true
starttls:
enable: true
required: true
freemarker:
allow-request-override: false
cache: true
check-template-location: true
charset: UTF-8
content-type: text/html
expose-request-attributes: false
expose-session-attributes: false
expose-spring-macro-helpers: false mail:
fromMail:
addr: dandingdedanding@163.com
邮件服务:
public interface MailService {
boolean sendEmail(String to, String subject, String content);
boolean sendEmailByTemplate(String to, String subject, String templateFile, Map<String, String> content);
}
@Service
public class MailServiceImpl implements MailService { @Autowired
private JavaMailSender mailSender; @Value("${mail.fromMail.addr}")
private String from; // 邮件发送者 @Override
public boolean sendEmail(String to, String subject, String content) {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message);
try {
helper.setFrom(from); // 邮件发送者
helper.setTo(to); // 邮件接收者
helper.setSubject(subject); // 邮件主题
helper.setText(content, true); // 邮件正文,是否支持html格式
mailSender.send(message); // 发送邮件
} catch (MessagingException e) {
e.printStackTrace();
return false;
}
return true;
} @Override
public boolean sendEmailByTemplate(String to, String subject, String templateFile, Map<String, String> content) {
Configuration cfg = new Configuration(Configuration.VERSION_2_3_23);
cfg.setClassForTemplateLoading(this.getClass(), "/templates");
try {
Template template = cfg.getTemplate(templateFile);
String html = FreeMarkerTemplateUtils.processTemplateIntoString(template, content);
return this.sendEmail(to, subject, html);
} catch (Exception e) {
e.printStackTrace();
return false;
}
} }
模板文件:
<html>
<body>
<h3>你好,这是绿茵狙击手的测试邮件,我是${name}</h3>
</body>
</html>
spring boot启动类:
@SpringBootApplication
@EnableJms
public class Application { @Bean("emailQueue")
public Queue emailQueue() {
return new ActiveMQQueue("email.queue");
} public static void main(String[] args) {
SpringApplication.run(Application.class, args);
} }
email rest 接口:
/**
* 邮件服务暴露给外部的rest接口
*/
@RestController
@RequestMapping("/mail")
public class MailRestController { @Autowired
private MailProducer mailProducer; /**
* 发送简单邮件消息缓存在activeMq队列中
*/
@PostMapping("/send")
public String send(@RequestParam String to,
@RequestParam String subject,
@RequestParam String content) {
Map<String, String> map = new HashMap<>();
map.put("to", to);
map.put("subject", subject);
map.put("content", content);
String msg = JSONObject.toJSONString(map); mailProducer.send(msg);
return "success";
} }
通过请求 /test/send 接口,通过调用邮件消息生产者,将想要发送的邮件信息缓存在activeMq的email.queue队列中,
由邮件消息消费者调用邮件服务类发送邮件
邮件消息生产者:
/**
* 邮件消息生产者
*/
@Component
public class MailProducer { @Autowired
private JmsMessagingTemplate jmsMessagingTemplate; @Autowired
@Qualifier("emailQueue")
private Queue emailQueue; public void send(String msg) {
this.jmsMessagingTemplate.convertAndSend(this.emailQueue, msg);
} }
邮件消息消费者:
/**
* 邮件消息消费者
*/
@Component
public class MailConsumer { @Autowired
private MailService mailService; @JmsListener(destination = "email.queue")
public void receiveQueue(String text) {
System.out.println("消费邮件消息:" + text);
// 将activeMq email.queue队列中的邮件消息发送至接收者邮箱
JSONObject jsonObject = JSONObject.parseObject(text);
String to = jsonObject.getString("to");
String subject = jsonObject.getString("subject");
String content = jsonObject.getString("content");
mailService.sendEmail(to, subject, content);
} }
启动项目测试接口:
发送post请求

初次调用接口会报这个错误:邮箱不可用 550 User has no permission
可以参考这篇文章解决问题:https://blog.csdn.net/Hughnes/article/details/52070878
邮箱不可用 550 User has no permission
当传入发送邮箱正确的用户名和密码时,总是收到到:550 User has no permission这样的错误,
其实我们用Java发送邮件时相当于自定义客户端根据用户名和密码进行登录,然后使用SMTP服务发送邮件。但新注册的163邮件默认是不开启客户端授权验证的(对自定的邮箱大师客户端默认开启),
因此登录总是会被拒绝,验证没有权限。解决办法是进入163邮箱,进入邮箱中心——客户端授权密码,选择开启即可,如下截图

设置完毕后,在代码中用使用客户端授权密码代替原始的邮箱密码,这样就可以正确的发送邮件了。
继续发送post请求,观察结果

邮箱收到邮件:

spring boot + activeMq 邮件服务的更多相关文章
- Spring Boot :邮件服务
简单使用 1.pom 包配置 pom 包里面添加 spring-boot-starter-mail 包引用 <dependencies> <dependency> <gr ...
- Spring Boot实现邮件服务,附常见邮箱的配置
1. pom.xml文件中引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <art ...
- spring boot(十)邮件服务
springboot仍然在狂速发展,才五个多月没有关注,现在看官网已经到1.5.3.RELEASE版本了.准备慢慢在写写springboot相关的文章,本篇文章使用springboot最新版本1.5. ...
- spring boot和邮件服务
1.运行环境 开发工具:intellij idea JDK版本:1.8 项目管理工具:Maven 4.0.0 2.GITHUB地址
- Spring Boot Admin实现服务健康预警
Over View 上一篇文章主要介绍了Spring Boot Admin的概况以及我们如何在系统中引入和使用Spring Boot Admin,以此来帮助我们更加了解自己的系统,做到能快速发现.排查 ...
- 一文读懂 Spring Boot、微服务架构和大数据治理三者之间的故事
微服务架构 微服务的诞生并非偶然,它是在互联网高速发展,技术日新月异的变化以及传统架构无法适应快速变化等多重因素的推动下诞生的产物.互联网时代的产品通常有两类特点:需求变化快和用户群体庞大,在这种情况 ...
- 如何做自己的服务监控?spring boot 2.x服务监控揭秘
Actuator是spring boot项目中非常强大一个功能,有助于对应用程序进行监视和管理,通过 restful api请求来监管.审计.收集应用的运行情况,针对微服务而言它是必不可少的一个环节. ...
- 一文读懂spring boot 和微服务的关系
欢迎访问网易云社区,了解更多网易技术产品运营经验. Spring Boot 和微服务没关系, Java 微服务治理框架普遍用的是 Spring Cloud. Spring Boot 产生的背景,是开发 ...
- Spring Boot、微服务架构和大数据
一文读懂 Spring Boot.微服务架构和大数据治理三者之间的故事 https://www.cnblogs.com/ityouknow/p/9034377.html 微服务架构 微服务的诞生并非偶 ...
随机推荐
- webAPP制作框架Ionic--构建APP侧边栏 底部选项卡 轮播图 加载动画
超好用的移动框架--Ionic Ionic是一个轻量的手机UI库,具有速度快,界面现代化.美观等特点. 为了解决其他一些UI库在手机上运行缓慢的问题,它直接放弃了IOS6和Android4.1以下的版 ...
- java中的常用内存区域总结
<开发实战经典> (1)栈内存空间:保存所有的对象名称 (2)堆内存空间:保存每个对象的具体属性内容 (3)全局数据区:保存static类型的属性 (4)全 ...
- 织梦dedecms手机版上下篇链接错误的解决方法
打开 \include\arc.archives.class.php 1. 找到 $this->PreNext['pre'] = "上一篇:<a href='$mlink'> ...
- Nginx和Apache服务器上配置反向代理
在实际项目过程中,由于网站要用到一个在线编辑器(个性化的在线编辑软件),需要跨域进行通信!由于跨域通信较多,所以当时就想到在网站服务器上代理编辑软件的请求! 这就是“反向代理”的实际需求! 一.Ngi ...
- javaSe-线程2
package com.java.chap09.sec02; public class Thread3 implements Runnable{ private int baoZi=1; privat ...
- windows网络和共享中心“查看基本网络信息并设置连接”为“未知”的解决方案
存在问题“查看基本网络信息并设置连接”为“未知”.如图所示: 解决步骤 运行services.msc 启动Network List Service 若无法启动,打开其属性,选择“登录”选项卡,将启动类 ...
- 用dfs求解八皇后问题
相信大家都已经很熟悉八皇后问题了,就是指:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法.主要思路:按行进行深度优先搜索,在该 ...
- 《毛毛虫团队》第七次作业:团队项目设计完善&编码
一:实验名称:团队项目设计完善&编码 二:实验目的与要求 掌握软件编码实现的工程要求. 三:实验步骤 任务一:团队软件项目设计完善: 任务二:团队软件项目编码实现: 任务三:在团队博客发布博文 ...
- javaweb基础(4)_http协议
一.什么是HTTP协议 HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的 ...
- VS快捷键总结(开发中经常遇到)
1.窗口快捷键 (大家有没有发现但凡跟窗口挂上钩的快捷键当中都有一个W,那是因为W代表Windows也就是窗口的意思) Ctrl+W,W: 浏览器窗口 (浏览橱窗用有道的翻译是window shop ...