소스 검색

原始代码 2022/10/8

lwhhszx 3 년 전
커밋
f55ea45518

+ 69 - 0
pom.xml

@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.7.4</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+    <groupId>com.example</groupId>
+    <artifactId>Common</artifactId>
+    <version>1.0</version>
+    <name>MSS</name>
+    <description>Demo project for Spring Boot</description>
+    <properties>
+        <fastjson.version>2.0.0</fastjson.version>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
+        <!--rabbitmq-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-amqp</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-mail</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>${fastjson.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+
+                </configuration>
+            </plugin>
+
+        </plugins>
+    </build>
+
+</project>

+ 15 - 0
src/main/java/com/example/common/CommonApplication.java

@@ -0,0 +1,15 @@
+package com.example.common;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class CommonApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(CommonApplication.class, args);
+
+
+    }
+
+}

+ 30 - 0
src/main/java/com/example/common/Service/EmailService.java

@@ -0,0 +1,30 @@
+package com.example.common.Service;
+
+
+import com.alibaba.fastjson.JSON;
+import com.example.common.Util.MailUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+/**
+ * @author 李仁杰
+ * @date 2022-8-16
+ * @description 发送邮件类 Service 层
+ */
+
+@Service
+@RequiredArgsConstructor(onConstructor_ = {@Lazy})
+public class EmailService {
+    private final MailUtils mailUtils;
+
+
+    @RabbitListener(queues = "mail.queue")
+    public void sendEmailMessage(Map<String,Object> map ){
+        mailUtils.sendEmailMessage(map);
+    }
+
+}

+ 95 - 0
src/main/java/com/example/common/Util/MailUtils.java

