@ TOC
一、导入必要的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
二、连接 rabbit mq
1) 创建一个 docker 容器
docker run -di –name htb_rabbit -e RABBITMQ_DEFAULT_USER=xxx -e RABBITMQ_DEFAULT_PASS=xxx -p 15672:15672 -p 5672:5672 -p 25672:25672 -p
61613:61613 -p 1883:1883 rabbitmq:management
命令解释:上述的命令创建了一个 rabbitmq 容器 -d 后台运行的守护容器 -i 启动容器 –name 容器的名称 -e 设置容器的环境变量 用户名 密码 -p 映射一些端口给rabbit mq 使用
前面是 暴露的外部宿主机的端口,后面是容器内部使用的端口,一般保持一致即可
rabbitmq:management 镜像名称
2 )打开 rabbit mq 的可视化界面
选择 15672 端口 宿主机的IP+ 端口号 输入刚刚配置的用户名和密码, 即可登录
三、构建 java 代码环境
- rabbit mq 的配置
spring: rabbitmq:
port: 5672 username: admin password: admin
host: 192.168.xxx.xxx
mail:
username: 邮箱地址 password: 授权码,可以百度 host: smtp.xxx.com default-encoding: UTF-8 jndi-name: mail/Session
授权码参考百度
- 写一个配置类,用于构建 rabbit mq 的队列和交换器的绑定关系 ( 可以通过操作界面绑定 )
package com.htb.beidawebspringboot16rabbitmq.config;
import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.BindingBuilder; import org.springframework.amqp.core.FanoutExchange; import org.springframework.amqp.core.Queue;
import org.springframework.context. annotation .Bean;
import org.springframework.context.annotation.Configuration;
/**
@Description:初始化rabbitmq邮箱队列和交换器的配置类
@Author 16221
* @Date 2020/5/8
**/ @Configuration
public class MsgConfig {
/**
创建队列@return
*/ @Bean
public Queue emailQueue() {
return new Queue("emailQueue");
}
/**
创建交换器@return
*/ @Bean
public FanoutExchange fanoutExchange() {
return new FanoutExchange("emailFanoutExchange");
}
/**
创建绑定关系@param queue@param fanoutExchange@return
*/ @Bean
public Binding binding(Queue queue, FanoutExchange fanoutExchange) { return BindingBuilder.bind(queue).to(fanoutExchange);
}
}
- 创建一个 rabbit mq 的监听类,用于监听,队列的变化
package com.htb.beidawebspringboot16rabbitmq.msg;
import com.htb.beidawebspringboot16rabbitmq.entity.User;
import com.htb.beidawebspringboot16rabbitmq.utils.SendEmailUtil; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component;
import javax.annotation. Resource ;
/**
@Description:
@Author 16221
* @Date 2020/5/8
**/ @Component
public class MsgListener {
@Resource
private SendEmailUtil sendEmailUtil;
@RabbitListener(queues = "emailQueue") public void getSendMsg(User user) {
String content = "<h3>您正在注册天珩的网站</h3>\n" + "\t\t<h3>您注册的id是 " + user.getId() + "</h3>\n" +
"\t\t<h3>您注册的邮箱是 " + user.getEmail() + "</h3>\n" + "\t\t<h3>请点击下方的链接激活邮箱</h3>\n" +
"<a href=\"#34; + user.getId()
+ "\"" + ">激活邮箱</a>";
sendEmailUtil.sendHtmlMail(user.getEmail(), "注册", content);
System.out.println("RabbitListener " + user.toString());
}
}
@RabbitListener(queues = “emailQueue”)
- 这个注解表示监听的是 emailQueue 队列的变化,消费队列里面的消息
本类的逻辑是 监听的是 emailQueue 队列的变化,消费队列里面的消息,在监听到变化时候,说明有新的消息进入,需要消费消息,发送注册邮件
sendEmailUtil.sendHtmlMail(user.getEmail(), “注册”, content);
- 发送邮件的工具类,相对固定的代码
package com.htb.beidawebspringboot16rabbitmq.utils;
import org.springframework.beans. factory .annotat io n.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMail message ; import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.messaging.MessagingException; import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct; import javax.annotation.Resource; import javax.mail.internet.MimeMessage; import java.io.File;
/**
@Description:
@Author 16221
* @Date 2020/5/8
**/ @Component
public class SendEmailUtil {
/**
*
*/ @Resource
@Value("${spring.mail.username}") private String from;
@Resource
private JavaMailSender mailSender;
/**
发送支持html格式的邮件
*
@param to
@param subject
@param content
*/
public void sendHtmlMail(String to, String subject, String content) {
//使用MimeMessage,MIME协议
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper;
//MimeMessageHelper帮助我们设置更丰富的内容 try {
helper = new MimeMessageHelper(message, true); helper.setFrom(from);
helper.setTo(to); helper.setSubject(subject);
//true代表支持html
helper.setText(content, true); mailSender.send(message);
System.out.println("发送HTML邮件成功");
} catch (javax.mail.MessagingException e) { System.out.println("发送HTML邮件失败:" + e); e.printStackTrace();
}
}
/**
发送简单的文本格式的邮件
*
@param to
@param subject
@param content
*/
public void sendSimpleMail(String to, String subject, String content) {
SimpleMailMessage message = new SimpleMailMessage();
//收信人message.setTo(to);
//主题message.setSubject(subject);
//内容message.setText(content);
//发信人message.setFrom(from);
mailSender.send(message);
}
/**
发送带附件的邮件
*
@param to
@param subject
@param content
@param filePath
*/
public void sendAttachmentMail(String to, String subject, String content, String filePath) {
MimeMessage message = mailSender.createMimeMessage(); MimeMessageHelper helper;
try {
helper = new MimeMessageHelper(message, true);
//true代表支持多组件,如附件,图片等 helper.setFrom(from); helper.setTo(to); helper.setSubject(subject); helper.setText(content, true);
FileSystemResource file = new FileSystemResource(new File(filePath));
String fileName = file.getFilename();
//添加附件,可多次调用该方法添加多个附件
helper.addAttachment(fileName, file); mailSender.send(message); System.out.println("发送带附件邮件成功");
} catch (javax.mail.MessagingException ex) { ex.printStackTrace();
}
}
/**
发送带图片的邮件
*
@param to
@param subject
@param content
@param rscPath
@param rscId
*/
public void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId) {
MimeMessage message = mailSender.createMimeMessage(); MimeMessageHelper helper;
try {
helper = new MimeMessageHelper(message, true); helper.setFrom(from);
helper.setTo(to); helper.setSubject(subject); helper.setText(content, true);
FileSystemResource res = new FileSystemResource(new File(rscPath));
//重复使用添加多个图片helper.addInline(rscId, res); mailSender.send(message); System.out.println("发送带图片邮件成功");
} catch (javax.mail.MessagingException ex) { System.out.println("发送带图片邮件失败 " + ex); ex.printStackTrace();
}
}
}
- 给 rabbit mq 的队列发送消息
rabbitTemplate.convertAndSend(“emailFanoutExchange”,””,user); 接收到消息之后,就会异步地去发送邮件,这个是service层的部分的代码
成功之后,yml 配置的邮箱 可以接收到对应的邮件