Ver Fonte

fix 课程邮件交付

zoujiajian há 3 anos atrás
pai
commit
a3e8e30be3

+ 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> {
+}

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

@@ -0,0 +1,24 @@
+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;
+
+	private Integer type;
+}

+ 82 - 2
netflix-service/src/main/java/com/cyksj/service/mail/impl/MailServiceImpl.java

@@ -5,9 +5,11 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
 import com.cyksj.common.util.StringUtil;
+import com.cyksj.mapper.EmailConfigMapper;
 import com.cyksj.mapper.GoodsCoursewareFileMapper;
 import com.cyksj.mapper.GroupsRelationMapper;
 import com.cyksj.mapper.OrderDonMapper;
+import com.cyksj.model.entity.EmailConfig;
 import com.cyksj.model.entity.GoodsCoursewareFile;
 import com.cyksj.model.entity.GroupsRelation;
 import com.cyksj.model.entity.OrderDon;
@@ -19,13 +21,18 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.mail.MailException;
 import org.springframework.mail.SimpleMailMessage;
 import org.springframework.mail.javamail.JavaMailSender;
+import org.springframework.mail.javamail.JavaMailSenderImpl;
 import org.springframework.mail.javamail.MimeMessageHelper;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.PostConstruct;
 import javax.mail.internet.MimeMessage;
 import javax.mail.internet.MimeUtility;
 import java.io.File;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Properties;
+import java.util.concurrent.ThreadLocalRandom;
 
 /*
  *项目名: netflix
@@ -52,8 +59,41 @@ public class MailServiceImpl implements MailService {
 
 	private final OrderDonMapper orderDonMapper;
 
+	private final EmailConfigMapper emailConfigMapper;
+
+	private static List<JavaMailSenderImpl> senders;
+
 	private static String IMG_HTML = "<p><img src='%s' width=200></p>";
 
+	/**
+	 * 获取邮箱客户端
+	 */
+	@PostConstruct
+	public void init() {
+		List<EmailConfig> emailConfigs = emailConfigMapper.selectList(null);
+		senders = new ArrayList<>(emailConfigs.size());
+		emailConfigs.forEach(emailConfig->{
+			//过滤163邮箱
+			if (emailConfig.getType() == 1) {
+				return;
+			}
+			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);
+		});
+	}
+
 	@Override
 	public String sendLoginCodeEmailToPeople(Integer digit, String toAddress) {
 		// 生成验证码
@@ -122,12 +162,13 @@ public class MailServiceImpl implements MailService {
 		}
 		helper.setSubject(subject.toString());
 		helper.setText(sb.toString(), true);
-		helper.setFrom(from);
 		helper.setTo(email);
 		TASK_EXECUTOR.execute(() -> {
 			try {
+				JavaMailSenderImpl sender = getJavaEmailServer();
+				helper.setFrom(sender.getUsername());
 				log.info("开始给用户userId:{},relationId:{} 发送课程:{}专属课件", userId, relationId, goodsTitle);
-				mailSender.send(msg);
+				sendMsgIfFailRetry(sender, msg);
 			} catch (Exception e) {
 				log.info("发送课件失败,error:{}", StringUtil.getErrorText(e));
 				groupsRelationMapper.update(null, Wrappers.lambdaUpdate(GroupsRelation.class)
@@ -144,6 +185,45 @@ public class MailServiceImpl implements MailService {
 		});
 	}
 
+	private void sendMsgIfFailRetry(JavaMailSenderImpl sender, MimeMessage msg) {
+		try {
+			sender.send(msg);
+		} catch (Exception e) {
+			if (!retry(msg)) {
+				throw BusinessRuntimeException.getInstance("暂无可用邮件服务器");
+			}
+		}
+	}
+
+	public Boolean retry(MimeMessage msg) {
+		for (JavaMailSenderImpl retry : senders) {
+			try {
+				msg.setFrom(retry.getUsername());
+				retry.send(msg);
+				return true;
+			} catch (Exception e2) {
+			}
+		}
+		return false;
+	}
+
+	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 sendMail(String toAddress, String subject, String text) {
 		SimpleMailMessage msg = new SimpleMailMessage();