Sfoglia il codice sorgente

fix 多邮箱配置

zoujiajian 3 anni fa
parent
commit
025e274428

+ 18 - 0
netflix-common/src/main/java/com/cyksj/common/util/StringUtil.java

@@ -6,6 +6,7 @@ import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Random;
 
 /**
  * @author  chan 字符串操作辅助类
@@ -408,4 +409,21 @@ public final class StringUtil {
 			sb.append(randomStr.charAt(number));
 		}
 	}
+
+	/**
+	 * 生成4位\6位随机数
+	 */
+	public static String getRandomCodeStr(Integer digit) {
+		if (null == digit) {
+			digit = 6;
+		}
+		String code;
+		// 生成验证码
+		if (digit == 4) {
+			code = new Random().nextInt(8999) + 1000 + "";
+		} else {
+			code = new Random().nextInt(899999) + 100000 + "";
+		}
+		return code;
+	}
 }

+ 7 - 0
netflix-dao/src/main/java/com/cyksj/mapper/EmailConfigMapper.java

@@ -0,0 +1,7 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.EmailConfig;
+
+public interface EmailConfigMapper extends BaseMapper<EmailConfig> {
+}

+ 22 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/EmailConfig.java

@@ -0,0 +1,22 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class EmailConfig extends BaseEntity{
+	private String host;
+
+	private Integer port;
+
+	private String protocol;
+
+	private String username;
+
+	private String password;
+
+	private String defaultEncoding;
+
+	private String source;
+}

+ 5 - 0
netflix-service/pom.xml

@@ -29,6 +29,11 @@
             <artifactId>spring-boot-configuration-processor</artifactId>
             <optional>true</optional>
         </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-mail</artifactId>
+        </dependency>
     </dependencies>
 
 </project>

+ 12 - 0
netflix-service/src/main/java/com/cyksj/service/emial/EmailService.java

@@ -0,0 +1,12 @@
+package com.cyksj.service.emial;
+
+
+public interface EmailService {
+
+	Boolean sendEmail(String toAddress, Integer digit);
+
+	/**
+	 * 重新配置了邮箱之后 重新初始化
+	 */
+	void reSenders();
+}

+ 116 - 0
netflix-service/src/main/java/com/cyksj/service/emial/impl/EmailServiceImpl.java

@@ -0,0 +1,116 @@
+package com.cyksj.service.emial.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.util.StringUtil;
+import com.cyksj.mapper.EmailConfigMapper;
+import com.cyksj.model.entity.EmailConfig;
+import com.cyksj.redis.RedisService;
+import com.cyksj.service.emial.EmailService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.mail.SimpleMailMessage;
+import org.springframework.mail.javamail.JavaMailSenderImpl;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+import java.util.concurrent.ThreadLocalRandom;
+
+@Service
+@RequiredArgsConstructor
+public class EmailServiceImpl implements EmailService {
+	private final EmailConfigMapper emailConfigMapper;
+
+	private final RedisService redisService;
+
+	private List<JavaMailSenderImpl> senders = new ArrayList<>();
+
+	@Override
+	public Boolean sendEmail(String toAddress,Integer digit) {
+		SimpleMailMessage message = null;
+		try {
+			// 生成验证码
+			String code = StringUtil.getRandomCodeStr(digit);
+			String subject = "【银河录像局】登录验证码";
+
+			String content = String.format("尊敬的用户,您的验证码为%s,此验证码仅用于银河录像。【银河录像局】", code);
+			JavaMailSenderImpl javaEmailServer = getJavaEmailServer();
+			message = new SimpleMailMessage();
+			message.setFrom(javaEmailServer.getUsername());
+			message.setTo(toAddress);
+			message.setSubject(subject);
+			message.setText(content);
+			if (true) {
+				throw new NullPointerException();
+			}
+			javaEmailServer.send(message);
+			return true;
+		} catch (Exception e) {
+			return retry(message);
+		}
+	}
+
+	@Override
+	public void reSenders() {
+		senders.clear();
+	}
+
+
+	/**
+	 * 获取邮箱客户端
+	 */
+	@PostConstruct
+	public void init() {
+		List<EmailConfig> emailConfigs = emailConfigMapper.selectList(null);
+		emailConfigs.forEach(emailConfig->{
+			JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
+			javaMailSender.setHost(emailConfig.getHost());
+			javaMailSender.setProtocol(emailConfig.getProtocol());
+			javaMailSender.setUsername(emailConfig.getUsername());
+			javaMailSender.setPassword(emailConfig.getPassword());
+			javaMailSender.setDefaultEncoding(emailConfig.getDefaultEncoding());
+			Properties properties = new Properties();
+			properties.setProperty("properties.mail.smtp.auth", "true");
+			properties.setProperty("properties.mail.smtp.port", emailConfig.getPort().toString());
+			properties.setProperty("properties.mail.smtp.starttls.enable", "true");
+			properties.setProperty("properties.mail.smtp.starttls.required", "true");
+			properties.setProperty("properties.mail.smtp.ssl.enable", "true");
+			javaMailSender.setJavaMailProperties(properties);
+			senders.add(javaMailSender);
+		});
+	}
+
+	public JavaMailSenderImpl getJavaEmailServer() {
+		if (senders.isEmpty()) {
+			String key = "reEmailSenders";
+			if (redisService.setNx(key, "reEmailSenders", 30l)) {
+				if (senders.isEmpty()) {
+					init();
+					redisService.del(key);
+				}
+			} else {
+				if (senders.isEmpty()) {
+					throw BusinessRuntimeException.getInstance("系统超时,请重新获取邮箱验证码..");
+				}
+			}
+		}
+		int i = ThreadLocalRandom.current().nextInt(senders.size());
+		return senders.get(i);
+	}
+
+	public Boolean retry(SimpleMailMessage message) {
+		for (JavaMailSenderImpl sender : senders) {
+			if (!StrUtil.equals(sender.getUsername(), message.getFrom())) {
+				try {
+					message.setFrom(sender.getUsername());
+					sender.send(message);
+					return true;
+				} catch (Exception e) {
+				}
+			}
+		}
+		return false;
+	}
+}