|
|
@@ -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();
|