Forráskód Böngészése

发送短信或邮件

lyhzzz 5 hónapja
szülő
commit
a0da67aa22

+ 5 - 0
README.md

@@ -58,4 +58,9 @@
 2.新增用户管理
 3.新增本地授权管理
 文档地址:http://120.25.146.52:3090/project/281/interface/api/cat_2079
+
+nacos配置:
+agent:
+  sms:
+    template-code: abc
 ~~~~

+ 7 - 0
pom.xml

@@ -36,6 +36,13 @@
             <version>3.0.0-SNAPSHOT</version>
         </dependency>
 
+
+        <dependency>
+            <groupId>com.fdkankan</groupId>
+            <artifactId>4dkankan-utils-sms</artifactId>
+            <version>5.0.0-SNAPSHOT</version>
+        </dependency>
+
         <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>

+ 9 - 0
src/main/java/com/fdkankan/agent/common/util/DateUtils.java

@@ -2,6 +2,8 @@ package com.fdkankan.agent.common.util;
 
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.GregorianCalendar;
@@ -29,4 +31,11 @@ public class DateUtils {
         return date;
 
     }
+
+    public static String getPlusDay(Integer i) {
+        LocalDate dateAfter7Days = LocalDate.now().plusDays(i);
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        return dateAfter7Days.format(formatter);
+    }
+
 }

+ 19 - 0
src/main/java/com/fdkankan/agent/config/AgentConfig.java

@@ -0,0 +1,19 @@
+package com.fdkankan.agent.config;
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@RefreshScope
+@Data
+public class AgentConfig {
+
+    @Value("${spring.profiles.active}")
+    private String active;
+
+    @Value("${agent.sms.template-code}")
+    private String smsTemplateCode;
+
+}

+ 90 - 0
src/main/java/com/fdkankan/agent/entity/MailTemplate.java

@@ -0,0 +1,90 @@
+package com.fdkankan.agent.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2025-03-20
+ */
+@Getter
+@Setter
+@TableName("t_mail_template")
+public class MailTemplate implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 发件人邮箱
+     */
+    @TableField("send_mail")
+    private String sendMail;
+
+    /**
+     * 发件人邮箱密码
+     */
+    @TableField("send_password")
+    private String sendPassword;
+
+    /**
+     * 发件人主机
+     */
+    @TableField("send_host")
+    private String sendHost;
+
+    /**
+     * 收件主题
+     */
+    @TableField("subject")
+    private String subject;
+
+    /**
+     * 邮件内容
+     */
+    @TableField("msg")
+    private String msg;
+
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 备注
+     */
+    @TableField("remark")
+    private String remark;
+
+    /**
+     * 0订单发票,1深时演示场景,2验证码,3权益会员过期
+     */
+    @TableField("type")
+    private Integer type;
+
+    /**
+     * zh 中文,en英文
+     */
+    @TableField("lang")
+    private String lang;
+
+
+}

+ 1 - 1
src/main/java/com/fdkankan/agent/generate/AutoGenerate.java

@@ -18,7 +18,7 @@ public class AutoGenerate {
         String path =System.getProperty("user.dir") ;
 
         generate(path,"agent", getTables(new String[]{
-                "t_increment_use_type"
+                "t_mail_template"
         }));
 
 //        generate(path,"goods", getTables(new String[]{

+ 18 - 0
src/main/java/com/fdkankan/agent/mapper/IMailTemplateMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.agent.mapper;
+
+import com.fdkankan.agent.entity.MailTemplate;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2025-03-20
+ */
+@Mapper
+public interface IMailTemplateMapper extends BaseMapper<MailTemplate> {
+
+}

+ 2 - 0
src/main/java/com/fdkankan/agent/service/IAgentAuthorizeModelingService.java

@@ -17,4 +17,6 @@ public interface IAgentAuthorizeModelingService extends IService<AgentAuthorizeM
     Object pageList(AuthorizeParam param);
 
     Object addOrUpdate(AgentAuthorizeModeling param);
+
+    void checkExpTime();
 }

+ 19 - 0
src/main/java/com/fdkankan/agent/service/IMailTemplateService.java

@@ -0,0 +1,19 @@
+package com.fdkankan.agent.service;
+
+import com.fdkankan.agent.entity.MailTemplate;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2025-03-20
+ */
+public interface IMailTemplateService extends IService<MailTemplate> {
+
+    Boolean sendMail(String email, MailTemplate emailTemplate, String file);
+
+    void sendAuthExpMail(String userName);
+}

+ 29 - 4
src/main/java/com/fdkankan/agent/service/impl/AgentAuthorizeModelingServiceImpl.java

@@ -1,24 +1,27 @@
 package com.fdkankan.agent.service.impl;
 
+import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fdkankan.agent.common.PageInfo;
+import com.fdkankan.agent.common.util.DateUtils;
 import com.fdkankan.agent.entity.AgentAuthorizeModeling;
 import com.fdkankan.agent.entity.AgentNew;
 import com.fdkankan.agent.entity.IncrementUseType;
 import com.fdkankan.agent.entity.User;
 import com.fdkankan.agent.mapper.IAgentAuthorizeModelingMapper;
 import com.fdkankan.agent.request.AuthorizeParam;
