如何使用ActiveMQ中间件方式发送邮件

前言

在大型互联网公司中,一般都会搭建内部的消息服务平台,处理公司内部的各种消息服务,比如:发送邮件、发送短信、微信推送等,公司内部消息平台再去调用第三发消息平台。消息服务平台的接口有两种:同步和异步,同步需求一般是需要返回调用第三方平台是否成功,否则都采用异步的。
公司内部消息服务平台
【如何使用ActiveMQ中间件方式发送邮件】如何使用ActiveMQ中间件方式发送邮件
文章图片

调用内部消息服务平台,使用消息中间件
发送消息一般都会做消息模板,调用的时候传模板id
如何使用ActiveMQ中间件方式发送邮件
文章图片

整合Eamil实现异步发送邮件信息 采用163邮件接口,先注册163邮箱,并开通pop3协议,此时会有一个授权码,发送内容不能带有广告,否则会被163拦截,导致发送失败。
场景:会员服务调用内部消息服务平台发送邮件
会员服务(生产者)
Maven依赖
org.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-activemqcom.alibabafastjsonLATEST

YML配置文件
spring:activemq:broker-url: tcp://127.0.0.1:61616# ActiveMQ消息中间件服务器通讯地址user: admin# 用户名password: admin#密码queue: springboot-queue#自定义队列名,等下程序中会用到server:port: 8080

配置类
@Configurationpublic class QueueConfig {//获取队列名@Value("${queue}")private String queue; //注册bean@Beanpublic Queue logQueue() {return new ActiveMQQueue(queue); }}

创建Producer
@Component@EnableSchedulingpublic class Producer {@Autowiredprivate JmsMessagingTemplate jmsMessagingTemplate; @Autowiredprivate Queue queue; //每隔5秒向消息队列发送消息@Scheduled(fixedDelay = 5000)public void send(){//用户名,封装邮件内容时使用String userName = "张三"+ new Random().nextInt(20); //指定发送到哪个邮箱 (邮件接收者邮箱)String email = "593****77@qq.com"; JSONObject jsonObject = new JSONObject(); jsonObject.put("userName",userName); jsonObject.put("email",email); //将发送的消息转换为Json字符串String msg = jsonObject.toJSONString(); System.out.println("生产者向消费者发送内容:" +msg); jmsMessagingTemplate.convertAndSend(queue,msg); }}

启动类
@EnableScheduling@SpringBootApplicationpublic class ActivemqQueueApplication {public static void main(String[] args) {SpringApplication.run(ActivemqQueueApplication.class, args); }}

消息服务平台(消费者)
Maven依赖
org.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-activemqorg.springframework.bootspring-boot-starter-mailorg.apache.commonscommons-lang3com.alibabafastjsonLATEST

YML配置文件
spring:activemq:# ActiveMQ消息中间件服务器通讯地址broker-url: tcp://127.0.0.1:61616user: admin# 用户名password: admin#密码# 发送邮件配置mail:# 邮件服务器地址host: smtp.163.com# 邮箱用户名(邮件发送者)username: *********@163.com# 授权码,163邮箱开通协议时设置的那个授权码,不是登录密码password: wx1**********3enable:truesmtp:auth: truestarttls:enable: truerequired: true#自定义队列名属性,等下程序中会用到(以生产者的队列名一致)queue: springboot-queueserver:port: 8081

创建Consumer
@Componentpublic class Consumer{@Autowiredprivate JavaMailSender javaMailSender; @Value("${spring.mail.username}") //发送方邮箱private String toEmail; @JmsListener(destination = "${queue}")//监听的队列,配置文件中的queue属性public void receive(String msg){if(StringUtils.isEmpty(msg)){return; }System.out.println("收到生产者消息:"+msg); JSONObject jsonObject = JSONObject.parseObject(msg); String userName = jsonObject.getString("userName"); String eamil = jsonObject.getString("eamil"); //发送邮件sendEmail(userName,toEmail); }/*** 发送简单邮件* @param userName用户名,用户封装邮件内容* @param toEmail 通过哪个邮箱发送* @return*/public String sendEmail(String userName,String toEmail){//发送消息对象SimpleMailMessage message = new SimpleMailMessage(); //发送者message.setFrom(toEmail); //接收者message.setTo(toEmail); //主题(标题)message.setSubject("尊敬的"+userName); //内容message.setText("欢迎使用您使用本公司的产品!"); //发送html,发送html格式源码javaMailSender.send(message); System.out.println("邮件发送完成:"+ JSONObject.toJSONString(message)); return"send success!"; }}

启动类
@SpringBootApplicationpublic class ActivemqQueueConsumerApplication {public static void main(String[] args) {SpringApplication.run(ActivemqQueueConsumerApplication.class, args); }}

测试
  • 启动会员服务和消息服务平台服务
  • 注意:启动前保证消息队列里面没有消息,有的话则先删除该队列,否则容易造成数据类型不一致导致Json解析异常出错。
会员服务:
如何使用ActiveMQ中间件方式发送邮件
文章图片

消息服务平台:
如何使用ActiveMQ中间件方式发送邮件
文章图片

此时消息服务平台发送邮件成功!
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

    推荐阅读