如何使用ActiveMQ中間件方式發送郵件
前言
在大型互聯網公司中,一般都會搭建內部的消息服務平臺,處理公司內部的各種消息服務,比如:發送郵件、發送短信、微信推送等,公司內部消息平臺再去調用第三發消息平臺。消息服務平臺的接口有兩種:同步和異步,同步需求一般是需要返回調用第三方平臺是否成功,否則都采用異步的。
公司內部消息服務平臺
調用內部消息服務平臺,使用消息中間件
發送消息一般都會做消息模板,調用的時候傳模板id
整合Eamil實現異步發送郵件信息
采用163郵件接口,先註冊163郵箱,並開通pop3協議,此時會有一個授權碼,發送內容不能帶有廣告,否則會被163攔截,導致發送失敗。
場景:會員服務調用內部消息服務平臺發送郵件
會員服務(生產者)
Maven依賴
<!-- SpringBoot整合web組件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- ActiveMQ依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency> <!-- FastJson工具包 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>LATEST</version> </dependency>
YML配置文件
spring: activemq: broker-url: tcp://127.0.0.1:61616 # ActiveMQ消息中間件服務器通訊地址 user: admin # 用戶名 password: admin #密碼 queue: springboot-queue #自定義隊列名,等下程序中會用到 server: port: 8080
配置類
@Configuration public class QueueConfig { //獲取隊列名 @Value("${queue}") private String queue; //註冊bean @Bean public Queue logQueue() { return new ActiveMQQueue(queue); } }
創建Producer
@Component @EnableScheduling public class Producer { @Autowired private JmsMessagingTemplate jmsMessagingTemplate; @Autowired private Queue queue; //每隔5秒向消息隊列發送消息 @Scheduled(fixedDelay = 5000) public void send(){ //用戶名,封裝郵件內容時使用 String userName = "張三"+ new Random().nextInt(20); //指定發送到哪個郵箱 (郵件接收者郵箱) String email = "593****[email protected]"; 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 @SpringBootApplication public class ActivemqQueueApplication { public static void main(String[] args) { SpringApplication.run(ActivemqQueueApplication.class, args); } }
消息服務平臺(消費者)
Maven依賴
<!-- SpringBoot整合Web組件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- activemq依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency> <!-- SpringBoot 整合Emai --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> <!-- 工具包 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>LATEST</version> </dependency>
YML配置文件
spring: activemq: # ActiveMQ消息中間件服務器通訊地址 broker-url: tcp://127.0.0.1:61616 user: admin # 用戶名 password: admin #密碼 # 發送郵件配置 mail: # 郵件服務器地址 host: smtp.163.com # 郵箱用戶名(郵件發送者) username: *********@163.com # 授權碼,163郵箱開通協議時設置的那個授權碼,不是登錄密碼 password: wx1**********3 enable: true smtp: auth: true starttls: enable: true required: true #自定義隊列名屬性,等下程序中會用到(以生產者的隊列名一致) queue: springboot-queue server: port: 8081
創建Consumer
@Component public class Consumer{ @Autowired private 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!"; } }
啟動類
@SpringBootApplication public class ActivemqQueueConsumerApplication { public static void main(String[] args) { SpringApplication.run(ActivemqQueueConsumerApplication.class, args); } }
測試
- 啟動會員服務和消息服務平臺服務
- 註意:啟動前保證消息隊列裡面沒有消息,有的話則先刪除該隊列,否則容易造成數據類型不一致導致Json解析異常出錯。
會員服務:
消息服務平臺:
此時消息服務平臺發送郵件成功!
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- spring boot學習筆記之操作ActiveMQ指南
- springboot Actuator的指標監控可視化功能詳解
- 五分鐘解鎖springboot admin監控新技巧
- SpringBoot環境Druid數據源使用及特點
- Spring Boot Admin 快速入門詳解