-import com.fdkankan.agent.service.IAgentAuthorizeModelingService;
+import com.fdkankan.agent.service.*;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.fdkankan.agent.service.IAgentNewService;
-import com.fdkankan.agent.service.IIncrementUseTypeService;
-import com.fdkankan.agent.service.IUserService;
+import com.fdkankan.common.util.DataUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -84,4 +87,26 @@ public class AgentAuthorizeModelingServiceImpl extends ServiceImpl<IAgentAuthori
         this.saveOrUpdate(param);
         return  param;
     }
+
+    @Autowired
+    IMailTemplateService mailTemplateService;
+
+    @Override
+    public void checkExpTime() {
+        LambdaQueryWrapper<AgentAuthorizeModeling> wrapper = new LambdaQueryWrapper<>();
+        wrapper.isNotNull(AgentAuthorizeModeling::getAuthorizeEndTime);
+        wrapper.eq(AgentAuthorizeModeling::getAuthorizeEndTime,DateUtils.getPlusDay(7));
+        List<AgentAuthorizeModeling> list = this.list(wrapper);
+        HashSet<Integer> agentIds = new HashSet<>();
+        for (AgentAuthorizeModeling agentAuthorizeModeling : list) {
+            if(agentAuthorizeModeling.getAgentId() != null){
+                agentIds.add( agentAuthorizeModeling.getAgentId());
+            }
+        }
+
+        List<AgentNew> agentNews = agentNewService.listByIds(agentIds);
+        for (AgentNew agentNew : agentNews) {
+            mailTemplateService.sendAuthExpMail(agentNew.getUserName());
+        }
+    }
 }

+ 63 - 0
src/main/java/com/fdkankan/agent/service/impl/MailTemplateServiceImpl.java

@@ -0,0 +1,63 @@
+package com.fdkankan.agent.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.agent.common.ResultCode;
+import com.fdkankan.agent.config.AgentConfig;
+import com.fdkankan.agent.entity.MailTemplate;
+import com.fdkankan.agent.exception.BusinessException;
+import com.fdkankan.agent.mapper.IMailTemplateMapper;
+import com.fdkankan.agent.service.IMailTemplateService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.agent.util.SendMailUtils;
+import com.fdkankan.sms.SmsService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2025-03-20
+ */
+@Service
+@Slf4j
+public class MailTemplateServiceImpl extends ServiceImpl<IMailTemplateMapper, MailTemplate> implements IMailTemplateService {
+
+    @Autowired
+    AgentConfig agentConfig;
+    @Autowired
+    SmsService smsService;
+    @Override
+    public Boolean sendMail(String email , MailTemplate mailTemplate, String file) {
+        if(mailTemplate == null){
+            throw new BusinessException(ResultCode.ERROR);
+        }
+        return SendMailUtils.sendMail(mailTemplate.getSendMail(), mailTemplate.getSendPassword(), mailTemplate.getSendHost(),
+                email, mailTemplate.getSubject(), mailTemplate.getMsg(), file);
+    }
+
+    @Override
+    public void sendAuthExpMail(String userName) {
+        try {
+            if(agentConfig.getActive().contains("eur")){
+                sendMail(userName,this.getTemplate(11),null);
+            }else {
+                smsService.sendSms(userName, "", agentConfig.getSmsTemplateCode());
+            }
+        }catch (Exception e){
+            log.info("发送邮件或短信失败:{}",userName);
+        }
+
+    }
+
+
+    public MailTemplate getTemplate(Integer type) {
+        LambdaQueryWrapper<MailTemplate> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(MailTemplate::getType,type);
+        return this.getOne(wrapper);
+    }
+}

+ 20 - 0
src/main/java/com/fdkankan/agent/task/TaskService.java

@@ -0,0 +1,20 @@
+package com.fdkankan.agent.task;
+
+import com.fdkankan.agent.service.IAgentAuthorizeModelingService;
+import com.fdkankan.agent.service.IMailTemplateService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+
+@Service
+public class TaskService {
+
+
+    @Autowired
+    IAgentAuthorizeModelingService agentAuthorizeModelingService;
+
+    @Scheduled(cron = "0 0 11 * * ?")
+    public void task(){
+        agentAuthorizeModelingService.checkExpTime();
+    }
+}

+ 95 - 0
src/main/java/com/fdkankan/agent/util/SendMailUtils.java

