|
|
@@ -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;
|
|
|
+ }
|
|
|
+}
|