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 微服务架构 微服务的诞生并非偶 ...
随机推荐
- 使用一条sql语句查询多表的总数
SELECT sum(列名1) 列名1,sum(列名2) 列名2,sum(列名3) 列名3 FROM ( SELECT count(*) 列名1, 列名2, 列名3 FROM 表1 -- WHERE ...
- PreparementStatement接口
1.SQL注入问题在以前过程中,总是采取拼接SQL语句的方式,来实现数据的增删改查! String Sql=select * from user where username="" ...
- Kendo 单页面应用(一)概述
Kendo 单页面应用(一)概述 Kendo 单页面应用(Single-Page Application,缩写为 SPA)定义了一组类用于简化 Web 应用(Rich Client)开发,最常见的单页 ...
- 用Python完成根据日期计算是星期几
import datetime def week(year,month,day): someday=dayetime.date(year,month,day) result={ "0&quo ...
- 数据库之游标过程-- 基于MySQL
实例如下: DROP PROCEDURE IF EXISTS pr_change_station_user_acct_his; -- 如果存在存储过程,即删除存储过程 create procedure ...
- LINQ新添知识
linquser.ExecuteCommand("TRUNCATE TABLE Board"); linquser.ExecuteCommand("DELET ...
- python 之网页解析器
一.什么是网页解析器 1.网页解析器名词解释 首先让我们来了解下,什么是网页解析器,简单的说就是用来解析html网页的工具,准确的说:它是一个HTML网页信息提取工具,就是从html网页中解析提取出“ ...
- servlet forword服务器端跳转
web.xml中配置servlet的映射和访问路径 <?xml version="1.0" encoding="UTF-8"?><web-ap ...
- python爬虫之路——Python的re模块及其方法
介绍常用的三种方法:search(),sub(),findall() search():匹配并提取第一个符合规律的内容,然后返回一个正则表达式的对象 #提取字符串中的第一个数字 import re a ...
- 如何使用Java代码给图片增加倒影效果
效果 倒影率为90%时的效果: 倒影率10%时的效果: 实现原理 倒影率作为参数rate 传入Reflection button的事件处理函数: CreateImageWithReflection这个 ...