@@ -0,0 +1,95 @@
+package com.example.common.Util;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.FileSystemResource;
+import org.springframework.mail.javamail.JavaMailSender;
+import org.springframework.mail.javamail.MimeMessageHelper;
+import org.springframework.messaging.MessagingException;
+import org.springframework.stereotype.Component;
+
+import javax.mail.internet.MimeMessage;
+import java.io.*;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+@Component
+public class MailUtils {
+    @Value("${spring.mail.username}")
+    private String sendEmail;
+
+    public String buildContent(String template, List<String> values) {
+        //加载邮件html模板
+        ClassPathResource resource = new ClassPathResource(template);
+        InputStream inputStream = null;
+        BufferedReader fileReader = null;
+        StringBuffer buffer = new StringBuffer();
+        String line;
+        try {
+            inputStream = resource.getInputStream();
+            fileReader = new BufferedReader(new InputStreamReader(inputStream));
+            while ((line = fileReader.readLine()) != null) {
+                buffer.append(line);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            //log.info("发送邮件读取模板失败{}", e);
+        } finally {
+            if (fileReader != null) {
+                try {
+                    fileReader.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (inputStream != null) {
+                try {
+                    inputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+
+        String[] arr = values.toArray(new String[values.size()]);
+        //替换html模板中的参数
+        return MessageFormat.format(buffer.toString(),arr);
+    }
+    @Autowired
+    private JavaMailSender javaMailSender;
+
+    /**
+     * 向用户邮箱发送短信
+     *
+     * @param map 收件人邮箱
+     */
+    public void sendEmailMessage(Map<String,Object> map) {
+        MimeMessage message = javaMailSender.createMimeMessage();
+        try {
+            //邮箱发送内容组成
+           FileSystemResource img = new FileSystemResource(new File(System.getProperty("user.dir") + map.get("img")));
+            MimeMessageHelper helper = new MimeMessageHelper(message, true);
+            helper.setSubject(map.get("title").toString());
+            Set<String> keys = map.keySet();
+           List<String> values = new ArrayList<>();
+            for(String key:keys){
+                if(key.contains("value")){
+                 values.add(map.get(key).toString());
+                }
+            }
+
+
+            helper.setText(buildContent(map.get("template").toString(), values), true);
+            helper.setTo(map.get("email").toString());
+          helper.addInline("logo", img);
+            helper.setFrom(sendEmail);
+            javaMailSender.send(message);
+        } catch (MessagingException | javax.mail.MessagingException e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 24 - 0
src/main/java/com/example/common/common/MailConstants.java

@@ -0,0 +1,24 @@
+package com.example.common.common;
+
+public class MailConstants {
+    //消息投递中
+    public static final Integer DELIVERING = 0;
+    //消息投成功
+    public static final Integer SUCCESS = 1;
+    //消息投递失败
+    public static final Integer FAILURE = 2;
+
+    //最大重试次数
+    public static final Integer MAX_TRY_COUNT = 2;
+
+    //消息超时时间
+    public static final Integer MSG_TIMEOUT = 1;
+
+    //队列
+    public static final String MAIL_QUEUE_NAME = "mail.queue";
+    //交换机
+    public static final String MAIL_EXCHANGE_NAME = "mail.exchange";
+    //路由键
+    public static final String MAIL_ROUTING_KEY_NAME = "mail.routing.key";
+
+}

+ 77 - 0
src/main/java/com/example/common/common/RabbitMQConfig.java

@@ -0,0 +1,77 @@
+package com.example.common.common;
+
+
+
+
+import org.slf4j.LoggerFactory;
+import org.springframework.amqp.core.*;
+import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
+import org.springframework.amqp.rabbit.connection.CorrelationData;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Component;
+
+
+@Component
+public class RabbitMQConfig {
+
+    @Autowired
+    private CachingConnectionFactory cachingConnectionFactory;
+
+//    @Autowired
+//    private IMailLogService mailLogService;
+
+    @Bean
+    public RabbitTemplate rabbitTemplate(){
+        RabbitTemplate rabbitTemplate = new RabbitTemplate(cachingConnectionFactory);
+        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
+            /**
+             * 消息确认回调
+             * @param data 消息唯一标识
+             * @param ack  确认结果
+             * @param cause  失败原因
+             */
+            @Override
+            public void confirm(CorrelationData data, boolean ack, String cause) {
+                String msgId = data.getId();
+                if (ack){
+//                    LOGGER.info("{}======>消息发送成功",msgId);
+//                    mailLogService.update(new UpdateWrapper<MailLog>()
+//                            .set("status",MailConstants.SUCCESS)
+//                            .eq("msgId",msgId));
+                }else{
+                }
+            }
+        });
+        rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
+            /**
+             * 消息失败回调
+             * @param message  消息主题
+             * @param replyCode  响应码
+             * @param replyText  响应描述
+             * @param exchange  交换机
+             * @param routingKey  路由键
+             */
+            @Override
+            public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
+            }
+        });
+
+        return rabbitTemplate;
+    }
+
+
+    @Bean
+    public Queue queue(){
+        return new Queue(MailConstants.MAIL_QUEUE_NAME);
+    }
+    @Bean
+    public DirectExchange directExchange(){
+        return new DirectExchange(MailConstants.MAIL_EXCHANGE_NAME);
+    }
+    @Bean
+    public Binding binding(){
+        return BindingBuilder.bind(queue()).to(directExchange()).with(MailConstants.MAIL_ROUTING_KEY_NAME);
+    }
+}

+ 35 - 0
src/main/resources/application.yml

@@ -0,0 +1,35 @@
+server:
+  servlet:
+    context-path: /
+  port: 1111
+spring:
+  thymeleaf:
+    cache: false
+    mode: HTML5
+    # 使用 smtp 协议
+  mail.protocol: smtp
+  mail.host: smtp.qq.com
+  mail.port: 587
+  mail.username: 2232623707@qq.com
+  # 授权码
+  mail.password: tcofjmtemsmedibf
+  mail.test-connection: false
+  mail.properties.mail.smtp.auth: false
+  mail.properties.mail.debug: false
+  mail.properties.mail.mime.splitlongparameters: false
+  mail.default-encoding: UTF-8
+# rabbitmq
+  rabbitmq.host: 47.101.137.223
+  rabbitmq.port: 5672
+  rabbitmq.username: admin
+  rabbitmq.password: 123456
+  # 开启confirms回调 P -> Exchange
+  rabbitmq.prabbitmq.publisher-confirms: true
+  # 开启returnedMessage回调 Exchange -> Queue
+  rabbitmq.publisher-returns: true
+  # 设置手动确认(ack) Queue -> C
+  rabbitmq.listener.simple.acknowledge-mode: manual
+  rabbitmq.listener.simple.prefetch: 100
+
+authorUrl: http://192.168.0.56:8880
+

+ 63 - 0
src/main/resources/mail/email.html

@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="description" content="email code">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <title>邮件</title>
+</head>
+<!--邮箱验证码模板-->
+<body>
+<div style="background-color:#ECECEC; padding: 35px;">
+    <table style="width: 800px;height: 100%; margin: 0 auto; text-align: left; position: relative; border-radius: 5px;font-size: 14px; font-family:微软雅黑, 黑体,serif; line-height: 1.5; box-shadow: rgb(153, 153, 153) 0 0 5px; border-collapse: collapse; background: #fff initial initial initial initial;">
+        <tbody>
+        <tr>
+            <th style="height: 25px; line-height: 25px; padding: 15px 35px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: RGB(148,0,211); background-color: RGB(148,0,211); border-radius: 5px 5px 0 0;">
+                <img src="cid:logo" alt="logo" style="width: 110px; height: 35px;">
+            </th>
+        </tr>
+        <tr>
+            <td style="word-break:break-all">
+                <div style="padding:25px 35px 40px; background-color:#fff;opacity:0.8;">
+                    <h2 style="margin: 5px 0; ">
+                        <span style="line-height: 20px;  color: #333333; ">
+                            <span style="line-height: 22px; font-size: medium; ">
+                                尊敬的用户 {0}:
+                            </span>
+                        </span>
+                    </h2>
+                    <!-- 中文 -->
+                    <p>您好! 感谢您使用我们的产品, 您的密码已重置</p>
+                    <p><span style="font-size:18px;font-weight:800">新密码:</span><span style="color: #ff8c00; ">{1}</span>
+                    </p>
+                    <br>
+                    <!-- 英文 -->
+                    <h2 style="margin: 5px 0; ">
+                        <span style="line-height: 20px;  color: #333333; ">
+                            <span style="line-height: 22px;  font-size: medium; ">
+                                Dear user {0}:
+                            </span>
+                        </span>
+                    </h2>
+                    <p>Hello! Thanks for using our products, Your password has been reset, the new password is:<span
+                            style="color: #ff8c00; ">{1}</span>
+                    </p>
+                    <div style="width:100%;margin:0 auto;">
+                        <div style="padding:10px 10px 0;border-top:1px solid #ccc;color:#747474;margin-bottom:20px;line-height:1.3em;font-size:12px;">
+                            <p>威世博团队</p>
+                            <p>如果您有其他使用上的问题,请联系我们:********</p>
+                            <br>
+                            <p>此为系统邮件,请勿回复<br>Please do not reply to this system email
+                            </p>
+                        </div>
+                    </div>
+                </div>
+            </td>
+        </tr>
+        </tbody>
+    </table>
+</div>
+</body>
+</html>
+

BIN
src/main/resources/mail/logo.png


+ 13 - 0
src/test/java/com/example/common/CommonApplicationTests.java

@@ -0,0 +1,13 @@
+package com.example.common;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class CommonApplicationTests {
+
+    @Test
+    void contextLoads() {
+    }
+
+}