@@ -0,0 +1,95 @@
+package com.fdkankan.agent.util;
+
+import com.sun.mail.util.MailSSLSocketFactory;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.activation.DataHandler;
+import javax.activation.DataSource;
+import javax.activation.FileDataSource;
+import javax.mail.*;
+import javax.mail.internet.*;
+import java.util.Properties;
+
+/**
+ * Created by Hb_zzZ on 2020/3/16.
+ */
+public class SendMailUtils {
+
+
+    /**
+     * 发送带附件的邮件
+     * @param  from      发件人
+     * @param  pass      发件人密码
+     * @param  host      发件人主机
+     * @param receive    收件人
+     * @param subject    邮件主题
+     * @param msg        邮件内容
+     * @param filename   附件地址
+     *
+     */
+    public static boolean sendMail(String from,String pass,String host,
+                                   String receive, String subject, String msg, String filename) {
+        if (StringUtils.isEmpty(receive)) {
+            return false;
+        }
+        try {
+            // 获取系统属性
+            Properties properties = System.getProperties();
+            // 设置邮件服务器
+            properties.setProperty("mail.smtp.host", host);
+            properties.setProperty("mail.debug", "true");
+            properties.put("mail.smtp.auth", "true");
+            MailSSLSocketFactory sf = new MailSSLSocketFactory();
+            sf.setTrustAllHosts(true);
+            properties.put("mail.smtp.ssl.enable", "true");
+            properties.put("mail.smtp.ssl.socketFactory", sf);
+            // 获取默认session对象
+            Session session = Session.getDefaultInstance(properties, new Authenticator() {
+                public PasswordAuthentication getPasswordAuthentication() { // qq邮箱服务器账户、第三方登录授权码
+                    return new PasswordAuthentication(from, pass); // 发件人邮件用户名、密码
+                }
+            });
+            // 创建默认的 MimeMessage 对象
+            MimeMessage message = new MimeMessage(session);
+            // Set From: 头部头字段
+            message.setFrom(new InternetAddress(from));
+            // Set To: 头部头字段
+            message.addRecipient(Message.RecipientType.TO, new InternetAddress(receive));
+            // Set Subject: 主题文字
+            message.setSubject(subject);
+            // 创建消息部分
+            BodyPart messageBodyPart = new MimeBodyPart();
+            // 消息
+            messageBodyPart.setText(msg);
+            // 创建多重消息
+            MimeMultipart multipart = new MimeMultipart("mixed");
+
+            if(StringUtils.isNotEmpty(filename)){
+                // 附件部分
+                messageBodyPart = new MimeBodyPart();
+                // 设置要发送附件的文件路径
+                DataSource source = new FileDataSource(filename);
+                messageBodyPart.setDataHandler(new DataHandler(source));
+                // messageBodyPart.setFileName(filename);
+                // 处理附件名称中文(附带文件路径)乱码问题
+                messageBodyPart.setFileName(MimeUtility.encodeText(filename));
+                multipart.addBodyPart(messageBodyPart);
+            }
+            //html代码部分
+            MimeBodyPart htmlPart = new MimeBodyPart();
+            multipart.addBodyPart(htmlPart);
+            //html代码
+            htmlPart.setContent(msg, "text/html;charset=utf-8");
+            // 发送完整消息
+            message.setContent(multipart);
+            // 发送消息
+            Transport.send(message, new  Address[]{new InternetAddress(receive)});
+            // System.out.println("Sent message successfully....");
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return false;
+    }
+
+}

+ 3 - 0
src/main/resources/bootstrap-dev.yml

@@ -25,6 +25,9 @@ spring:
             group: DEFAULT_GROUP
             refresh: true
 
+          - data-id: sms-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
       discovery:
         server-addr: ${spring.cloud.nacos.config.server-addr}
         namespace: ${spring.cloud.nacos.config.namespace}

+ 4 - 0
src/main/resources/bootstrap-prod-eur.yml

@@ -24,6 +24,10 @@ spring:
           - data-id: common-rabbitmq-config.yaml
             group: DEFAULT_GROUP
             refresh: true
+
+          - data-id: sms-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
       discovery:
         server-addr: ${spring.cloud.nacos.config.server-addr}
         namespace: ${spring.cloud.nacos.config.namespace}

+ 4 - 0
src/main/resources/bootstrap-prod.yml

@@ -24,6 +24,10 @@ spring:
           - data-id: common-rabbitmq-config.yaml
             group: DEFAULT_GROUP
             refresh: true
+
+          - data-id: sms-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
       discovery:
         server-addr: ${spring.cloud.nacos.config.server-addr}
         namespace: ${spring.cloud.nacos.config.namespace}

+ 3 - 0
src/main/resources/bootstrap-test-eur.yml

@@ -25,6 +25,9 @@ spring:
             group: DEFAULT_GROUP
             refresh: true
 
+          - data-id: sms-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
       discovery:
         server-addr: ${spring.cloud.nacos.config.server-addr}
         namespace: ${spring.cloud.nacos.config.namespace}

+ 4 - 0
src/main/resources/bootstrap-test.yml

@@ -24,6 +24,10 @@ spring:
           - data-id: common-rabbitmq-config.yaml
             group: DEFAULT_GROUP
             refresh: true
+
+          - data-id: sms-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
       discovery:
         server-addr: ${spring.cloud.nacos.config.server-addr}
         namespace: ${spring.cloud.nacos.config.namespace}

+ 5 - 0
src/main/resources/mapper/agent/MailTemplateMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.agent.mapper.IMailTemplateMapper">
+
+</mapper>